Ram Gandikota
/
ABCD
A metronome using the FRDM K64F board
Revision 0:a7a43371b306, committed 2017-05-14
- Comitter:
- ram54288
- Date:
- Sun May 14 18:40:18 2017 +0000
- Commit message:
- Initial commit
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LICENSE Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +Unless specifically indicated otherwise in a file, files are licensed +under the Apache 2.0 license, as can be found in: apache-2.0.txt \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/apache-2.0.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configs/eth_v4.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +{ + "macros": ["MBEDTLS_USER_CONFIG_FILE=\"mbedtls_mbed_client_config.h\""], + "target_overrides": { + "*": { + "target.features_add": ["LWIP", "COMMON_PAL"], + "lwip.ipv4-enabled": true, + "lwip.ipv6-enabled": false, + "mbed-trace.enable": 0 + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/easy-connect.git/#a913964341394430cd3997c6f2950f93ba1d75c8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +d827cdb1c3fb5a419b721646a2e1fc49fbd3fdf0 branch 'master' of https://github.com/ARMmbed/easy-connect +0e924fc9504c5fc4425adf30f7ad85a9fe0bf4fd not-for-merge branch 'esp8266-latest' of https://github.com/ARMmbed/easy-connect +723542653307ea78efb2d8b91fc1f69e6d567574 not-for-merge branch 'mbed-client' of https://github.com/ARMmbed/easy-connect +e61ba698f31f71693451e91f68bb2035706695b7 not-for-merge branch 'mbedos5.3.4' of https://github.com/ARMmbed/easy-connect +0c77697463c204aa53467a8b7c6286c31b973792 not-for-merge branch 'odin' of https://github.com/ARMmbed/easy-connect +d3503403331d10000e1d061fe189c17f215d4e89 not-for-merge branch 'revert-mts' of https://github.com/ARMmbed/easy-connect
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +a913964341394430cd3997c6f2950f93ba1d75c8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/easy-connect.git/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file easy-connect/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,28 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores +atmel-rf-driver +esp8266-driver +mcr20a-rf-driver \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 a913964341394430cd3997c6f2950f93ba1d75c8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198968 +0000 clone: from https://github.com/ARMmbed/easy-connect.git/ +a913964341394430cd3997c6f2950f93ba1d75c8 a913964341394430cd3997c6f2950f93ba1d75c8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198969 +0000 checkout: moving from master to a913964341394430cd3997c6f2950f93ba1d75c8 +a913964341394430cd3997c6f2950f93ba1d75c8 a913964341394430cd3997c6f2950f93ba1d75c8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198969 +0000 checkout: moving from a913964341394430cd3997c6f2950f93ba1d75c8 to master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 a913964341394430cd3997c6f2950f93ba1d75c8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198968 +0000 clone: from https://github.com/ARMmbed/easy-connect.git/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 a913964341394430cd3997c6f2950f93ba1d75c8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198968 +0000 clone: from https://github.com/ARMmbed/easy-connect.git/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/logs/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +a913964341394430cd3997c6f2950f93ba1d75c8 d827cdb1c3fb5a419b721646a2e1fc49fbd3fdf0 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787112 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/logs/refs/remotes/origin/revert-mts Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d3503403331d10000e1d061fe189c17f215d4e89 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787112 +0000 fetch --append origin: storing head
Binary file easy-connect/.git/objects/08/9aa4faf066ddefa6bc0d01299ed49bd71084d1 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/0c/5ae545f0b266388e47de8bd706c786d485c072 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x}MKÅ0E]÷W¸Ö&mxÈs¥AܹÌǤ¯Ð65M÷ï-¨nï¹çÂuqY¦¢ÇAr\è¥'Ru/H¢ºÅN*GÄ^z1j3×Á:Æ ÁZJ¶Û65¡³í)üö m¯BÏGYö¨ôt%¼wEkÑQ°)ù¼Ç÷¼Õ3®qÜÌt.;§½Ycâm¾6ã/Å6..@R¡j©îP VGz<ÌàiÊÏÅÂéG;ÿ«U/FÌ3$þ(¼g¸%).ðøö²Xö÷eó&smòÂsBíÓôÉ©'[Ußþ°æ`_ÙÜtó \ No newline at end of file
Binary file easy-connect/.git/objects/0c/77697463c204aa53467a8b7c6286c31b973792 has changed
Binary file easy-connect/.git/objects/0d/c426db510ec4f4c73bc14a75a9de181dae6868 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/0e/924fc9504c5fc4425adf30f7ad85a9fe0bf4fd Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xKj1D½Ö)zobômÀo²ñ*|n}<c¬+9´È LQzPEÅVëÒA;µë[ÎÀÁX²(e2 +±8±7.DõK/í°"ñ¤-¯Ðp"LN T*'¬GmãS"Ô >· .´Â¥7nÂñNëý?oÇ!¶ze½vèL°ZJ1èxÙó»}q}exRsNðùý5iÄ´-¿cñ±°øoOÀ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/10/0eb67f6eeb7460798f95f873ddcae32a8351fb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x¥Î1nÃ0@ÑÎ:÷"iÑREP µâ@ sþ¸COÐõ ¿ì½¯óßl¨*J\¢h +O3.V®þêÝCÞ Z.¥x¯Ys¤¦ùg17ÊÒ<ç@ÍÉaßûj?à&?²{ø°_ì¾dô©ìý#À3{xGèN=WMÿqÇ£)uÝ.£]êX:¦mÍîSÙ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/15/3045d3887fcebc76e82914138658e28909cc27 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +xνj1àÔzíF?¶´BúT.\ïVÀw:tBòô¾@ÀÅßÀÀpç¦àcxÒ!çÛR|´RÌÿK¦9eD³ÒE!£+.$È9U; m¬"h)¤c2ô¥}À¥ßê+¼þÂË÷?ÓηMÜçWpGLx +6{x¶ÎZ³·ûKG÷æÜæõÖê×6:ø *eȶÁ¶ +·Ú´õÅÜ ÏUõ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/15/a293e5d2fffb7c16297ca58e726ad492b7bf34 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xKn!D³æ½·5¢ÈkïsqÆ20ÂØçÀ«R=©>©² PÁ|3h:HrÁ¨)kdÒµl½ñ#éd;õ\XòZ/¬¼EmsÈ\ÖmN8z¿ÖáLÎ^Ö +|_©^_æt)´Ý¾R+? M@çä\D1é|9ò»yñ»3£A¾ïaB÷Ùw%ß>ûú@¡¤®ûöÌ]ü'¾Y× \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/19/f6f960eb5519fcdb734d9a2e80410f647d04b5 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xuÍjÃ0{öS,ôXÒJÖÏÊJzj äÒ7XIkÇÁ²\EöíëôØËÀ7Ì0LÈ)¶wµ0CÎø`:átI3iÔ((FìWBÛ +Ïã¶ÓÚYBIÅ:êHIx´¬ ;ê³ylÑ5J dBǽo£óììmÇ6uCk=çGáçÁç`¡ùrÃhCNÏ ·}£]«¢ÙÜíUå¯c}[=ìç\x¾ÃXÏ«ÿ§Ö¸Ë:MPøcåk {)¡/ÛøËû)yO?²Ó¸½o_È×RZ&¾ù[y¢ÊÂæ¯ßnm \ No newline at end of file
Binary file easy-connect/.git/objects/1b/01547f94c5552694a1930da954b2b7e8da1b0e has changed
Binary file easy-connect/.git/objects/1b/44cc5b9087fa700d29a7f1db48931b6300c35e has changed
Binary file easy-connect/.git/objects/22/0970a75eb458de640e38c7e828b2ba8df91609 has changed
Binary file easy-connect/.git/objects/22/3ea913413d3ee6ffb996a57c1a3d0acf09ae61 has changed
Binary file easy-connect/.git/objects/24/58ef92c910d39adcf794d9b8a8e8f1f005ccf8 has changed
Binary file easy-connect/.git/objects/24/d353af5e8cdcaccc11029ab3e8434a197429fa has changed
Binary file easy-connect/.git/objects/25/b70564bc258cd7587f910879cb94645229170e has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/2f/55ecfeb118a73bf8bb60ab39e41056ea7c6d0f Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x½jÄ0Sû)Ô]8ô·!ô©S»«]Ûp¶O!OÔ)goáu§fsOm1 +}í!ev<°/MbÅ©ÄN©Ä¤Ýn²4Ó'L*¥jñ¹0¥=Rtr XüË+AQ´Þ*¤âzЪV j;¼·qÝÌçzÕÁ¼Kû6/ûCéo·væu~5.æͳuÖv{¼jò¾Dç/¾ûmC.<Ó·£ëd¦¥æwy¿ìt¦6Þ©ûÏÜd~ \ No newline at end of file
Binary file easy-connect/.git/objects/30/1381a684281af9da36a455d57477d9a390a445 has changed
Binary file easy-connect/.git/objects/32/57c0301a578f652c3b0657cbdcf0250cdc5e9c has changed
Binary file easy-connect/.git/objects/34/54ed73977760f2225f2b0b270ef1dbaf4803d7 has changed
Binary file easy-connect/.git/objects/37/93db5dfd5198501ebc68ecc7f0504a349f94a5 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/39/5e3cd97d052c82c51bd63616ea0c4085f45b8b Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +xuÍNÃ09ç)VâZìø/*Ô\8çâµw[¤1COO)âÈe¤o43ÒiS¥ÕU-DÀÆFk4¤Q m/IEdìµã&ûBÇ +ÑtºE +8*+ظ^Zo:Ææ´aù¡ÀRvÞ)äÑ +ª'- ±ä]°Qpãz +<QÎ<û7?L°h]/´õe\i¼©»^K-ûnD+Dsvϧ*¸OõaAاByøÜîS=,øOy¤²'ÈË0@¡÷ æ +×Òi¤úuº½èî»ß¡¦yÉÑW×¹«9§ª\^Å>¨¬¯ßlp+ \ No newline at end of file
Binary file easy-connect/.git/objects/3a/1c91cf64d117ae96314093920547c11ed4d383 has changed
Binary file easy-connect/.git/objects/3a/5abc3fe130697448aca19177aa3f16f7004c62 has changed
Binary file easy-connect/.git/objects/3b/a9f999525e8f002c7cf5287ecae64a0aeec4e1 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/3e/fe7f33ae0768cec61cd9d6548100ffb4410a72 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xKj1D³Ö)zoZÿBð6C®Ðz>öHÆrÎï øÙ¼U©2wP.¼õ>£6h+³£@=+3xÌ"&Ù¨P¬´qí³2MDëDÉÁ³Q« q3yÊIУOm3U8·:ÆÖ +|^©^_pÍË{jå¤ñ28tA¢ØÛ}eçÿúâB7ï_süK÷V¸Os¡O´®pÚcÉ9-û3ñÄXVÞ \ No newline at end of file
Binary file easy-connect/.git/objects/42/4ae3367662881a6b866594e66388dfbe52d0bb has changed
Binary file easy-connect/.git/objects/43/f40bcc5c52a70f4103a1bacd35f7174fdac8f7 has changed
Binary file easy-connect/.git/objects/45/cfc786f2e75ef5309c2854805d6d2ce80099a8 has changed
Binary file easy-connect/.git/objects/49/1a3bac7f0f38ea74c31da2aa2526caee85b279 has changed
Binary file easy-connect/.git/objects/4a/b5b17c065d256e2debf9d2e3b637e87d70026e has changed
Binary file easy-connect/.git/objects/4f/9a5e30a4f3874754a919746b617c053e8b4d92 has changed
Binary file easy-connect/.git/objects/4f/c50217275c7fba4d8fd73bce2c8b3ea0b361a3 has changed
Binary file easy-connect/.git/objects/53/8e08c93dcc43b769d6a726f9072ace0aeb8bd4 has changed
Binary file easy-connect/.git/objects/53/8fa834d808c87aafad8d80127152d3239a31dc has changed
Binary file easy-connect/.git/objects/57/4b1793787ca4916a0c612b5ddef4e15489288a has changed
Binary file easy-connect/.git/objects/57/cea69ad98a66e7ef1417aea9335b2f00d71116 has changed
Binary file easy-connect/.git/objects/58/199de353107a70a092c3d7149f408a3a188e3a has changed
Binary file easy-connect/.git/objects/59/3b4d82760aae5f2917c5ffbcb402dff05271e5 has changed
Binary file easy-connect/.git/objects/5a/733bd2750342660d9021bfc9b3583ca8c62668 has changed
Binary file easy-connect/.git/objects/5b/9cb8cea4a11b0ab974c991b527c9b79fceae75 has changed
Binary file easy-connect/.git/objects/5d/3d0e811967c9c6f33a710aa076e8b8b77defcf has changed
Binary file easy-connect/.git/objects/5e/4887274fd6836189c01b70e285f277611f5f3d has changed
Binary file easy-connect/.git/objects/5f/c4e89a168cfc9f6206f2429cb7b231c77cd921 has changed
Binary file easy-connect/.git/objects/61/9c1c17362546bdf3353a800c11f233a7b72667 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/63/bda56ba519dff1fbe82947624c4c4bada62a9d Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x;n1Sëì \R®]ûÄuÖ°VÆZÉù"'HùxÉÖµY÷ÑwU¨£ Ä$V +/Î/J婸à-§ìºupS¡à-y%"MiÉ1±9ËýÀ³þÝv¸È¶ÝRk>ï²ÝÿÆùVe}r«_0Ù@;öHfÐQÙõ¿sm ¯ç<Je_¨ÊkøÌ+M5 \ No newline at end of file
Binary file easy-connect/.git/objects/65/c1fe57bc7dee14b2ce5a2a4976a65b897840a4 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/67/2acbfe9df9289ca9fb342ab410b8d5493c5b3a Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xAjÃ0E»Ö)f_#YcÉÐ%¡iéÒÇ£$PYÁV(ôôÕ¢'èêó><xSº0{(ëccñ±ÕâÓP¡më-r§na¹@§'n # ÑK#MãI;8NV {¹ä>óW<ù;)?ðôý±âËZ6Ó´õÞ;cÑÀ#jDUßZY俾úXRà%Ãéxèßúw=Ô^÷Çþù°è±ÆÝ®3¤<ê£TÙ \ No newline at end of file
Binary file easy-connect/.git/objects/67/d50bbba064b284ec7710e217f0f689c4ed1d78 has changed
Binary file easy-connect/.git/objects/67/db7cbdf804b235c8d3dc51ad5663de67de16ac has changed
Binary file easy-connect/.git/objects/68/ee82789079b8a48165e7e6e5066b5d1005eed3 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/6e/09ffca24c3167f6f723c486d8f1081812cc556 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x»j1Së+no0ÒjW0&ðvú>$[&ZEùÿlá/pwf`àp«µtlüèkJÀÉ1 À£x6& ¤5kæ3¡wÛÄSO\ÓÒ)ZÉDÔèE7#odð&#Á ýÞVq¹-7jÂáËã·åwÏÁa°&ÚÁNÕf·=½Û«\¿Îø)ßø^êÒM \ No newline at end of file
Binary file easy-connect/.git/objects/6f/b5842becaefd360f57916a587b5a0ffdc45ff0 has changed
Binary file easy-connect/.git/objects/70/e399a0adb32a4e02d3f2056fe7d9ae31d57642 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/72/3542653307ea78efb2d8b91fc1f69e6d567574 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xUANÃ0EY糧*N<m ¡¢JªîXNìiã&¶«Ôp"nÂÅ¥ÿIÿiæ»c(ÐhuS&fðµQSVt^{B&Ô¨y¯ì¤@ÕZ'}u¢Sg¸±¦5ZÈZ2zôDÚknI[ÚKÓVôQú<ÁRbx á<ñûî¿`9üZÑ.Ǩg§B#,¨ ¨f:_ZøâMN.çx¯auÆýF©k¿ÚqÌg?׳àe{÷ö¸^@Hó¥gØ=Áöù½úáÉW \ No newline at end of file
Binary file easy-connect/.git/objects/73/2661d17a0fae8c97f0be83b806fee80a3747ea has changed
Binary file easy-connect/.git/objects/7a/3ee2bd184ca8dc4d8c49a4522b41a7b89f8d66 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/81/9375ab99e86e6efad0037fb9cff4e6af7223a8 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xÁ10Pæ¢skHbËtëX¸A +¡çç½´lé©¡JÙÏÑo.ÓÞã¶Òwè×#»:óÕâ%fÇÁ,¢P?sn5À±GAºØ<nb \ No newline at end of file
Binary file easy-connect/.git/objects/83/d2cd6dc0dd26e72cda79e89b289b29a66c7988 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/84/1ff5b5ec24ff027d27a6310cedfb6155556544 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x»jÃ@E]ïWLo0;Ù`»O¥ëÙÝ-,#¯ äë£B?êr.8e¦±AG~×UÈ9sÞb¬(©°vJ"jE§æ)>HBJ×a&[*¥ºäì(ÖàJ4òn÷yëü=Üäq¶_8þlxÈ+^íPæéc@Gì-ZkÖwlú/ßù7ßk þëúç¸ ÍÕÛJ% \ No newline at end of file
Binary file easy-connect/.git/objects/86/e02b59351d6a9a0d7e24bf4f70d3ab0f4c5b20 has changed
Binary file easy-connect/.git/objects/89/60c27a28435820cca76958a2d83008022b0a3d has changed
Binary file easy-connect/.git/objects/89/a75a6da3be993d2e5aa3c7d0319cd6fab45824 has changed
Binary file easy-connect/.git/objects/91/1f2ef98edaac9b09407b5c318591a923d1a784 has changed
Binary file easy-connect/.git/objects/91/dc650f5ab8eaf00b5aca3385e5c9ede505cfd4 has changed
Binary file easy-connect/.git/objects/93/1a0a5600917e7417b35ac2e4f25943fb930b98 has changed
Binary file easy-connect/.git/objects/93/8f7f2f726027ab3fda9c83e6934898816a0579 has changed
Binary file easy-connect/.git/objects/9d/233c35352ff61aa11ad4c818e901e0306934e0 has changed
Binary file easy-connect/.git/objects/9f/567936d77b8c2bbd7ea5098c468d8f3358d310 has changed
Binary file easy-connect/.git/objects/a0/45def3617364e04e5654c512d863108ee699f0 has changed
Binary file easy-connect/.git/objects/a2/483c9ba7dcaefc56b311488e530f376dfcc521 has changed
Binary file easy-connect/.git/objects/a8/31423401dcec34451fc60dd3cb52d4b6bc210e has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/a9/13964341394430cd3997c6f2950f93ba1d75c8 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xuËjÃ0E»öW̾PFòè!¤6ÐMÿ@²Æ¶B$!/ú÷õ¢ÛîÎ=páL5çÔAú¥7fAoR6²&äÑN´AoãìF7<}ãÒA¸YÏN#¥vb0#Eç%[$³&üÖ×ÚàæÜjYBw_îã´doSÍGdµ";WÃn÷ÊÎ ®©l¥6~>~NKêëþ¹ %Z è+Ã÷åýüuùJ \ No newline at end of file
Binary file easy-connect/.git/objects/ab/96de702ba89e0ca322756726404ea6f96558e4 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/ae/123517e7c3743ef983ad88f9da3d7808930da2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,7 @@ +xVaoÚH½ÏþSP¯NÕ8k¹('lÔà 4ÚjåØk¼ãE»&UTå¿ß¬½8&@Jt±@ï¼7of¹Nù5´:ÿh²8hz}Ò¿p]§?!gM°nM é"¢Ð]ÓÈJáSÁø"/róÒ?|}øå}Ý;6ªlÎäÌñ\gú:¬"WÃÁ8þø¨Ýé¨`»ÿ_\{.qm¿V#3Ïéám¼Þ#atêتéÇÑ®.¼ÏdèNoÐë;pru´Z5åTÄAHÊ0¥i5«~ØÎéå'ãñ9 rnn> dÙñ¶F +±ISI_ +¬ÈE,FÑhºlËöÕ%Ë*2¯hæ<¾ 4O +þ»á¬¶|¥ß5h7ȸÌðfû«Iqíê&̨|6x9UÏC$Ñ\lZ +Á4\!Ï2æìåwÈ-OxaÂ%Í,§4(7ø\̦jû}¶JiÝé¾Ã_P;HùÜúWòLI)¨9Ö,Qg\P`þ9ãÙÕ@Bº÷ÚäÆÁL&?HAP)Ê6½e! ~IiÔ¶ù÷ÅñH϶=Ç÷¡ò`Þ=8æÌÒåra^òY÷Cçè½b ¦ùE!%b~kwZwãVÔêâ¯Ãîv·Ûný¨@˲ÝRÕªYo ¿#¬yÍy +)L©ä»¿e5ëçuHÕ'<Ò:.Æ[Ë®¹C¥ë ìâFì¶+v¥àñY§·¤¥b¥[s°±Ùøæ`aºm?àR²l +WlÀÀÔ®µßÅ÷¬~ N«ëÉ:J³¡2YV=Á}FY+-q9[¬Ñ÷ö6s÷|mÜÖ,7ý'"<Ãc*/SÿO=~·yRéðd5¥cãº|©}º#4Ä:Uò=WÇwë¹rÞUªÞÕk#ûTó§z¶kEhl8ÄzAïf¼HÓ»Çúc}Ê´´<·/â®$Ðë,K×ëèUÁáÝcë¨-jIJá/Dîåùy¹Çeè)P_¾Þ²9Q®´¶YûÿLiNôè\f _¥×zg~[øp\½_^K]å2Ï ýÛ¼øv}H½¥Åi¹Ö=6îÕß!5o¦Mÿbw£ \ No newline at end of file
Binary file easy-connect/.git/objects/ae/9cc8adaa8fbb00061c04cd3c24055043c0489b has changed
Binary file easy-connect/.git/objects/b9/34a4600d3166ffc8b7359c3d5478b07040701a has changed
Binary file easy-connect/.git/objects/bb/44bf51b776018d2ae3ea4e2e3aa380eed15e31 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/c2/b63f8793187dfd8e4264149540e21fccb12b9a Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x1!E9Åô&fYXclµ²² AÝ z~·ðÿ½¼äÇVÊ£±´éx#§É&Al68¸,>«ÓàõâEj+«ÈÖ² wcètL!¹FóD¤½Qüî÷¶À+[½MØÏ\çß8Þ +?»ØÊ4yä`Qt}Ùåß^.WÚ:.R_tIÈ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/c8/e294486870313e4d4daa7d7a0b76e4a79af386 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xÁj1E»ÎW¼}A¼$ ¥¶*(´ÎÂåð2ó´IdÿßY.ºìò{.ܾ¤t© }xª#3¨(5îLoÕ©0k¢ý@ÃâN#ç +ì¤äËæZ;N£ Oõl=êWaGv%c) WÊ×ðzNt¹Íú^@ö¥RLtzYù¿{qàLáãm½êÞ÷nÙ4ݺm¼FìeÛ÷ÔòÇ8n7ÛßZ|{ÙY \ No newline at end of file
Binary file easy-connect/.git/objects/c9/352112681d09e7af0fc996552c7e7d1656edca has changed
Binary file easy-connect/.git/objects/cb/933fb19cda0a733a64d6b71d271fb6bdaf9e6d has changed
Binary file easy-connect/.git/objects/ce/6cb88c4d7c1a85d8b00c0ccf9fba76ccf5d7d6 has changed
Binary file easy-connect/.git/objects/ce/95fc4ab9f28413df4d1fa2e30c13d62c468d54 has changed
Binary file easy-connect/.git/objects/ce/a47621759ff67ffa4b191809c364943f9db1f3 has changed
Binary file easy-connect/.git/objects/d1/85bc59084cd7da4ea47470add793b304569c3d has changed
Binary file easy-connect/.git/objects/d2/6ab233dacac50f47ece4493b16311d45e1bb58 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/d3/503403331d10000e1d061fe189c17f215d4e89 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,5 @@ +xA +Â0D]ç·ü&M"ºu)^ M~µbI£ç·¨óafBNi¨Ð YÔ½nc«c¤©tF¦c¨ï2½¸ûÂc¶s·ÈR;cf)É*EºoÙFOl0^³ðzÉ~CÏ]Î 6W?^¿bwN~¸CN[ å°%IR +%¢é¼²ò¿yqä' +Ë}ê±3X +qº·;Á§æçOkñä_î \ No newline at end of file
Binary file easy-connect/.git/objects/d3/ab1936ef685518aeb35cf67e31465cffb25021 has changed
Binary file easy-connect/.git/objects/d5/964336e2d7f627d0706902ad22acbf00bdcc50 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/d8/27cdb1c3fb5a419b721646a2e1fc49fbd3fdf0 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xuÏMNÃ0`Ö9ÅHHlP©ÛIFªPË @)BBbk;ãÖ4që qnÂÅ H³úÞ{±]ÛúBÉ ÏiäBrQ¢Â9XhUZ®EÍ´u5<ëu¤@´¦²¤¥æÜ0m°Mn̨Tý\ªæ9«êÚºe¦ÒU;Ƶ®Êô¶]Á÷ûo>?`öò '»_ÐsÛÛµ§À%Êñ¸TpÌcÙ¨ãg"\ùt= .Rß¼Ï7>móÏ,[QÜôCÓ@¤×ö y.v-,W¡zêûI}H®ö!ËorZ®#x:»[?Ãúby«Å9.Ñãpý \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/dd/245e4b056ea2e4001e97e3bb329307e2da7adc Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xKj1³Ö)zo0jýBìU ,C«Õ3¶¤0È÷÷rìª +<îµ^Æ*´å)S,L2³Ù"ºÄ[=ÛÊÌì ªZ¥ Ð %{ÔÂnvmft=ME0a! )$E÷qé+©Á¹·%÷^áùFíö'¯K¥ë÷{}t§ GØi£µÚêörÈ÷êp¡¶|'Þ>Þ áë×Õ25N\ \ No newline at end of file
Binary file easy-connect/.git/objects/e2/c6d1de117c2917df101208c066337e50fde2e5 has changed
Binary file easy-connect/.git/objects/e3/8c0cbab2fadf0f00c34eef2b4e593cdfa0f9f6 has changed
Binary file easy-connect/.git/objects/e5/119192cfc8c687fec99ab9c9c9fe8dca954524 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/objects/e6/1ba698f31f71693451e91f68bb2035706695b7 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xKnÃ0»Ö)¸/RècS6PA¹)R©H2¥ç¯9A3À<¼ÔJÙx´o£«ÂD<³Éâ,~Fõ¢WñCÔ%J´Ö£ºÖ×2»5 Y!Nøè2#åUQ=ÇOëp¡ +V¯ÜZÏÕÛÎ×BÛý#µònZp1ÆÞ³Ööx9ô¿½ù~h½z>Iß~-ªúØøRæc·T¦ \ No newline at end of file
Binary file easy-connect/.git/objects/e7/925a2477ce8f61e73235ff25725b55046840c9 has changed
Binary file easy-connect/.git/objects/e8/b993a80e25977e8b2184415f6e8da1718c7a5e has changed
Binary file easy-connect/.git/objects/eb/4a7bf3c23d449dd8785d50d5c1b278dba089ab has changed
Binary file easy-connect/.git/objects/ef/6c33a08523753da6a63b2818aba5b7d7d46ca1 has changed
Binary file easy-connect/.git/objects/f3/ea4b4eadd9dac6af4406f0a3d59b7bba9bdb67 has changed
Binary file easy-connect/.git/objects/f5/6d654e0cc15325c291c707e0e13edbc1fb947f has changed
Binary file easy-connect/.git/objects/f7/7df055e7907a3d9d3c4d77a578c0980d6b1466 has changed
Binary file easy-connect/.git/objects/fb/cc0ac33e944eb71feb80a1c40bf1baf5b2b61f has changed
Binary file easy-connect/.git/objects/fb/eec5274508773d0f37c6893e794accf39e32f1 has changed
Binary file easy-connect/.git/objects/fc/c6be1d2b7c64f0c2232d7559cd5e49bcb45171 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +# pack-refs with: peeled +0e924fc9504c5fc4425adf30f7ad85a9fe0bf4fd refs/remotes/origin/esp8266-latest +a913964341394430cd3997c6f2950f93ba1d75c8 refs/remotes/origin/master +723542653307ea78efb2d8b91fc1f69e6d567574 refs/remotes/origin/mbed-client +e61ba698f31f71693451e91f68bb2035706695b7 refs/remotes/origin/mbedos5.3.4 +0c77697463c204aa53467a8b7c6286c31b973792 refs/remotes/origin/odin
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +a913964341394430cd3997c6f2950f93ba1d75c8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d827cdb1c3fb5a419b721646a2e1fc49fbd3fdf0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.git/refs/remotes/origin/revert-mts Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d3503403331d10000e1d061fe189c17f215d4e89
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.meta Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<root> + <node _type="integer" _key="update">0</node> +</root>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/.msub Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +atmel-rf-driver = https://github.com/ARMmbed/atmel-rf-driver/#110:57f22763f4d3649d4ac0b1df1f568f4cc45e491a +esp8266-driver = https://github.com/ARMmbed/esp8266-driver/#13:4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb +mcr20a-rf-driver = https://github.com/ARMmbed/mcr20a-rf-driver/#16:d8810e105d7d35315aa708ec51d821156cad45e9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,102 @@ +# Easy Connect - Easily add all supported connectivity methods to your mbed OS project + +Often you want to give users of your application the choice to switch between connectivity methods. The `NetworkInterface` API makes this easy, but you'll still need a mechanism for the user to chooce the method, throw in some `#define`'s, etc. Easy Connect handles all this for you. Just declare the desired connectivity method in your `mbed_app.json` file, and call `easy_connect()` from your application. + +## Specifying connectivity method + +Add the following to your ``mbed_app.json`` file: + +```json +{ + "config": { + "network-interface":{ + "help": "options are ETHERNET,WIFI_ESP8266,WIFI_ODIN,MESH_LOWPAN_ND,MESH_THREAD", + "value": "ETHERNET" + } + }, + "target_overrides": { + "*": { + "target.features_add": ["NANOSTACK", "LOWPAN_ROUTER", "COMMON_PAL"], + "mbed-mesh-api.6lowpan-nd-channel-page": 0, + "mbed-mesh-api.6lowpan-nd-channel": 12 + } + } +} +``` + +If you choose `WIFI_ESP8266` or `WIFI_ODIN`, you'll also need to add the WiFi SSID and password: + +```json + "config": { + "network-interface":{ + "help": "options are ETHERNET,WIFI_ESP8266,WIFI_ODIN,MESH_LOWPAN_ND,MESH_THREAD", + "value": "WIFI_ESP8266" + }, + "esp8266-tx": { + "help": "Pin used as TX (connects to ESP8266 RX)", + "value": "PTD3" + }, + "esp8266-rx": { + "help": "Pin used as RX (connects to ESP8266 TX)", + "value": "PTD2" + }, + "esp8266-debug": { + "value": true + }, + "wifi-ssid": { + "value": "\"SSID\"" + }, + "wifi-password": { + "value": "\"Password\"" + } + } +``` + +If you use `MESH_LOWPAN_ND` or `MESH_THREAD` you will need to specify your radio module: + +```json + "config": { + "network-interface":{ + "help": "options are ETHERNET,WIFI_ESP8266,WIFI_ODIN,MESH_LOWPAN_ND,MESH_THREAD", + "value": "MESH_LOWPAN_ND" + }, + "mesh_radio_type": { + "help": "options are ATMEL, MCR20", + "value": "ATMEL" + } + } +``` + +## Using Easy Connect from your application + +Easy Connect has just one function which will either return a `NetworkInterface`-pointer or `NULL`: + +```cpp +#include "easy-connect.h" + +int main(int, char**) { + NetworkInterface* network = easy_connect(true); /* has 1 argument, enable_logging (pass in true to log to serial port) */ + if (!network) { + printf("Connecting to the network failed... See serial output.\r\n"); + return 1; + } + + // Rest of your program +} +``` +## CR/LF in serial output + +If you want to avoid using `\r\n` in your printouts and just use normal C-style `\n` instead, please specify these to your `mbed_app.json` + +```json + "target_overrides": { + "*": { + "platform.stdio-baud-rate": 115200, + "platform.stdio-convert-newlines": true + } + } +``` + +## Extra defines + +If you'd like to use Easy Connect with mbed Client then you're in luck. Easy Connect automatically defines the `MBED_SERVER_ADDRESS` macro depending on your connectivity method (either IPv4 or IPv6 address). Use this address to connect to the right instance of mbed Device Connector.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/atmel-rf-driver/#57f22763f4d3649d4ac0b1df1f568f4cc45e491a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,18 @@ +57f22763f4d3649d4ac0b1df1f568f4cc45e491a branch 'master' of https://github.com/ARMmbed/atmel-rf-driver +a2d72a667b7ed3ac4e70ae743fd3c02a6e02afda not-for-merge branch 'alpha2-release' of https://github.com/ARMmbed/atmel-rf-driver +d11d8a2564ef5f946c99f8003533caea13599d7b not-for-merge branch 'alpha3-release' of https://github.com/ARMmbed/atmel-rf-driver +6a5156bea2dc8981a7efd86bcdf341dc398307e3 not-for-merge branch 'dep_update' of https://github.com/ARMmbed/atmel-rf-driver +dc0c089e6782d66f3ef379736f3062afae708ef2 not-for-merge branch 'eui_chip_check' of https://github.com/ARMmbed/atmel-rf-driver +1bf67eedce0f85a16376876670d525144d887892 not-for-merge branch 'eui_mac_chip_check' of https://github.com/ARMmbed/atmel-rf-driver +c1841c90de9450093049f22e52aec334f2c5c704 not-for-merge branch 'feature_cmsis5' of https://github.com/ARMmbed/atmel-rf-driver +f29a7aaefdba350fee57572a7d56bba66a87464e not-for-merge branch 'fhss_dev' of https://github.com/ARMmbed/atmel-rf-driver +06296efdcc38e2719895af98e1f5ec911a1f00f8 not-for-merge branch 'mac_class_update' of https://github.com/ARMmbed/atmel-rf-driver +a41e721bbb81e4e15b812909cd36005a000b03f9 not-for-merge branch 'maint_merge' of https://github.com/ARMmbed/atmel-rf-driver +b73c78b4f8ccbfa3295fd419173ce576ff9ddcf6 not-for-merge branch 'morpheus_dependency' of https://github.com/ARMmbed/atmel-rf-driver +248d04582db6ba2db423cf8eb4e3535d5ef4cb72 not-for-merge branch 'ns_minar_take2' of https://github.com/ARMmbed/atmel-rf-driver +a36e17a728732268b404fc727940257830e208ac not-for-merge branch 'retries' of https://github.com/ARMmbed/atmel-rf-driver +a729202ba68a7537e4bdbea5f6d91d1522280ccd not-for-merge branch 'spi_timing_fix' of https://github.com/ARMmbed/atmel-rf-driver +a82eda14afc4bd57c0574d0d58443d4aa4dddf31 not-for-merge branch 'thread_start_cond' of https://github.com/ARMmbed/atmel-rf-driver +37e636728520d0d6d4e6caafff5e36962e5ceec0 not-for-merge branch 'update_mbed_dep' of https://github.com/ARMmbed/atmel-rf-driver +0f7255a79b69c09469f4b3377513a39a9e6b25f5 not-for-merge branch 'v1.0-maint' of https://github.com/ARMmbed/atmel-rf-driver +a7ff1a1ea2b3060139a345a09b72bdbf244cf4dc not-for-merge branch 'v2.1-maint' of https://github.com/ARMmbed/atmel-rf-driver
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +57f22763f4d3649d4ac0b1df1f568f4cc45e491a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/atmel-rf-driver/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file easy-connect/atmel-rf-driver/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 57f22763f4d3649d4ac0b1df1f568f4cc45e491a www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198997 +0000 clone: from https://github.com/ARMmbed/atmel-rf-driver/ +57f22763f4d3649d4ac0b1df1f568f4cc45e491a 57f22763f4d3649d4ac0b1df1f568f4cc45e491a www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198997 +0000 checkout: moving from master to 57f22763f4d3649d4ac0b1df1f568f4cc45e491a +57f22763f4d3649d4ac0b1df1f568f4cc45e491a 57f22763f4d3649d4ac0b1df1f568f4cc45e491a www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198997 +0000 checkout: moving from 57f22763f4d3649d4ac0b1df1f568f4cc45e491a to master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 57f22763f4d3649d4ac0b1df1f568f4cc45e491a www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198997 +0000 clone: from https://github.com/ARMmbed/atmel-rf-driver/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 57f22763f4d3649d4ac0b1df1f568f4cc45e491a www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487198997 +0000 clone: from https://github.com/ARMmbed/atmel-rf-driver/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/logs/refs/remotes/origin/feature_cmsis5 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 c1841c90de9450093049f22e52aec334f2c5c704 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787106 +0000 fetch --append origin: storing head
Binary file easy-connect/atmel-rf-driver/.git/objects/0f/188ff94aad555d2217934fe14645cd0d666770 has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/29/d839f845c3ae60c719f32f2f9535f437e333ce has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/67/19e303194ed2aa6324cd82c8d8a150d9fce240 has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/6f/50f820d089f2c625d5e8864edd17c7b684f109 has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/8d/0e202dbeb716f8a7b60030a40033f980e4beb3 has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/8d/c9cd8a00f9ead59b5dfcd69accc17372c7ea83 has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/a6/db8a2938fe8aa6f691336ae22f7d5d6f89f3e4 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/objects/b4/357d79d7421a7e2bb629c7e22eff8f109054e7 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xAjÃ0E³Ö)fÙ0Ò,B)]õÉ>QcjGÆQi7GÈêñ|øCç±ú¸««*HH=Fâ¬,r("æ.µ)dÔEV½VÐ4´.mì\×ïcHOhHÕ±ôhä§^Ê +G]'ù©ÀÛíßú°Yçf(ó;8m@²ÜÁÞµf«ÛɪOÎÍçøõ¢Ûøuéü+c}y A¦©1wOa \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/objects/c1/841c90de9450093049f22e52aec334f2c5c704 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x½j1Së)¶Õ~!¤HÎàôA'lètÈë<¿Ï~tó 30{kg²æI3¸j±Â!VÊl±3\öÙÏ.ª1ª5 ^f3Y_|,ÞNiż âZÃ=Ö°Wé*§>àÀëÚá+ý¤ß/;íäAoi´]îí´¡:À3Njs·Âÿ¬«÷ý'äSZuô×ó"}H~ùøÛ¨P \ No newline at end of file
Binary file easy-connect/atmel-rf-driver/.git/objects/c8/82de01e5b8c527304387d8be1af12be5256f48 has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/c9/3431f33845c0081c629ba1092d4a4885b77bcf has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/e9/de65821dde6717534b96d54d8220833ee18ab2 has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/pack/pack-df49a7f6c082333849ec431dc8fcd0d3d9a40999.idx has changed
Binary file easy-connect/atmel-rf-driver/.git/objects/pack/pack-df49a7f6c082333849ec431dc8fcd0d3d9a40999.pack has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +# pack-refs with: peeled +a2d72a667b7ed3ac4e70ae743fd3c02a6e02afda refs/remotes/origin/alpha2-release +d11d8a2564ef5f946c99f8003533caea13599d7b refs/remotes/origin/alpha3-release +6a5156bea2dc8981a7efd86bcdf341dc398307e3 refs/remotes/origin/dep_update +dc0c089e6782d66f3ef379736f3062afae708ef2 refs/remotes/origin/eui_chip_check +1bf67eedce0f85a16376876670d525144d887892 refs/remotes/origin/eui_mac_chip_check +f29a7aaefdba350fee57572a7d56bba66a87464e refs/remotes/origin/fhss_dev +06296efdcc38e2719895af98e1f5ec911a1f00f8 refs/remotes/origin/mac_class_update +a41e721bbb81e4e15b812909cd36005a000b03f9 refs/remotes/origin/maint_merge +57f22763f4d3649d4ac0b1df1f568f4cc45e491a refs/remotes/origin/master +b73c78b4f8ccbfa3295fd419173ce576ff9ddcf6 refs/remotes/origin/morpheus_dependency +248d04582db6ba2db423cf8eb4e3535d5ef4cb72 refs/remotes/origin/ns_minar_take2 +a36e17a728732268b404fc727940257830e208ac refs/remotes/origin/retries +a729202ba68a7537e4bdbea5f6d91d1522280ccd refs/remotes/origin/spi_timing_fix +a82eda14afc4bd57c0574d0d58443d4aa4dddf31 refs/remotes/origin/thread_start_cond +37e636728520d0d6d4e6caafff5e36962e5ceec0 refs/remotes/origin/update_mbed_dep +0f7255a79b69c09469f4b3377513a39a9e6b25f5 refs/remotes/origin/v1.0-maint +a7ff1a1ea2b3060139a345a09b72bdbf244cf4dc refs/remotes/origin/v2.1-maint +453e4e2324d1d634dad87b1e107a1bc762c8ff2f refs/tags/beta-release +a16a4ed6f6e8d5f2d009f25b6ab7c38affb5019c refs/tags/mbed-os-5.1.0-rc3 +a16a4ed6f6e8d5f2d009f25b6ab7c38affb5019c refs/tags/mbed-os-5.1.0-rc4 +a2d72a667b7ed3ac4e70ae743fd3c02a6e02afda refs/tags/mbedOS-alpha2 +4d2d328030c538a15cde01baa6c6e8f15ba7e0f4 refs/tags/mbedos-16.01-release +4d2d328030c538a15cde01baa6c6e8f15ba7e0f4 refs/tags/mbedos-16.03-release +4a7b2df89566412ab1f78c34acd66e114c210965 refs/tags/mbedos-2016q1-oob1 +4a7b2df89566412ab1f78c34acd66e114c210965 refs/tags/mbedos-2016q1-oob2 +4d2d328030c538a15cde01baa6c6e8f15ba7e0f4 refs/tags/mbedos-2016q1-oob3 +dcd91e50e2cef8a8944ec4acc30a9186fd250838 refs/tags/mbedos-release-15-11 +083d0d49ede86c2bf6417bf0a951ff37e497480c refs/tags/mbedos-techcon-oob2 +cf743c8ed7a61cd9217d010415b872629afa92ca refs/tags/v0.0.10 +d11d8a2564ef5f946c99f8003533caea13599d7b refs/tags/v0.0.11 +3b4d57bc558e26d357280c56908a2e0a211541dc refs/tags/v0.0.12 +7ee6cb249980d2b9f4e18744273ddd4da446e43b refs/tags/v0.0.13 +0ab8f39aebb09c3d57b1b612f562c5f2ea8e8217 refs/tags/v0.0.14 +^607843bac2c6677f69805fa45b169a9f4a89147c +5ddc1deddcabe511d9e92d82ba2943d4ab272901 refs/tags/v0.0.15 +^f2fa5831d8d80deaeff177fffb628c06f5e3f4ce +1b68214c528ef2fa41827292d0a8b919f530d4e6 refs/tags/v0.0.16 +^60256bb25d369570403ca27e752a6847b35b1424 +761c9ed3ee0e01563a1fa4783c03f3d4b40eb87b refs/tags/v0.0.18 +^f245f7ae3556436d017827d097904d85f8d7061c +83e3d05272235be8e2fbd671ecd0489f05974dd0 refs/tags/v0.0.19 +^7d53d340711421f2ceffa43bbc036530c1cab6d3 +4b57c221f603ec186f2939d25c17481954468ca4 refs/tags/v0.0.20 +^ec465a0701cf62542dea77b6a4933adcb3275028 +66cb6974dd688bb99be556ff87305a99cf6ff584 refs/tags/v0.0.21 +^453e4e2324d1d634dad87b1e107a1bc762c8ff2f +a8ed93388a3952da5c2a15d1bda443f092afb746 refs/tags/v0.0.22 +^a293db7a32e00d4e96e2c0af3692c047d2126037 +05edb4fd8c8503181aa07c2cad5ab262d748cb27 refs/tags/v0.0.23 +^d57710cdad5df1e55af0a1be179b98a6e59c4ebd +844097fe55cfcc3658bed3452469137badca2798 refs/tags/v0.0.24 +^6269d5ea5e313b33f011ece34318ecac79d6a626 +876b12b8b4f2bbe9399345259b68259d33d59909 refs/tags/v0.0.25 +^4614966ca81530bc1fb376062af078c120f24241 +1874e9cf58468a41e25450dcffeb0e0ca08d9ca6 refs/tags/v0.0.8 +cc0a6379a081f4fddc1dc98e96f1bc7c4573115c refs/tags/v0.0.9 +9b2561ff19aa36d2176cae99d05e883ddabcb70a refs/tags/v1.0.0 +^083d0d49ede86c2bf6417bf0a951ff37e497480c +303705bca8f05d221c1f2a44290d46147af52b6f refs/tags/v1.0.1 +^dcd91e50e2cef8a8944ec4acc30a9186fd250838 +755358c39f9484546ef1330932e63d430550c825 refs/tags/v1.0.2 +^efe496dcf42e2eed98f6d70c33f8d6bd7cfd430e +eeb91783261991c06f0541a547ccea44afea7370 refs/tags/v1.0.3 +^0f7255a79b69c09469f4b3377513a39a9e6b25f5 +b17a8d9177c6985379176ffa41cb836632644162 refs/tags/v2.0.0 +^a7a63cfea3492f9693f1904cda264b99037fe475 +8a6fb2273f4b1cbd9b6b6cb7d4aa58774f06a0be refs/tags/v2.0.1 +^232e2508475626865679b5b4e43e21f19e2d2b88 +91c188f0c616ce47b5d1d832bed97aeb5cc02384 refs/tags/v2.0.2 +^4a7b2df89566412ab1f78c34acd66e114c210965 +ca1cad744508e1abc981b4dbd359401385b4da75 refs/tags/v2.0.3 +^41441226a87109a7405e4c8ba048311484a4b1c4 +d382c3d7e1a3656176bbf1d05180928cded5217d refs/tags/v2.1.0 +^4d2d328030c538a15cde01baa6c6e8f15ba7e0f4 +17393a1acefd268c75c0376aaa24c3ae6617f2f3 refs/tags/v2.1.1 +^a7ff1a1ea2b3060139a345a09b72bdbf244cf4dc +c81741ac293409229df9c2343398016205797eae refs/tags/v3.0.0 +^50889f6c316d0b80520c781841f053b3a8aa8cd3 +b13508e3cd625d723a153d10626bdd3b342382f7 refs/tags/v3.0.1 +^3de9de8fa23b2a699cef382dd49e7f9a1dec6e5d +80b2af683c02ca10f40917dcf60dc0e5973504d8 refs/tags/v3.0.2 +^160ce634ac16723c18bb2be61f1ed21c776252c9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +57f22763f4d3649d4ac0b1df1f568f4cc45e491a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.git/refs/remotes/origin/feature_cmsis5 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +c1841c90de9450093049f22e52aec334f2c5c704
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/.gitignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +*~ +*.swo +*.swp +build +yotta_modules +yotta_targets
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/LICENSE Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +Unless specifically indicated otherwise in a file, files are licensed +under the Apache 2.0 license, as can be found in: apache-2.0.txt \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,7 @@ +# Example RF driver for Atmel 802.15.4 transceivers # + +Support for: + * AT86RF233 + * AT86RF212B + +This driver is used with 6LoWPAN stack. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/apache-2.0.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/atmel-rf-driver/NanostackRfPhyAtmel.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef NANOSTACK_RF_PHY_ATMEL_H_ +#define NANOSTACK_RF_PHY_ATMEL_H_ + +#include "NanostackRfPhy.h" +#include "at24mac.h" +#include "PinNames.h" + +// Arduino pin defaults for convenience +#if !defined(ATMEL_SPI_MOSI) +#define ATMEL_SPI_MOSI D11 +#endif +#if !defined(ATMEL_SPI_MISO) +#define ATMEL_SPI_MISO D12 +#endif +#if !defined(ATMEL_SPI_SCLK) +#define ATMEL_SPI_SCLK D13 +#endif +#if !defined(ATMEL_SPI_CS) +#define ATMEL_SPI_CS D10 +#endif +#if !defined(ATMEL_SPI_RST) +#define ATMEL_SPI_RST D5 +#endif +#if !defined(ATMEL_SPI_SLP) +#define ATMEL_SPI_SLP D7 +#endif +#if !defined(ATMEL_SPI_IRQ) +#define ATMEL_SPI_IRQ D9 +#endif +#if !defined(ATMEL_I2C_SDA) +#define ATMEL_I2C_SDA D14 +#endif +#if !defined(ATMEL_I2C_SCL) +#define ATMEL_I2C_SCL D15 +#endif + +class RFBits; + +class NanostackRfPhyAtmel : public NanostackRfPhy { +public: + NanostackRfPhyAtmel(PinName spi_mosi, PinName spi_miso, + PinName spi_sclk, PinName spi_cs, PinName spi_rst, PinName spi_slp, PinName spi_irq, + PinName i2c_sda, PinName i2c_scl); + ~NanostackRfPhyAtmel(); + int8_t rf_register(); + void rf_unregister(); + void get_mac_address(uint8_t *mac); + void set_mac_address(uint8_t *mac); + +private: + AT24Mac _mac; + uint8_t _mac_addr[8]; + RFBits *_rf; + bool _mac_set; + + const PinName _spi_mosi; + const PinName _spi_miso; + const PinName _spi_sclk; + const PinName _spi_cs; + const PinName _spi_rst; + const PinName _spi_slp; + const PinName _spi_irq; +}; + +#endif /* NANOSTACK_RF_PHY_ATMEL_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/module.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,17 @@ +{ + "name": "atmel-rf-driver", + "version": "3.0.2", + "description": "RF driver for Atmel AT86RF233", + "keywords": [ + "rf", + "driver" + ], + "author": "Seppo Takalo <seppo.takalo@arm.com>", + "license": "Apache-2.0", + "dependencies": { + "nanostack-libservice": "^3.0.0", + "sal-stack-nanostack": "^5.0.0", + "mbed-drivers": "^1.0.0" + }, + "targetDependencies": {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/source/AT86RFReg.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef AT86RFREG_H_ +#define AT86RFREG_H_ +#ifdef __cplusplus +extern "C" { +#endif + +/*AT86RF212 PHY Modes*/ +#define BPSK_20 0x00 +#define BPSK_40 0x04 +#define BPSK_40_ALT 0x14 +#define OQPSK_SIN_RC_100 0x08 +#define OQPSK_SIN_RC_200 0x09 +#define OQPSK_RC_100 0x18 +#define OQPSK_RC_200 0x19 +#define OQPSK_SIN_250 0x0c +#define OQPSK_SIN_500 0x0d +#define OQPSK_SIN_500_ALT 0x0f +#define OQPSK_RC_250 0x1c +#define OQPSK_RC_500 0x1d +#define OQPSK_RC_500_ALT 0x1f +#define OQPSK_SIN_RC_400_SCR_ON 0x2A +#define OQPSK_SIN_RC_400_SCR_OFF 0x0A +#define OQPSK_RC_400_SCR_ON 0x3A +#define OQPSK_RC_400_SCR_OFF 0x1A +#define OQPSK_SIN_1000_SCR_ON 0x2E +#define OQPSK_SIN_1000_SCR_OFF 0x0E +#define OQPSK_RC_1000_SCR_ON 0x3E +#define OQPSK_RC_1000_SCR_OFF 0x1E + +/*Supported transceivers*/ +#define PART_AT86RF231 0x03 +#define PART_AT86RF212 0x07 +#define PART_AT86RF233 0x0B +#define VERSION_AT86RF212 0x01 +#define VERSION_AT86RF212B 0x03 + +/*RF Configuration Registers*/ +#define TRX_STATUS 0x01 +#define TRX_STATE 0x02 +#define TRX_CTRL_0 0x03 +#define TRX_CTRL_1 0x04 +#define PHY_TX_PWR 0x05 +#define PHY_RSSI 0x06 +#define PHY_ED_LEVEL 0x07 +#define PHY_CC_CCA 0x08 +#define RX_CTRL 0x0A +#define SFD_VALUE 0x0B +#define TRX_CTRL_2 0x0C +#define ANT_DIV 0x0D +#define IRQ_MASK 0x0E +#define IRQ_STATUS 0x0F +#define VREG_CTRL 0x10 +#define BATMON 0x11 +#define XOSC_CTRL 0x12 +#define CC_CTRL_0 0x13 +#define CC_CTRL_1 0x14 +#define RX_SYN 0x15 +#define TRX_RPC 0x16 +#define RF_CTRL_0 0x16 +#define XAH_CTRL_1 0x17 +#define FTN_CTRL 0x18 +#define PLL_CF 0x1A +#define PLL_DCU 0x1B +#define PART_NUM 0x1C +#define VERSION_NUM 0x1D +#define MAN_ID_0 0x1E +#define MAN_ID_1 0x1F +#define SHORT_ADDR_0 0x20 +#define SHORT_ADDR_1 0x21 +#define PAN_ID_0 0x22 +#define PAN_ID_1 0x23 +#define IEEE_ADDR_0 0x24 +#define IEEE_ADDR_1 0x25 +#define IEEE_ADDR_2 0x26 +#define IEEE_ADDR_3 0x27 +#define IEEE_ADDR_4 0x28 +#define IEEE_ADDR_5 0x29 +#define IEEE_ADDR_6 0x2A +#define IEEE_ADDR_7 0x2B +#define XAH_CTRL_0 0x2C +#define CSMA_SEED_0 0x2D +#define CSMA_SEED_1 0x2E +#define CSMA_BE 0x2F + +/* CSMA_SEED_1*/ +#define AACK_FVN_MODE1 7 +#define AACK_FVN_MODE0 6 +#define AACK_SET_PD 5 +#define AACK_DIS_ACK 4 +#define AACK_I_AM_COORD 3 +#define CSMA_SEED_12 2 +#define CSMA_SEED_11 1 +#define CSMA_SEED_10 0 + +/*TRX_STATUS bits*/ +#define CCA_STATUS 0x40 +#define CCA_DONE 0x80 + +/*PHY_CC_CCA bits*/ +#define CCA_REQUEST 0x80 +#define CCA_MODE_1 0x20 +#define CCA_MODE_3 0x60 + +/*IRQ_MASK bits*/ +#define RX_START 0x04 +#define TRX_END 0x08 +#define CCA_ED_DONE 0x10 +#define AMI 0x20 +#define TRX_UR 0x40 + +/*ANT_DIV bits*/ +#define ANT_DIV_EN 0x08 +#define ANT_EXT_SW_EN 0x04 +#define ANT_CTRL_DEFAULT 0x03 + +/*TRX_CTRL_1 bits*/ +#define PA_EXT_EN 0x80 + +/*FTN_CTRL bits*/ +#define FTN_START 0x80 + +/*PHY_RSSI bits*/ +#define CRC_VALID 0x80 + +/*RX_SYN bits*/ +#define RX_PDT_DIS 0x80 + +/*TRX_RPC bits */ +#define RX_RPC_CTRL 0xC0 +#define RX_RPC_EN 0x20 +#define PDT_RPC_EN 0x10 +#define PLL_RPC_EN 0x08 +#define XAH_TX_RPC_EN 0x04 +#define IPAN_RPC_EN 0x02 +#define TRX_RPC_RSVD_1 0x01 + +/*XAH_CTRL_1 bits*/ +#define AACK_PROM_MODE 0x02 + + +#ifdef __cplusplus +} +#endif + +#endif /* AT86RFREG_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/source/NanostackRfPhyAtmel.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2479 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <string.h> +#include "platform/arm_hal_interrupt.h" +#include "nanostack/platform/arm_hal_phy.h" +#include "ns_types.h" +#include "NanostackRfPhyAtmel.h" +#include "randLIB.h" +#include "AT86RFReg.h" +#include "nanostack/platform/arm_hal_phy.h" +#include "toolchain.h" + +/*Worst case sensitivity*/ +#define RF_DEFAULT_SENSITIVITY -88 +/*Run calibration every 5 minutes*/ +#define RF_CALIBRATION_INTERVAL 6000000 +/*Wait ACK for 2.5ms*/ +#define RF_ACK_WAIT_DEFAULT_TIMEOUT 50 +/*Base CCA backoff (50us units) - substitutes for Inter-Frame Spacing*/ +#define RF_CCA_BASE_BACKOFF 13 /* 650us */ +/*CCA random backoff (50us units)*/ +#define RF_CCA_RANDOM_BACKOFF 51 /* 2550us */ + +#define RF_MTU 127 + +#define RF_PHY_MODE OQPSK_SIN_250 + +/*Radio RX and TX state definitions*/ +#define RFF_ON 0x01 +#define RFF_RX 0x02 +#define RFF_TX 0x04 +#define RFF_CCA 0x08 +#define RFF_PROT 0x10 + +typedef enum +{ + RF_MODE_NORMAL = 0, + RF_MODE_SNIFFER = 1, + RF_MODE_ED = 2 +}rf_mode_t; + +/*Atmel RF Part Type*/ +typedef enum +{ + ATMEL_UNKNOW_DEV = 0, + ATMEL_AT86RF212, + ATMEL_AT86RF231, // No longer supported (doesn't give ED+status on frame read) + ATMEL_AT86RF233 +}rf_trx_part_e; + +/*Atmel RF states*/ +typedef enum +{ + NOP = 0x00, + BUSY_RX = 0x01, + RF_TX_START = 0x02, + FORCE_TRX_OFF = 0x03, + FORCE_PLL_ON = 0x04, + RX_ON = 0x06, + TRX_OFF = 0x08, + PLL_ON = 0x09, + BUSY_RX_AACK = 0x11, + SLEEP = 0x0F, + RX_AACK_ON = 0x16, + TX_ARET_ON = 0x19 +}rf_trx_states_t; + +static const uint8_t *rf_tx_data; // Points to Nanostack's buffer +static uint8_t rf_tx_length; +/*ACK wait duration changes depending on data rate*/ +static uint16_t rf_ack_wait_duration = RF_ACK_WAIT_DEFAULT_TIMEOUT; + +static int8_t rf_sensitivity = RF_DEFAULT_SENSITIVITY; +static rf_mode_t rf_mode = RF_MODE_NORMAL; +static uint8_t radio_tx_power = 0x00; // Default to +4dBm +static uint8_t rf_phy_channel = 12; +static uint8_t rf_tuned = 1; +static uint8_t rf_use_antenna_diversity = 0; +static int16_t expected_ack_sequence = -1; +static uint8_t rf_rx_mode = 0; +static uint8_t rf_flags = 0; +static int8_t rf_radio_driver_id = -1; +static phy_device_driver_s device_driver; +static uint8_t mac_tx_handle = 0; + +/* Channel configurations for 2.4 and sub-GHz */ +static const phy_rf_channel_configuration_s phy_24ghz = {2405000000U, 5000000U, 250000U, 16U, M_OQPSK}; +static const phy_rf_channel_configuration_s phy_subghz = {868300000U, 2000000U, 250000U, 11U, M_OQPSK}; + +static const phy_device_channel_page_s phy_channel_pages[] = { + { CHANNEL_PAGE_0, &phy_24ghz}, + { CHANNEL_PAGE_2, &phy_subghz}, + { CHANNEL_PAGE_0, NULL} +}; + +/** + * RF output power write + * + * \brief TX power has to be set before network start. + * + * \param power + * AT86RF233 + * 0 = 4 dBm + * 1 = 3.7 dBm + * 2 = 3.4 dBm + * 3 = 3 dBm + * 4 = 2.5 dBm + * 5 = 2 dBm + * 6 = 1 dBm + * 7 = 0 dBm + * 8 = -1 dBm + * 9 = -2 dBm + * 10 = -3 dBm + * 11 = -4 dBm + * 12 = -6 dBm + * 13 = -8 dBm + * 14 = -12 dBm + * 15 = -17 dBm + * + * AT86RF212B + * See datasheet for TX power settings + * + * \return 0, Supported Value + * \return -1, Not Supported Value + */ +static int8_t rf_tx_power_set(uint8_t power); +static rf_trx_part_e rf_radio_type_read(void); +static void rf_ack_wait_timer_start(uint16_t slots); +static void rf_ack_wait_timer_stop(void); +static void rf_handle_cca_ed_done(void); +static void rf_handle_tx_end(void); +static void rf_handle_rx_end(void); +static void rf_on(void); +static void rf_receive(void); +static void rf_poll_trx_state_change(rf_trx_states_t trx_state); +static void rf_init(void); +static int8_t rf_device_register(const uint8_t *mac_addr); +static void rf_device_unregister(void); +static void rf_enable_static_frame_buffer_protection(void); +static void rf_disable_static_frame_buffer_protection(void); +static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol ); +static void rf_cca_abort(void); +static void rf_calibration_cb(void); +static void rf_init_phy_mode(void); +static void rf_ack_wait_timer_interrupt(void); +static void rf_calibration_timer_interrupt(void); +static void rf_calibration_timer_start(uint32_t slots); +static void rf_cca_timer_interrupt(void); +static void rf_cca_timer_start(uint32_t slots); +static uint8_t rf_scale_lqi(int8_t rssi); + +static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel); +static int8_t rf_extension(phy_extension_type_e extension_type,uint8_t *data_ptr); +static int8_t rf_address_write(phy_address_type_e address_type,uint8_t *address_ptr); + +static void rf_if_cca_timer_start(uint32_t slots); +static void rf_if_enable_promiscuous_mode(void); +static void rf_if_lock(void); +static void rf_if_unlock(void); +static uint8_t rf_if_read_rnd(void); +static void rf_if_calibration_timer_start(uint32_t slots); +static void rf_if_interrupt_handler(void); +static void rf_if_ack_wait_timer_start(uint16_t slots); +static void rf_if_ack_wait_timer_stop(void); +static void rf_if_ack_pending_ctrl(uint8_t state); +static void rf_if_calibration(void); +static uint8_t rf_if_read_register(uint8_t addr); +static void rf_if_set_bit(uint8_t addr, uint8_t bit, uint8_t bit_mask); +static void rf_if_clear_bit(uint8_t addr, uint8_t bit); +static void rf_if_write_register(uint8_t addr, uint8_t data); +static void rf_if_reset_radio(void); +static void rf_if_enable_ant_div(void); +static void rf_if_disable_ant_div(void); +static void rf_if_enable_slptr(void); +static void rf_if_disable_slptr(void); +static void rf_if_write_antenna_diversity_settings(void); +static void rf_if_write_set_tx_power_register(uint8_t value); +static void rf_if_write_rf_settings(void); +static uint8_t rf_if_check_cca(void); +static uint8_t rf_if_read_trx_state(void); +static uint16_t rf_if_read_packet(uint8_t data[RF_MTU], uint8_t *lqi_out, uint8_t *ed_out, bool *crc_good); +static void rf_if_write_short_addr_registers(uint8_t *short_address); +static uint8_t rf_if_last_acked_pending(void); +static void rf_if_write_pan_id_registers(uint8_t *pan_id); +static void rf_if_write_ieee_addr_registers(uint8_t *address); +static void rf_if_write_frame_buffer(const uint8_t *ptr, uint8_t length); +static void rf_if_change_trx_state(rf_trx_states_t trx_state); +static void rf_if_enable_tx_end_interrupt(void); +static void rf_if_enable_rx_end_interrupt(void); +static void rf_if_enable_cca_ed_done_interrupt(void); +static void rf_if_start_cca_process(void); +static int8_t rf_if_scale_rssi(uint8_t ed_level); +static void rf_if_set_channel_register(uint8_t channel); +static void rf_if_enable_promiscuous_mode(void); +static void rf_if_disable_promiscuous_mode(void); +static uint8_t rf_if_read_part_num(void); +static void rf_if_enable_irq(void); +static void rf_if_disable_irq(void); + +#ifdef MBED_CONF_RTOS_PRESENT +#include "mbed.h" +#include "rtos.h" + +static void rf_if_irq_task_process_irq(); + +#define SIG_RADIO 1 +#define SIG_TIMER_ACK 2 +#define SIG_TIMER_CAL 4 +#define SIG_TIMER_CCA 8 + +#define SIG_TIMERS (SIG_TIMER_ACK|SIG_TIMER_CAL|SIG_TIMER_CCA) +#define SIG_ALL (SIG_RADIO|SIG_TIMERS) +#endif + +// HW pins to RF chip +#define SPI_SPEED 7500000 + +class UnlockedSPI : public SPI { +public: + UnlockedSPI(PinName mosi, PinName miso, PinName sclk) : + SPI(mosi, miso, sclk) { } + virtual void lock() { } + virtual void unlock() { } +}; + +class RFBits { +public: + RFBits(PinName spi_mosi, PinName spi_miso, + PinName spi_sclk, PinName spi_cs, + PinName spi_rst, PinName spi_slp, PinName spi_irq); + UnlockedSPI spi; + DigitalOut CS; + DigitalOut RST; + DigitalOut SLP_TR; + InterruptIn IRQ; + Timeout ack_timer; + Timeout cal_timer; + Timeout cca_timer; +#ifdef MBED_CONF_RTOS_PRESENT + Thread irq_thread; + Mutex mutex; + void rf_if_irq_task(); +#endif +}; + +RFBits::RFBits(PinName spi_mosi, PinName spi_miso, + PinName spi_sclk, PinName spi_cs, + PinName spi_rst, PinName spi_slp, PinName spi_irq) + : spi(spi_mosi, spi_miso, spi_sclk), + CS(spi_cs), + RST(spi_rst), + SLP_TR(spi_slp), + IRQ(spi_irq) +#ifdef MBED_CONF_RTOS_PRESENT +,irq_thread(osPriorityRealtime, 1024) +#endif +{ +#ifdef MBED_CONF_RTOS_PRESENT + irq_thread.start(mbed::callback(this, &RFBits::rf_if_irq_task)); +#endif +} + +static RFBits *rf; +static uint8_t rf_part_num = 0; +/*TODO: RSSI Base value setting*/ +static int8_t rf_rssi_base_val = -91; + +static uint8_t rf_if_spi_exchange(uint8_t out); + +static void rf_if_lock(void) +{ + platform_enter_critical(); +} + +static void rf_if_unlock(void) +{ + platform_exit_critical(); +} + +#ifdef MBED_CONF_RTOS_PRESENT +static void rf_if_cca_timer_signal(void) +{ + rf->irq_thread.signal_set(SIG_TIMER_CCA); +} + +static void rf_if_cal_timer_signal(void) +{ + rf->irq_thread.signal_set(SIG_TIMER_CAL); +} + +static void rf_if_ack_timer_signal(void) +{ + rf->irq_thread.signal_set(SIG_TIMER_ACK); +} +#endif + + +/* Delay functions for RF Chip SPI access */ +#ifdef __CC_ARM +__asm static void delay_loop(uint32_t count) +{ +1 + SUBS a1, a1, #1 + BCS %BT1 + BX lr +} +#elif defined (__ICCARM__) +static void delay_loop(uint32_t count) +{ + __asm volatile( + "loop: \n" + " SUBS %0, %0, #1 \n" + " BCS.n loop\n" + : "+r" (count) + : + : "cc" + ); +} +#else // GCC +static void delay_loop(uint32_t count) +{ + __asm__ volatile ( + "%=:\n\t" +#if defined(__thumb__) && !defined(__thumb2__) + "SUB %0, #1\n\t" +#else + "SUBS %0, %0, #1\n\t" +#endif + "BCS %=b\n\t" + : "+l" (count) + : + : "cc" + ); +} +#endif + +static void delay_ns(uint32_t ns) +{ + uint32_t cycles_per_us = SystemCoreClock / 1000000; + // Cortex-M0 takes 4 cycles per loop (SUB=1, BCS=3) + // Cortex-M3 and M4 takes 3 cycles per loop (SUB=1, BCS=2) + // Cortex-M7 - who knows? + // Cortex M3-M7 have "CYCCNT" - would be better than a software loop, but M0 doesn't + // Assume 3 cycles per loop for now - will be 33% slow on M0. No biggie, + // as original version of code was 300% slow on M4. + // [Note that this very calculation, plus call overhead, will take multiple + // cycles. Could well be 100ns on its own... So round down here, startup is + // worth at least one loop iteration.] + uint32_t count = (cycles_per_us * ns) / 3000; + + delay_loop(count); +} + +// t1 = 180ns, SEL falling edge to MISO active [SPI setup assumed slow enough to not need manual delay] +#define CS_SELECT() {rf->CS = 0; /* delay_ns(180); */} + // t9 = 250ns, last clock to SEL rising edge, t8 = 250ns, SPI idle time between consecutive access +#define CS_RELEASE() {delay_ns(250); rf->CS = 1; delay_ns(250);} + +/* + * \brief Function sets the TX power variable. + * + * \param power TX power setting + * + * \return 0 Success + * \return -1 Fail + */ +MBED_UNUSED static int8_t rf_tx_power_set(uint8_t power) +{ + int8_t ret_val = -1; + + radio_tx_power = power; + rf_if_lock(); + rf_if_write_set_tx_power_register(radio_tx_power); + rf_if_unlock(); + ret_val = 0; + + return ret_val; +} + +/* + * \brief Read connected radio part. + * + * This function only return valid information when rf_init() is called + * + * \return + */ +static rf_trx_part_e rf_radio_type_read(void) +{ + rf_trx_part_e ret_val = ATMEL_UNKNOW_DEV; + + switch (rf_part_num) + { + case PART_AT86RF212: + ret_val = ATMEL_AT86RF212; + break; + case PART_AT86RF233: + ret_val = ATMEL_AT86RF233; + break; + default: + break; + } + + return ret_val; +} + + +/* + * \brief Function starts the ACK wait timeout. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_if_ack_wait_timer_start(uint16_t slots) +{ +#ifdef MBED_CONF_RTOS_PRESENT + rf->ack_timer.attach_us(rf_if_ack_timer_signal, slots*50); +#else + rf->ack_timer.attach_us(rf_ack_wait_timer_interrupt, slots*50); +#endif +} + +/* + * \brief Function starts the calibration interval. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_if_calibration_timer_start(uint32_t slots) +{ +#ifdef MBED_CONF_RTOS_PRESENT + rf->cal_timer.attach_us(rf_if_cal_timer_signal, slots*50); +#else + rf->cal_timer.attach_us(rf_calibration_timer_interrupt, slots*50); +#endif +} + +/* + * \brief Function starts the CCA interval. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_if_cca_timer_start(uint32_t slots) +{ +#ifdef MBED_CONF_RTOS_PRESENT + rf->cca_timer.attach_us(rf_if_cca_timer_signal, slots*50); +#else + rf->cca_timer.attach_us(rf_cca_timer_interrupt, slots*50); +#endif +} + +/* + * \brief Function stops the CCA interval. + * + * \return none + */ +static void rf_if_cca_timer_stop(void) +{ + rf->cca_timer.detach(); +} + +/* + * \brief Function stops the ACK wait timeout. + * + * \param none + * + * \return none + */ +static void rf_if_ack_wait_timer_stop(void) +{ + rf->ack_timer.detach(); +} + +/* + * \brief Function sets bit(s) in given RF register. + * + * \param addr Address of the register to set + * \param bit Bit(s) to set + * \param bit_mask Masks the field inside the register + * + * \return none + */ +static void rf_if_set_bit(uint8_t addr, uint8_t bit, uint8_t bit_mask) +{ + uint8_t reg = rf_if_read_register(addr); + reg &= ~bit_mask; + reg |= bit; + rf_if_write_register(addr, reg); +} + +/* + * \brief Function clears bit(s) in given RF register. + * + * \param addr Address of the register to clear + * \param bit Bit(s) to clear + * + * \return none + */ +static void rf_if_clear_bit(uint8_t addr, uint8_t bit) +{ + rf_if_set_bit(addr, 0, bit); +} + +/* + * \brief Function writes register in RF. + * + * \param addr Address on the RF + * \param data Written data + * + * \return none + */ +static void rf_if_write_register(uint8_t addr, uint8_t data) +{ + uint8_t cmd = 0xC0; + CS_SELECT(); + rf_if_spi_exchange(cmd | addr); + rf_if_spi_exchange(data); + CS_RELEASE(); +} + +/* + * \brief Function reads RF register. + * + * \param addr Address on the RF + * + * \return Read data + */ +static uint8_t rf_if_read_register(uint8_t addr) +{ + uint8_t cmd = 0x80; + uint8_t data; + CS_SELECT(); + rf_if_spi_exchange(cmd | addr); + data = rf_if_spi_exchange(0); + CS_RELEASE(); + return data; +} + +/* + * \brief Function resets the RF. + * + * \param none + * + * \return none + */ +static void rf_if_reset_radio(void) +{ + rf->spi.frequency(SPI_SPEED); + rf->IRQ.rise(0); + rf->RST = 1; + wait_ms(1); + rf->RST = 0; + wait_ms(10); + CS_RELEASE(); + rf->SLP_TR = 0; + wait_ms(10); + rf->RST = 1; + wait_ms(10); + + rf->IRQ.rise(&rf_if_interrupt_handler); +} + +/* + * \brief Function enables the promiscuous mode. + * + * \param none + * + * \return none + */ +static void rf_if_enable_promiscuous_mode(void) +{ + /*Set AACK_PROM_MODE to enable the promiscuous mode*/ + rf_if_set_bit(XAH_CTRL_1, AACK_PROM_MODE, AACK_PROM_MODE); +} + +/* + * \brief Function enables the promiscuous mode. + * + * \param none + * + * \return none + */ +static void rf_if_disable_promiscuous_mode(void) +{ + /*Set AACK_PROM_MODE to enable the promiscuous mode*/ + rf_if_clear_bit(XAH_CTRL_1, AACK_PROM_MODE); +} + +/* + * \brief Function enables the Antenna diversity usage. + * + * \param none + * + * \return none + */ +static void rf_if_enable_ant_div(void) +{ + /*Set ANT_EXT_SW_EN to enable controlling of antenna diversity*/ + rf_if_set_bit(ANT_DIV, ANT_EXT_SW_EN, ANT_EXT_SW_EN); +} + +/* + * \brief Function disables the Antenna diversity usage. + * + * \param none + * + * \return none + */ +static void rf_if_disable_ant_div(void) +{ + rf_if_clear_bit(ANT_DIV, ANT_EXT_SW_EN); +} + +/* + * \brief Function sets the SLP TR pin. + * + * \param none + * + * \return none + */ +static void rf_if_enable_slptr(void) +{ + rf->SLP_TR = 1; +} + +/* + * \brief Function clears the SLP TR pin. + * + * \param none + * + * \return none + */ +static void rf_if_disable_slptr(void) +{ + rf->SLP_TR = 0; +} + +/* + * \brief Function writes the antenna diversity settings. + * + * \param none + * + * \return none + */ +static void rf_if_write_antenna_diversity_settings(void) +{ + /*Recommended setting of PDT_THRES is 3 when antenna diversity is used*/ + rf_if_set_bit(RX_CTRL, 0x03, 0x0f); + rf_if_write_register(ANT_DIV, ANT_DIV_EN | ANT_EXT_SW_EN | ANT_CTRL_DEFAULT); +} + +/* + * \brief Function writes the TX output power register. + * + * \param value Given register value + * + * \return none + */ +static void rf_if_write_set_tx_power_register(uint8_t value) +{ + rf_if_write_register(PHY_TX_PWR, value); +} + +/* + * \brief Function returns the RF part number. + * + * \param none + * + * \return part number + */ +static uint8_t rf_if_read_part_num(void) +{ + return rf_if_read_register(PART_NUM); +} + +/* + * \brief Function writes the RF settings and initialises SPI interface. + * + * \param none + * + * \return none + */ +static void rf_if_write_rf_settings(void) +{ + /*Reset RF module*/ + rf_if_reset_radio(); + + rf_part_num = rf_if_read_part_num(); + + rf_if_write_register(XAH_CTRL_0,0); + rf_if_write_register(TRX_CTRL_1, 0x20); + + /*CCA Mode - Carrier sense OR energy above threshold. Channel list is set separately*/ + rf_if_write_register(PHY_CC_CCA, 0x05); + + /*Read transceiver PART_NUM*/ + rf_part_num = rf_if_read_register(PART_NUM); + + /*Sub-GHz RF settings*/ + if(rf_part_num == PART_AT86RF212) + { + /*GC_TX_OFFS mode-dependent setting - OQPSK*/ + rf_if_write_register(RF_CTRL_0, 0x32); + + if(rf_if_read_register(VERSION_NUM) == VERSION_AT86RF212B) + { + /*TX Output Power setting - 0 dBm North American Band*/ + rf_if_write_register(PHY_TX_PWR, 0x03); + } + else + { + /*TX Output Power setting - 0 dBm North American Band*/ + rf_if_write_register(PHY_TX_PWR, 0x24); + } + + /*PHY Mode: IEEE 802.15.4-2006/2011 - OQPSK-SIN-250*/ + rf_if_write_register(TRX_CTRL_2, RF_PHY_MODE); + /*Based on receiver Characteristics. See AT86RF212B Datasheet where RSSI BASE VALUE in range -97 - -100 dBm*/ + rf_rssi_base_val = -98; + } + /*2.4GHz RF settings*/ + else + { +#if 0 + /* Disable power saving functions for now - can only impact reliability, + * and don't have any users demanding it. */ + /*Set RPC register*/ + rf_if_write_register(TRX_RPC, RX_RPC_CTRL|RX_RPC_EN|PLL_RPC_EN|XAH_TX_RPC_EN|IPAN_RPC_EN|TRX_RPC_RSVD_1); +#endif + /*PHY Mode: IEEE 802.15.4 - Data Rate 250 kb/s*/ + rf_if_write_register(TRX_CTRL_2, 0); + rf_rssi_base_val = -91; + } +} + +/* + * \brief Function checks the channel availability + * + * \param none + * + * \return 1 Channel clear + * \return 0 Channel not clear + */ +static uint8_t rf_if_check_cca(void) +{ + uint8_t retval = 0; + if(rf_if_read_register(TRX_STATUS) & CCA_STATUS) + { + retval = 1; + } + return retval; +} + +/* + * \brief Function returns the RF state + * + * \param none + * + * \return RF state + */ +static uint8_t rf_if_read_trx_state(void) +{ + return rf_if_read_register(TRX_STATUS) & 0x1F; +} + +/* + * \brief Function reads packet buffer. + * + * \param data_out Output buffer + * \param lqi_out LQI output + * \param ed_out ED output + * \param crc_good CRC good indication + * + * \return PSDU length [0..RF_MTU] + */ +static uint16_t rf_if_read_packet(uint8_t data_out[RF_MTU], uint8_t *lqi_out, uint8_t *ed_out, bool *crc_good) +{ + CS_SELECT(); + rf_if_spi_exchange(0x20); + uint8_t len = rf_if_spi_exchange(0) & 0x7F; + uint8_t *ptr = data_out; + for (uint_fast8_t i = 0; i < len; i++) { + *ptr++ = rf_if_spi_exchange(0); + } + + *lqi_out = rf_if_spi_exchange(0); + *ed_out = rf_if_spi_exchange(0); + *crc_good = rf_if_spi_exchange(0) & 0x80; + CS_RELEASE(); + + return len; +} + +/* + * \brief Function writes RF short address registers + * + * \param short_address Given short address + * + * \return none + */ +static void rf_if_write_short_addr_registers(uint8_t *short_address) +{ + rf_if_write_register(SHORT_ADDR_1, *short_address++); + rf_if_write_register(SHORT_ADDR_0, *short_address); +} + +/* + * \brief Function sets the frame pending in ACK message + * + * \param state Given frame pending state + * + * \return none + */ +static void rf_if_ack_pending_ctrl(uint8_t state) +{ + rf_if_lock(); + if(state) + { + rf_if_set_bit(CSMA_SEED_1, (1 << AACK_SET_PD), (1 << AACK_SET_PD)); + } + else + { + rf_if_clear_bit(CSMA_SEED_1, (1 << AACK_SET_PD)); + } + rf_if_unlock(); +} + +/* + * \brief Function returns the state of frame pending control + * + * \param none + * + * \return Frame pending state + */ +static uint8_t rf_if_last_acked_pending(void) +{ + uint8_t last_acked_data_pending; + + rf_if_lock(); + if(rf_if_read_register(CSMA_SEED_1) & 0x20) + last_acked_data_pending = 1; + else + last_acked_data_pending = 0; + rf_if_unlock(); + + return last_acked_data_pending; +} + +/* + * \brief Function calibrates the RF part. + * + * \param none + * + * \return none + */ +static void rf_if_calibration(void) +{ + rf_if_set_bit(FTN_CTRL, FTN_START, FTN_START); + /*Wait while calibration is running*/ + while(rf_if_read_register(FTN_CTRL) & FTN_START); +} + +/* + * \brief Function writes RF PAN Id registers + * + * \param pan_id Given PAN Id + * + * \return none + */ +static void rf_if_write_pan_id_registers(uint8_t *pan_id) +{ + rf_if_write_register(PAN_ID_1, *pan_id++); + rf_if_write_register(PAN_ID_0, *pan_id); +} + +/* + * \brief Function writes RF IEEE Address registers + * + * \param address Given IEEE Address + * + * \return none + */ +static void rf_if_write_ieee_addr_registers(uint8_t *address) +{ + uint8_t i; + uint8_t temp = IEEE_ADDR_0; + + for(i=0; i<8; i++) + rf_if_write_register(temp++, address[7-i]); +} + +/* + * \brief Function writes data in RF frame buffer. + * + * \param ptr Pointer to data (PSDU, except FCS) + * \param length Pointer to length (PSDU length, minus 2 for FCS) + * + * \return none + */ +static void rf_if_write_frame_buffer(const uint8_t *ptr, uint8_t length) +{ + uint8_t i; + uint8_t cmd = 0x60; + + CS_SELECT(); + rf_if_spi_exchange(cmd); + rf_if_spi_exchange(length + 2); + for(i=0; i<length; i++) + rf_if_spi_exchange(*ptr++); + + CS_RELEASE(); +} + +/* + * \brief Function returns 8-bit random value. + * + * \param none + * + * \return random value + */ +static uint8_t rf_if_read_rnd(void) +{ + uint8_t temp; + uint8_t tmp_rpc_val = 0; + /*RPC must be disabled while reading the random number*/ + if(rf_part_num == PART_AT86RF233) + { + tmp_rpc_val = rf_if_read_register(TRX_RPC); + rf_if_write_register(TRX_RPC, RX_RPC_CTRL|TRX_RPC_RSVD_1); + } + + wait_ms(1); + temp = ((rf_if_read_register(PHY_RSSI)>>5) << 6); + wait_ms(1); + temp |= ((rf_if_read_register(PHY_RSSI)>>5) << 4); + wait_ms(1); + temp |= ((rf_if_read_register(PHY_RSSI)>>5) << 2); + wait_ms(1); + temp |= ((rf_if_read_register(PHY_RSSI)>>5)); + wait_ms(1); + if(rf_part_num == PART_AT86RF233) + rf_if_write_register(TRX_RPC, tmp_rpc_val); + return temp; +} + +/* + * \brief Function changes the state of the RF. + * + * \param trx_state Given RF state + * + * \return none + */ +static void rf_if_change_trx_state(rf_trx_states_t trx_state) +{ + // XXX Lock claim apparently not required + rf_if_lock(); + rf_if_write_register(TRX_STATE, trx_state); + /*Wait while not in desired state*/ + rf_poll_trx_state_change(trx_state); + rf_if_unlock(); +} + +/* + * \brief Function enables the TX END interrupt + * + * \param none + * + * \return none + */ +static void rf_if_enable_tx_end_interrupt(void) +{ + rf_if_set_bit(IRQ_MASK, TRX_END, TRX_END); +} + +/* + * \brief Function enables the RX END interrupt + * + * \param none + * + * \return none + */ +static void rf_if_enable_rx_end_interrupt(void) +{ + rf_if_set_bit(IRQ_MASK, TRX_END, TRX_END); +} + +/* + * \brief Function enables the CCA ED interrupt + * + * \param none + * + * \return none + */ +static void rf_if_enable_cca_ed_done_interrupt(void) +{ + rf_if_set_bit(IRQ_MASK, CCA_ED_DONE, CCA_ED_DONE); +} + +/* + * \brief Function starts the CCA process + * + * \param none + * + * \return none + */ +static void rf_if_start_cca_process(void) +{ + rf_if_set_bit(PHY_CC_CCA, CCA_REQUEST, CCA_REQUEST); +} + +/* + * \brief Function scales RSSI + * + * \param ed_level ED level read from chip + * + * \return appropriately scaled RSSI dBm + */ +static int8_t rf_if_scale_rssi(uint8_t ed_level) +{ + if (rf_part_num == PART_AT86RF212) { + /* Data sheet says to multiply by 1.03 - this is 1.03125, rounding down */ + ed_level += ed_level >> 5; + } + return rf_rssi_base_val + ed_level; +} + +/* + * \brief Function sets the RF channel field + * + * \param Given channel + * + * \return none + */ +static void rf_if_set_channel_register(uint8_t channel) +{ + rf_if_set_bit(PHY_CC_CCA, channel, 0x1f); +} + +/* + * \brief Function enables RF irq pin interrupts in RF interface. + * + * \param none + * + * \return none + */ +static void rf_if_enable_irq(void) +{ + rf->IRQ.enable_irq(); +} + +/* + * \brief Function disables RF irq pin interrupts in RF interface. + * + * \param none + * + * \return none + */ +static void rf_if_disable_irq(void) +{ + rf->IRQ.disable_irq(); +} + +#ifdef MBED_CONF_RTOS_PRESENT +static void rf_if_interrupt_handler(void) +{ + rf->irq_thread.signal_set(SIG_RADIO); +} + +// Started during construction of rf, so variable +// rf isn't set at the start. Uses 'this' instead. +void RFBits::rf_if_irq_task(void) +{ + for (;;) { + osEvent event = irq_thread.signal_wait(0); + if (event.status != osEventSignal) { + continue; + } + rf_if_lock(); + if (event.value.signals & SIG_RADIO) { + rf_if_irq_task_process_irq(); + } + if (event.value.signals & SIG_TIMER_ACK) { + rf_ack_wait_timer_interrupt(); + } + if (event.value.signals & SIG_TIMER_CCA) { + rf_cca_timer_interrupt(); + } + if (event.value.signals & SIG_TIMER_CAL) { + rf_calibration_timer_interrupt(); + } + rf_if_unlock(); + } +} + +static void rf_if_irq_task_process_irq(void) +#else +/* + * \brief Function is a RF interrupt vector. End of frame in RX and TX are handled here as well as CCA process interrupt. + * + * \param none + * + * \return none + */ +static void rf_if_interrupt_handler(void) +#endif +{ + uint8_t irq_status; + + /*Read interrupt flag*/ + irq_status = rf_if_read_register(IRQ_STATUS); + + /*Disable interrupt on RF*/ + rf_if_clear_bit(IRQ_MASK, irq_status); + /*RX start interrupt*/ + if(irq_status & RX_START) + { + } + /*Address matching interrupt*/ + if(irq_status & AMI) + { + } + if(irq_status & TRX_UR) + { + } + /*Frame end interrupt (RX and TX)*/ + if(irq_status & TRX_END) + { + /*TX done interrupt*/ + if(rf_if_read_trx_state() == PLL_ON || rf_if_read_trx_state() == TX_ARET_ON) + { + rf_handle_tx_end(); + } + /*Frame received interrupt*/ + else + { + rf_handle_rx_end(); + } + } + if(irq_status & CCA_ED_DONE) + { + rf_handle_cca_ed_done(); + } +} + +/* + * \brief Function writes/read data in SPI interface + * + * \param out Output data + * + * \return Input data + */ +static uint8_t rf_if_spi_exchange(uint8_t out) +{ + uint8_t v; + v = rf->spi.write(out); + // t9 = t5 = 250ns, delay between LSB of last byte to next MSB or delay between LSB & SEL rising + // [SPI setup assumed slow enough to not need manual delay] + // delay_ns(250); + return v; +} + +/* + * \brief Function sets given RF flag on. + * + * \param x Given RF flag + * + * \return none + */ +static void rf_flags_set(uint8_t x) +{ + rf_flags |= x; +} + +/* + * \brief Function clears given RF flag on. + * + * \param x Given RF flag + * + * \return none + */ +static void rf_flags_clear(uint8_t x) +{ + rf_flags &= ~x; +} + +/* + * \brief Function checks if given RF flag is on. + * + * \param x Given RF flag + * + * \return states of the given flags + */ +static uint8_t rf_flags_check(uint8_t x) +{ + return (rf_flags & x); +} + +/* + * \brief Function clears all RF flags. + * + * \param none + * + * \return none + */ +static void rf_flags_reset(void) +{ + rf_flags = 0; +} + +/* + * \brief Function initialises and registers the RF driver. + * + * \param none + * + * \return rf_radio_driver_id Driver ID given by NET library + */ +static int8_t rf_device_register(const uint8_t *mac_addr) +{ + rf_trx_part_e radio_type; + + rf_init(); + + radio_type = rf_radio_type_read(); + if(radio_type != ATMEL_UNKNOW_DEV) + { + /*Set pointer to MAC address*/ + device_driver.PHY_MAC = (uint8_t *)mac_addr; + device_driver.driver_description = (char*)"ATMEL_MAC"; + //Create setup Used Radio chips + if(radio_type == ATMEL_AT86RF212) + { + device_driver.link_type = PHY_LINK_15_4_SUBGHZ_TYPE; + } + else + { + device_driver.link_type = PHY_LINK_15_4_2_4GHZ_TYPE; + } + device_driver.phy_channel_pages = phy_channel_pages; + /*Maximum size of payload is 127*/ + device_driver.phy_MTU = 127; + /*No header in PHY*/ + device_driver.phy_header_length = 0; + /*No tail in PHY*/ + device_driver.phy_tail_length = 0; + /*Set address write function*/ + device_driver.address_write = &rf_address_write; + /*Set RF extension function*/ + device_driver.extension = &rf_extension; + /*Set RF state control function*/ + device_driver.state_control = &rf_interface_state_control; + /*Set transmit function*/ + device_driver.tx = &rf_start_cca; + /*NULLIFY rx and tx_done callbacks*/ + device_driver.phy_rx_cb = NULL; + device_driver.phy_tx_done_cb = NULL; + /*Register device driver*/ + rf_radio_driver_id = arm_net_phy_register(&device_driver); + } + return rf_radio_driver_id; +} + +/* + * \brief Function unregisters the RF driver. + * + * \param none + * + * \return none + */ +static void rf_device_unregister() +{ + if (rf_radio_driver_id >= 0) { + arm_net_phy_unregister(rf_radio_driver_id); + rf_radio_driver_id = -1; + } +} + +/* + * \brief Enable frame buffer protection + * + * If protection is enabled, reception cannot start - the radio will + * not go into RX_BUSY or write into the frame buffer if in receive mode. + * Setting this won't abort an already-started reception. + * We can still write the frame buffer ourselves. + */ +static void rf_enable_static_frame_buffer_protection(void) +{ + if (!rf_flags_check(RFF_PROT)) { + /* This also writes RX_PDT_LEVEL to 0 - maximum RX sensitivity */ + /* Would need to modify this function if messing with that */ + rf_if_write_register(RX_SYN, RX_PDT_DIS); + rf_flags_set(RFF_PROT); + } +} + +/* + * \brief Disable frame buffer protection + */ +static void rf_disable_static_frame_buffer_protection(void) +{ + if (rf_flags_check(RFF_PROT)) { + /* This also writes RX_PDT_LEVEL to 0 - maximum RX sensitivity */ + /* Would need to modify this function if messing with that */ + rf_if_write_register(RX_SYN, 0); + rf_flags_clear(RFF_PROT); + } +} + + +/* + * \brief Function is a call back for ACK wait timeout. + * + * \param none + * + * \return none + */ +static void rf_ack_wait_timer_interrupt(void) +{ + rf_if_lock(); + expected_ack_sequence = -1; + /*Force PLL state*/ + rf_if_change_trx_state(FORCE_PLL_ON); + rf_poll_trx_state_change(PLL_ON); + /*Start receiver in RX_AACK_ON state*/ + rf_rx_mode = 0; + rf_flags_clear(RFF_RX); + rf_receive(); + rf_if_unlock(); +} + +/* + * \brief Function is a call back for calibration interval timer. + * + * \param none + * + * \return none + */ +static void rf_calibration_timer_interrupt(void) +{ + /*Calibrate RF*/ + rf_calibration_cb(); + /*Start new calibration timeout*/ + rf_calibration_timer_start(RF_CALIBRATION_INTERVAL); +} + +/* + * \brief Function is a call back for cca interval timer. + * + * \param none + * + * \return none + */ +static void rf_cca_timer_interrupt(void) +{ + /*Disable reception - locks against entering BUSY_RX and overwriting frame buffer*/ + rf_enable_static_frame_buffer_protection(); + + if(rf_if_read_trx_state() == BUSY_RX_AACK) + { + /*Reception already started - re-enable reception and say CCA fail*/ + rf_disable_static_frame_buffer_protection(); + if(device_driver.phy_tx_done_cb){ + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 0, 0); + } + } + else + { + /*Load the frame buffer with frame to transmit */ + rf_if_write_frame_buffer(rf_tx_data, rf_tx_length); + /*Make sure we're in RX state to read channel (any way we could not be?)*/ + rf_receive(); + rf_flags_set(RFF_CCA); + /*Start CCA process*/ + rf_if_enable_cca_ed_done_interrupt(); + rf_if_start_cca_process(); + } +} + +/* + * \brief Function starts the ACK wait timeout. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_ack_wait_timer_start(uint16_t slots) +{ + rf_if_ack_wait_timer_start(slots); +} + +/* + * \brief Function starts the calibration interval. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_calibration_timer_start(uint32_t slots) +{ + rf_if_calibration_timer_start(slots); +} + +/* + * \brief Function starts the CCA backoff. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_cca_timer_start(uint32_t slots) +{ + rf_if_cca_timer_start(slots); +} + +/* + * \brief Function stops the CCA backoff. + * + * \return none + */ +static void rf_cca_timer_stop(void) +{ + rf_if_cca_timer_stop(); +} + +/* + * \brief Function stops the ACK wait timeout. + * + * \param none + * + * \return none + */ +static void rf_ack_wait_timer_stop(void) +{ + rf_if_ack_wait_timer_stop(); +} + +/* + * \brief Function writes various RF settings in startup. + * + * \param none + * + * \return none + */ +static void rf_write_settings(void) +{ + rf_if_lock(); + rf_if_write_rf_settings(); + /*Set output power*/ + rf_if_write_set_tx_power_register(radio_tx_power); + /*Initialise Antenna Diversity*/ + if(rf_use_antenna_diversity) + rf_if_write_antenna_diversity_settings(); + rf_if_unlock(); +} + +/* + * \brief Function writes 16-bit address in RF address filter. + * + * \param short_address Given short address + * + * \return none + */ +static void rf_set_short_adr(uint8_t * short_address) +{ + rf_if_lock(); + /*Wake up RF if sleeping*/ + if(rf_flags_check(RFF_ON) == 0) + { + rf_if_disable_slptr(); + rf_poll_trx_state_change(TRX_OFF); + } + /*Write address filter registers*/ + rf_if_write_short_addr_registers(short_address); + /*RF back to sleep*/ + if(rf_flags_check(RFF_ON) == 0) + { + rf_if_enable_slptr(); + } + rf_if_unlock(); +} + +/* + * \brief Function writes PAN Id in RF PAN Id filter. + * + * \param pan_id Given PAN Id + * + * \return none + */ +static void rf_set_pan_id(uint8_t *pan_id) +{ + rf_if_lock(); + /*Wake up RF if sleeping*/ + if(rf_flags_check(RFF_ON) == 0) + { + rf_if_disable_slptr(); + rf_poll_trx_state_change(TRX_OFF); + } + /*Write address filter registers*/ + rf_if_write_pan_id_registers(pan_id); + /*RF back to sleep*/ + if(rf_flags_check(RFF_ON) == 0) + { + rf_if_enable_slptr(); + } + rf_if_unlock(); +} + +/* + * \brief Function writes 64-bit address in RF address filter. + * + * \param address Given 64-bit address + * + * \return none + */ +static void rf_set_address(uint8_t *address) +{ + rf_if_lock(); + /*Wake up RF if sleeping*/ + if(rf_flags_check(RFF_ON) == 0) + { + rf_if_disable_slptr(); + rf_poll_trx_state_change(TRX_OFF); + } + /*Write address filter registers*/ + rf_if_write_ieee_addr_registers(address); + /*RF back to sleep*/ + if(rf_flags_check(RFF_ON) == 0) + { + rf_if_enable_slptr(); + } + rf_if_unlock(); +} + +/* + * \brief Function sets the RF channel. + * + * \param ch New channel + * + * \return none + */ +static void rf_channel_set(uint8_t ch) +{ + rf_if_lock(); + rf_phy_channel = ch; + if(ch < 0x1f) + rf_if_set_channel_register(ch); + rf_if_unlock(); +} + + +/* + * \brief Function initialises the radio driver and resets the radio. + * + * \param none + * + * \return none + */ +static void rf_init(void) +{ + /*Reset RF module*/ + rf_if_reset_radio(); + + rf_if_lock(); + + /*Write RF settings*/ + rf_write_settings(); + /*Initialise PHY mode*/ + rf_init_phy_mode(); + /*Clear RF flags*/ + rf_flags_reset(); + /*Set RF in TRX OFF state*/ + rf_if_change_trx_state(TRX_OFF); + /*Set RF in PLL_ON state*/ + rf_if_change_trx_state(PLL_ON); + /*Start receiver*/ + rf_receive(); + /*Read randomness, and add to seed*/ + randLIB_add_seed(rf_if_read_rnd()); + /*Start RF calibration timer*/ + rf_calibration_timer_start(RF_CALIBRATION_INTERVAL); + + rf_if_unlock(); +} + +/** + * \brief Function gets called when MAC is setting radio off. + * + * \param none + * + * \return none + */ +static void rf_off(void) +{ + if(rf_flags_check(RFF_ON)) + { + rf_if_lock(); + rf_cca_abort(); + uint16_t while_counter = 0; + /*Wait while receiving*/ + while(rf_if_read_trx_state() == BUSY_RX_AACK) + { + while_counter++; + if(while_counter == 0xffff) + break; + } + /*RF state change: RX_AACK_ON->PLL_ON->TRX_OFF->SLEEP*/ + if(rf_if_read_trx_state() == RX_AACK_ON) + { + rf_if_change_trx_state(PLL_ON); + } + rf_if_change_trx_state(TRX_OFF); + rf_if_enable_slptr(); + + /*Disable Antenna Diversity*/ + if(rf_use_antenna_diversity) + rf_if_disable_ant_div(); + rf_if_unlock(); + } + + /*Clears all flags*/ + rf_flags_reset(); +} + +/* + * \brief Function polls the RF state until it has changed to desired state. + * + * \param trx_state RF state + * + * \return none + */ +static void rf_poll_trx_state_change(rf_trx_states_t trx_state) +{ + uint16_t while_counter = 0; + // XXX lock apparently not needed + rf_if_lock(); + + if(trx_state != RF_TX_START) + { + if(trx_state == FORCE_PLL_ON) + trx_state = PLL_ON; + else if(trx_state == FORCE_TRX_OFF) + trx_state = TRX_OFF; + + while(rf_if_read_trx_state() != trx_state) + { + while_counter++; + if(while_counter == 0x1ff) + break; + } + } + rf_if_unlock(); +} + +/* + * \brief Function starts the CCA process before starting data transmission and copies the data to RF TX FIFO. + * + * \param data_ptr Pointer to TX data (excluding FCS) + * \param data_length Length of the TX data (excluding FCS) + * \param tx_handle Handle to transmission + * \return 0 Success + * \return -1 Busy + */ +static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol ) +{ + (void)data_protocol; + rf_if_lock(); + /*Check if transmitter is busy*/ + if(rf_if_read_trx_state() == BUSY_RX_AACK || data_length > RF_MTU - 2) + { + rf_if_unlock(); + /*Return busy*/ + return -1; + } + else + { + expected_ack_sequence = -1; + + /*Nanostack has a static TX buffer, which will remain valid until we*/ + /*generate a callback, so we just note the pointer for reading later.*/ + rf_tx_data = data_ptr; + rf_tx_length = data_length; + /*Start CCA timeout*/ + rf_cca_timer_start(RF_CCA_BASE_BACKOFF + randLIB_get_random_in_range(0, RF_CCA_RANDOM_BACKOFF)); + /*Store TX handle*/ + mac_tx_handle = tx_handle; + rf_if_unlock(); + } + + /*Return success*/ + return 0; +} + +/* + * \brief Function aborts CCA process. + * + * \param none + * + * \return none + */ +static void rf_cca_abort(void) +{ + rf_cca_timer_stop(); + rf_flags_clear(RFF_CCA); + rf_disable_static_frame_buffer_protection(); +} + +/* + * \brief Function starts the transmission of the frame. + * + * \param none + * + * \return none + */ +static void rf_start_tx(void) +{ + /*Only start transmitting from RX state*/ + uint8_t trx_state = rf_if_read_trx_state(); + if(trx_state != RX_AACK_ON) + { + rf_disable_static_frame_buffer_protection(); + if(device_driver.phy_tx_done_cb){ + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 0, 0); + } + } + else + { + /*RF state change: ->PLL_ON->RF_TX_START*/ + rf_if_change_trx_state(FORCE_PLL_ON); + rf_flags_clear(RFF_RX); + /*Now we're out of receive mode, can release protection*/ + rf_disable_static_frame_buffer_protection(); + rf_if_enable_tx_end_interrupt(); + rf_flags_set(RFF_TX); + rf_if_change_trx_state(RF_TX_START); + } +} + +/* + * \brief Function sets the RF in RX state. + * + * \param none + * + * \return none + */ +static void rf_receive(void) +{ + uint16_t while_counter = 0; + if(rf_flags_check(RFF_ON) == 0) + { + rf_on(); + } + /*If not yet in RX state set it*/ + if(rf_flags_check(RFF_RX) == 0) + { + rf_if_lock(); + /*Wait while receiving data*/ + while(rf_if_read_trx_state() == BUSY_RX_AACK) + { + while_counter++; + if(while_counter == 0xffff) + { + break; + } + } + + rf_if_change_trx_state(PLL_ON); + + if((rf_mode == RF_MODE_SNIFFER) || (rf_mode == RF_MODE_ED)) + { + rf_if_change_trx_state(RX_ON); + } + else + { + /*ACK is always received in promiscuous mode to bypass address filters*/ + if(rf_rx_mode) + { + rf_rx_mode = 0; + rf_if_enable_promiscuous_mode(); + } + else + { + rf_if_disable_promiscuous_mode(); + } + rf_if_change_trx_state(RX_AACK_ON); + } + /*If calibration timer was unable to calibrate the RF, run calibration now*/ + if(!rf_tuned) + { + /*Start calibration. This can be done in states TRX_OFF, PLL_ON or in any receive state*/ + rf_if_calibration(); + /*RF is tuned now*/ + rf_tuned = 1; + } + + rf_channel_set(rf_phy_channel); + rf_flags_set(RFF_RX); + // Don't receive packets when ED mode enabled + if (rf_mode != RF_MODE_ED) + { + rf_if_enable_rx_end_interrupt(); + } + rf_if_unlock(); + } +} + +/* + * \brief Function calibrates the radio. + * + * \param none + * + * \return none + */ +static void rf_calibration_cb(void) +{ + /*clear tuned flag to start tuning in rf_receive*/ + rf_tuned = 0; + /*If RF is in default receive state, start calibration*/ + if(rf_if_read_trx_state() == RX_AACK_ON) + { + rf_if_lock(); + /*Set RF in PLL_ON state*/ + rf_if_change_trx_state(PLL_ON); + /*Set RF in TRX_OFF state to start PLL tuning*/ + rf_if_change_trx_state(TRX_OFF); + /*Set RF in RX_ON state to calibrate*/ + rf_if_change_trx_state(RX_ON); + /*Calibrate FTN*/ + rf_if_calibration(); + /*RF is tuned now*/ + rf_tuned = 1; + /*Back to default receive state*/ + rf_flags_clear(RFF_RX); + rf_receive(); + rf_if_unlock(); + } +} + +/* + * \brief Function sets RF_ON flag when radio is powered. + * + * \param none + * + * \return none + */ +static void rf_on(void) +{ + /*Set RFF_ON flag*/ + if(rf_flags_check(RFF_ON) == 0) + { + rf_if_lock(); + rf_flags_set(RFF_ON); + /*Enable Antenna diversity*/ + if(rf_use_antenna_diversity) + /*Set ANT_EXT_SW_EN to enable controlling of antenna diversity*/ + rf_if_enable_ant_div(); + + /*Wake up from sleep state*/ + rf_if_disable_slptr(); + rf_poll_trx_state_change(TRX_OFF); + rf_if_unlock(); + } +} + +/* + * \brief Function handles the received ACK frame. + * + * \param seq_number Sequence number of received ACK + * \param data_pending Pending bit state in received ACK + * + * \return none + */ +static void rf_handle_ack(uint8_t seq_number, uint8_t data_pending) +{ + phy_link_tx_status_e phy_status; + rf_if_lock(); + /*Received ACK sequence must be equal with transmitted packet sequence*/ + if(expected_ack_sequence == seq_number) + { + rf_ack_wait_timer_stop(); + expected_ack_sequence = -1; + /*When data pending bit in ACK frame is set, inform NET library*/ + if(data_pending) + phy_status = PHY_LINK_TX_DONE_PENDING; + else + phy_status = PHY_LINK_TX_DONE; + /*Call PHY TX Done API*/ + if(device_driver.phy_tx_done_cb){ + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle,phy_status, 0, 0); + } + } + rf_if_unlock(); +} + +/* + * \brief Function is a call back for RX end interrupt. + * + * \param none + * + * \return none + */ +static void rf_handle_rx_end(void) +{ + /*Start receiver*/ + rf_flags_clear(RFF_RX); + rf_receive(); + + /*Frame received interrupt*/ + if(!rf_flags_check(RFF_RX)) { + return; + } + + static uint8_t rf_buffer[RF_MTU]; + uint8_t rf_lqi, rf_ed; + int8_t rf_rssi; + bool crc_good; + + /*Read received packet*/ + uint8_t len = rf_if_read_packet(rf_buffer, &rf_lqi, &rf_ed, &crc_good); + if (len < 5 || !crc_good) { + return; + } + + /* Convert raw ED to dBm value (chip-dependent) */ + rf_rssi = rf_if_scale_rssi(rf_ed); + + /* Create a virtual LQI using received RSSI, forgetting actual HW LQI */ + /* (should be done through PHY_EXTENSION_CONVERT_SIGNAL_INFO) */ + rf_lqi = rf_scale_lqi(rf_rssi); + + /*Handle received ACK*/ + if((rf_buffer[0] & 0x07) == 0x02 && rf_mode != RF_MODE_SNIFFER) + { + /*Check if data is pending*/ + bool pending = (rf_buffer[0] & 0x10); + + /*Send sequence number in ACK handler*/ + rf_handle_ack(rf_buffer[2], pending); + } else { + if( device_driver.phy_rx_cb ){ + device_driver.phy_rx_cb(rf_buffer, len - 2, rf_lqi, rf_rssi, rf_radio_driver_id); + } + } +} + +/* + * \brief Function is called when MAC is shutting down the radio. + * + * \param none + * + * \return none + */ +static void rf_shutdown(void) +{ + /*Call RF OFF*/ + rf_off(); +} + +/* + * \brief Function is a call back for TX end interrupt. + * + * \param none + * + * \return none + */ +static void rf_handle_tx_end(void) +{ + rf_rx_mode = 0; + /*If ACK is needed for this transmission*/ + if((rf_tx_data[0] & 0x20) && rf_flags_check(RFF_TX)) + { + expected_ack_sequence = rf_tx_data[2]; + rf_ack_wait_timer_start(rf_ack_wait_duration); + rf_rx_mode = 1; + } + rf_flags_clear(RFF_RX); + /*Start receiver*/ + rf_receive(); + + /*Call PHY TX Done API*/ + if(device_driver.phy_tx_done_cb){ + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_SUCCESS, 0, 0); + } +} + +/* + * \brief Function is a call back for CCA ED done interrupt. + * + * \param none + * + * \return none + */ +static void rf_handle_cca_ed_done(void) +{ + if (!rf_flags_check(RFF_CCA)) { + return; + } + rf_flags_clear(RFF_CCA); + /*Check the result of CCA process*/ + if(rf_if_check_cca()) + { + rf_start_tx(); + } + else + { + /*Re-enable reception*/ + rf_disable_static_frame_buffer_protection(); + /*Send CCA fail notification*/ + if(device_driver.phy_tx_done_cb){ + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 0, 0); + } + } +} + +/* + * \brief Function returns the TX power variable. + * + * \param none + * + * \return radio_tx_power TX power variable + */ +MBED_UNUSED static uint8_t rf_tx_power_get(void) +{ + return radio_tx_power; +} + +/* + * \brief Function enables the usage of Antenna diversity. + * + * \param none + * + * \return 0 Success + */ +MBED_UNUSED static int8_t rf_enable_antenna_diversity(void) +{ + int8_t ret_val = 0; + rf_use_antenna_diversity = 1; + return ret_val; +} + +/* + * \brief Function gives the control of RF states to MAC. + * + * \param new_state RF state + * \param rf_channel RF channel + * + * \return 0 Success + */ +static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel) +{ + int8_t ret_val = 0; + switch (new_state) + { + /*Reset PHY driver and set to idle*/ + case PHY_INTERFACE_RESET: + break; + /*Disable PHY Interface driver*/ + case PHY_INTERFACE_DOWN: + rf_shutdown(); + break; + /*Enable PHY Interface driver*/ + case PHY_INTERFACE_UP: + rf_mode = RF_MODE_NORMAL; + rf_channel_set(rf_channel); + rf_receive(); + rf_if_enable_irq(); + break; + /*Enable wireless interface ED scan mode*/ + case PHY_INTERFACE_RX_ENERGY_STATE: + rf_mode = RF_MODE_ED; + rf_channel_set(rf_channel); + rf_receive(); + rf_if_disable_irq(); + // Read status to clear pending flags. + rf_if_read_register(IRQ_STATUS); + // Must set interrupt mask to be able to read IRQ status. GPIO interrupt is disabled. + rf_if_enable_cca_ed_done_interrupt(); + // ED can be initiated by writing arbitrary value to PHY_ED_LEVEL + rf_if_write_register(PHY_ED_LEVEL, 0xff); + break; + case PHY_INTERFACE_SNIFFER_STATE: /**< Enable Sniffer state */ + rf_mode = RF_MODE_SNIFFER; + rf_channel_set(rf_channel); + rf_flags_clear(RFF_RX); + rf_receive(); + rf_if_enable_irq(); + break; + } + return ret_val; +} + +/* + * \brief Function controls the ACK pending, channel setting and energy detection. + * + * \param extension_type Type of control + * \param data_ptr Data from NET library + * + * \return 0 Success + */ +static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_ptr) +{ + switch (extension_type) + { + /*Control MAC pending bit for Indirect data transmission*/ + case PHY_EXTENSION_CTRL_PENDING_BIT: + if(*data_ptr) + { + rf_if_ack_pending_ctrl(1); + } + else + { + rf_if_ack_pending_ctrl(0); + } + break; + /*Return frame pending status*/ + case PHY_EXTENSION_READ_LAST_ACK_PENDING_STATUS: + *data_ptr = rf_if_last_acked_pending(); + break; + /*Set channel*/ + case PHY_EXTENSION_SET_CHANNEL: + break; + /*Read energy on the channel*/ + case PHY_EXTENSION_READ_CHANNEL_ENERGY: + // End of the ED measurement is indicated by CCA_ED_DONE + while (!(rf_if_read_register(IRQ_STATUS) & CCA_ED_DONE)); + // RF input power: RSSI base level + 1[db] * PHY_ED_LEVEL + *data_ptr = rf_sensitivity + rf_if_read_register(PHY_ED_LEVEL); + // Read status to clear pending flags. + rf_if_read_register(IRQ_STATUS); + // Next ED measurement is started, next PHY_EXTENSION_READ_CHANNEL_ENERGY call will return the result. + rf_if_write_register(PHY_ED_LEVEL, 0xff); + break; + /*Read status of the link*/ + case PHY_EXTENSION_READ_LINK_STATUS: + break; + default: + break; + } + return 0; +} + +/* + * \brief Function sets the addresses to RF address filters. + * + * \param address_type Type of address + * \param address_ptr Pointer to given address + * + * \return 0 Success + */ +static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address_ptr) +{ + int8_t ret_val = 0; + switch (address_type) + { + /*Set 48-bit address*/ + case PHY_MAC_48BIT: + break; + /*Set 64-bit address*/ + case PHY_MAC_64BIT: + rf_set_address(address_ptr); + break; + /*Set 16-bit address*/ + case PHY_MAC_16BIT: + rf_set_short_adr(address_ptr); + break; + /*Set PAN Id*/ + case PHY_MAC_PANID: + rf_set_pan_id(address_ptr); + break; + } + return ret_val; +} + +/* + * \brief Function initialises the ACK wait time and returns the used PHY mode. + * + * \param none + * + * \return tmp Used PHY mode + */ +static void rf_init_phy_mode(void) +{ + uint8_t tmp = 0; + uint8_t part = rf_if_read_part_num(); + /*Read used PHY Mode*/ + tmp = rf_if_read_register(TRX_CTRL_2); + /*Set ACK wait time for used data rate*/ + if(part == PART_AT86RF212) + { + if((tmp & 0x1f) == 0x00) + { + rf_sensitivity = -110; + rf_ack_wait_duration = 938; + tmp = BPSK_20; + } + else if((tmp & 0x1f) == 0x04) + { + rf_sensitivity = -108; + rf_ack_wait_duration = 469; + tmp = BPSK_40; + } + else if((tmp & 0x1f) == 0x14) + { + rf_sensitivity = -108; + rf_ack_wait_duration = 469; + tmp = BPSK_40_ALT; + } + else if((tmp & 0x1f) == 0x08) + { + rf_sensitivity = -101; + rf_ack_wait_duration = 50; + tmp = OQPSK_SIN_RC_100; + } + else if((tmp & 0x1f) == 0x09) + { + rf_sensitivity = -99; + rf_ack_wait_duration = 30; + tmp = OQPSK_SIN_RC_200; + } + else if((tmp & 0x1f) == 0x18) + { + rf_sensitivity = -102; + rf_ack_wait_duration = 50; + tmp = OQPSK_RC_100; + } + else if((tmp & 0x1f) == 0x19) + { + rf_sensitivity = -100; + rf_ack_wait_duration = 30; + tmp = OQPSK_RC_200; + } + else if((tmp & 0x1f) == 0x0c) + { + rf_sensitivity = -100; + rf_ack_wait_duration = 20; + tmp = OQPSK_SIN_250; + } + else if((tmp & 0x1f) == 0x0d) + { + rf_sensitivity = -98; + rf_ack_wait_duration = 25; + tmp = OQPSK_SIN_500; + } + else if((tmp & 0x1f) == 0x0f) + { + rf_sensitivity = -98; + rf_ack_wait_duration = 25; + tmp = OQPSK_SIN_500_ALT; + } + else if((tmp & 0x1f) == 0x1c) + { + rf_sensitivity = -101; + rf_ack_wait_duration = 20; + tmp = OQPSK_RC_250; + } + else if((tmp & 0x1f) == 0x1d) + { + rf_sensitivity = -99; + rf_ack_wait_duration = 25; + tmp = OQPSK_RC_500; + } + else if((tmp & 0x1f) == 0x1f) + { + rf_sensitivity = -99; + rf_ack_wait_duration = 25; + tmp = OQPSK_RC_500_ALT; + } + else if((tmp & 0x3f) == 0x2A) + { + rf_sensitivity = -91; + rf_ack_wait_duration = 25; + tmp = OQPSK_SIN_RC_400_SCR_ON; + } + else if((tmp & 0x3f) == 0x0A) + { + rf_sensitivity = -91; + rf_ack_wait_duration = 25; + tmp = OQPSK_SIN_RC_400_SCR_OFF; + } + else if((tmp & 0x3f) == 0x3A) + { + rf_sensitivity = -97; + rf_ack_wait_duration = 25; + tmp = OQPSK_RC_400_SCR_ON; + } + else if((tmp & 0x3f) == 0x1A) + { + rf_sensitivity = -97; + rf_ack_wait_duration = 25; + tmp = OQPSK_RC_400_SCR_OFF; + } + else if((tmp & 0x3f) == 0x2E) + { + rf_sensitivity = -93; + rf_ack_wait_duration = 13; + tmp = OQPSK_SIN_1000_SCR_ON; + } + else if((tmp & 0x3f) == 0x0E) + { + rf_sensitivity = -93; + rf_ack_wait_duration = 13; + tmp = OQPSK_SIN_1000_SCR_OFF; + } + else if((tmp & 0x3f) == 0x3E) + { + rf_sensitivity = -95; + rf_ack_wait_duration = 13; + tmp = OQPSK_RC_1000_SCR_ON; + } + else if((tmp & 0x3f) == 0x1E) + { + rf_sensitivity = -95; + rf_ack_wait_duration = 13; + tmp = OQPSK_RC_1000_SCR_OFF; + } + } + else + { + rf_sensitivity = -101; + rf_ack_wait_duration = 20; + } + /*Board design might reduces the sensitivity*/ + //rf_sensitivity += RF_SENSITIVITY_CALIBRATION; +} + + +static uint8_t rf_scale_lqi(int8_t rssi) +{ + uint8_t scaled_lqi; + + /*rssi < RF sensitivity*/ + if(rssi < rf_sensitivity) + scaled_lqi=0; + /*-91 dBm < rssi < -81 dBm (AT86RF233 XPro)*/ + /*-90 dBm < rssi < -80 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 10)) + scaled_lqi=31; + /*-81 dBm < rssi < -71 dBm (AT86RF233 XPro)*/ + /*-80 dBm < rssi < -70 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 20)) + scaled_lqi=207; + /*-71 dBm < rssi < -61 dBm (AT86RF233 XPro)*/ + /*-70 dBm < rssi < -60 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 30)) + scaled_lqi=255; + /*-61 dBm < rssi < -51 dBm (AT86RF233 XPro)*/ + /*-60 dBm < rssi < -50 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 40)) + scaled_lqi=255; + /*-51 dBm < rssi < -41 dBm (AT86RF233 XPro)*/ + /*-50 dBm < rssi < -40 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 50)) + scaled_lqi=255; + /*-41 dBm < rssi < -31 dBm (AT86RF233 XPro)*/ + /*-40 dBm < rssi < -30 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 60)) + scaled_lqi=255; + /*-31 dBm < rssi < -21 dBm (AT86RF233 XPro)*/ + /*-30 dBm < rssi < -20 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 70)) + scaled_lqi=255; + /*rssi > RF saturation*/ + else if(rssi > (rf_sensitivity + 80)) + scaled_lqi=111; + /*-21 dBm < rssi < -11 dBm (AT86RF233 XPro)*/ + /*-20 dBm < rssi < -10 dBm (AT86RF212B XPro)*/ + else + scaled_lqi=255; + + return scaled_lqi; +} + +NanostackRfPhyAtmel::NanostackRfPhyAtmel(PinName spi_mosi, PinName spi_miso, + PinName spi_sclk, PinName spi_cs, PinName spi_rst, PinName spi_slp, PinName spi_irq, + PinName i2c_sda, PinName i2c_scl) + : _mac(i2c_sda, i2c_scl), _mac_addr(), _rf(NULL), _mac_set(false), + _spi_mosi(spi_mosi), _spi_miso(spi_miso), _spi_sclk(spi_sclk), + _spi_cs(spi_cs), _spi_rst(spi_rst), _spi_slp(spi_slp), _spi_irq(spi_irq) +{ + _rf = new RFBits(_spi_mosi, _spi_miso, _spi_sclk, _spi_cs, _spi_rst, _spi_slp, _spi_irq); +} + +NanostackRfPhyAtmel::~NanostackRfPhyAtmel() +{ + delete _rf; +} + +int8_t NanostackRfPhyAtmel::rf_register() +{ + if (NULL == _rf) { + return -1; + } + + rf_if_lock(); + + if (rf != NULL) { + rf_if_unlock(); + error("Multiple registrations of NanostackRfPhyAtmel not supported"); + return -1; + } + + // Read the mac address if it hasn't been set by a user + rf = _rf; + if (!_mac_set) { + int ret = _mac.read_eui64((void*)_mac_addr); + if (ret < 0) { + rf = NULL; + rf_if_unlock(); + return -1; + } + } + + int8_t radio_id = rf_device_register(_mac_addr); + if (radio_id < 0) { + rf = NULL; + } + + rf_if_unlock(); + return radio_id; +} + +void NanostackRfPhyAtmel::rf_unregister() +{ + rf_if_lock(); + + if (NULL == rf) { + rf_if_unlock(); + return; + } + + rf_device_unregister(); + rf = NULL; + + rf_if_unlock(); +} + +void NanostackRfPhyAtmel::get_mac_address(uint8_t *mac) +{ + rf_if_lock(); + + if (NULL == rf) { + error("NanostackRfPhyAtmel Must be registered to read mac address"); + rf_if_unlock(); + return; + } + memcpy((void*)mac, (void*)_mac_addr, sizeof(_mac_addr)); + + rf_if_unlock(); +} + +void NanostackRfPhyAtmel::set_mac_address(uint8_t *mac) +{ + rf_if_lock(); + + if (NULL != rf) { + error("NanostackRfPhyAtmel cannot change mac address when running"); + rf_if_unlock(); + return; + } + memcpy((void*)_mac_addr, (void*)mac, sizeof(_mac_addr)); + _mac_set = true; + + rf_if_unlock(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/source/at24mac.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016-2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "at24mac.h" + +/* Device addressing */ +#define AT24MAC_EEPROM_ADDRESS (0x0A<<4) +#define AT24MAC_RW_PROTECT_ADDRESS (0x06<<4) +#define AT24MAC_SERIAL_ADDRESS (0x0B<<4) + +/* Known memory blocks */ +#define AT24MAC_SERIAL_OFFSET (0x80) +#define AT24MAC_EUI64_OFFSET (0x98) +#define AT24MAC_EUI48_OFFSET (0x9A) + +#define SERIAL_LEN 16 +#define EUI64_LEN 8 +#define EUI48_LEN 6 + +AT24Mac::AT24Mac(PinName sda, PinName scl) : _i2c(sda, scl) +{ + // Do nothing +} + +int AT24Mac::read_serial(void *buf) +{ + char offset = AT24MAC_SERIAL_OFFSET; + if (_i2c.write(AT24MAC_SERIAL_ADDRESS, &offset, 1, true)) + return -1; //No ACK + return _i2c.read(AT24MAC_SERIAL_ADDRESS, (char*)buf, SERIAL_LEN); +} + +int AT24Mac::read_eui64(void *buf) +{ + char offset = AT24MAC_EUI64_OFFSET; + if (_i2c.write(AT24MAC_SERIAL_ADDRESS, &offset, 1, true)) + return -1; //No ACK + return _i2c.read(AT24MAC_SERIAL_ADDRESS, (char*)buf, EUI64_LEN); +} + +int AT24Mac::read_eui48(void *buf) +{ + char offset = AT24MAC_EUI48_OFFSET; + if (_i2c.write(AT24MAC_SERIAL_ADDRESS, &offset, 1, true)) + return -1; //No ACK + return _i2c.read(AT24MAC_SERIAL_ADDRESS, (char*)buf, EUI48_LEN); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/atmel-rf-driver/source/at24mac.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef AT24MAC_H +#define AT24MAC_H + +#include "PinNames.h" +#include "I2C.h" + +/* + * AT24MAC drivers. + * + * This is a EEPROM chip designed to contain factory programmed read-only EUI-64 or EUI-48, + * a 128bit serial number and some user programmable EEPROM. + * + * AT24MAC602 contains EUI-64, use read_eui64() + * AT24MAC402 contains EUI-64, use read_eui48() + * + * NOTE: You cannot use both EUI-64 and EUI-48. Chip contains only one of those. + */ + +class AT24Mac { +public: + AT24Mac(PinName sda, PinName scl); + + /** + * Read unique serial number from chip. + * \param buf pointer to write serial number to. Must have space for 16 bytes. + * \return zero on success, negative number on failure + */ + int read_serial(void *buf); + + /** + * Read EUI-64 from chip. + * \param buf pointer to write EUI-64 to. Must have space for 8 bytes. + * \return zero on success, negative number on failure + */ + int read_eui64(void *buf); + + /** + * Read EUI-48 from chip. + * \param buf pointer to write EUI-48 to. Must have space for 6 bytes. + * \return zero on success, negative number on failure + */ + int read_eui48(void *buf); + +private: + mbed::I2C _i2c; +}; + +#endif /* AT24MAC_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/easy-connect.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,131 @@ +#ifndef __MAGIC_CONNECT_H__ +#define __MAGIC_CONNECT_H__ + +#include "mbed.h" + +#define ETHERNET 1 +#define WIFI_ESP8266 2 +#define MESH_LOWPAN_ND 3 +#define MESH_THREAD 4 +#define WIFI_ODIN 5 + +#if MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ESP8266 +#include "ESP8266Interface.h" + +#ifdef MBED_CONF_APP_ESP8266_DEBUG +ESP8266Interface wifi(MBED_CONF_APP_ESP8266_TX, MBED_CONF_APP_ESP8266_RX, MBED_CONF_APP_ESP8266_DEBUG); +#else +ESP8266Interface wifi(MBED_CONF_APP_ESP8266_TX, MBED_CONF_APP_ESP8266_RX); +#endif + +#elif MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ODIN +#include "OdinWiFiInterface.h" +OdinWiFiInterface wifi; +#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET +#include "EthernetInterface.h" +EthernetInterface eth; +#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND +#define MESH +#include "NanostackInterface.h" +LoWPANNDInterface mesh; +#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD +#define MESH +#include "NanostackInterface.h" +ThreadInterface mesh; +#else +#error "No connectivity method chosen. Please add 'config.network-interfaces.value' to your mbed_app.json (see README.md for more information)." +#endif + +#if defined(MESH) +#if MBED_CONF_APP_MESH_RADIO_TYPE == ATMEL +#include "NanostackRfPhyAtmel.h" +NanostackRfPhyAtmel rf_phy(ATMEL_SPI_MOSI, ATMEL_SPI_MISO, ATMEL_SPI_SCLK, ATMEL_SPI_CS, + ATMEL_SPI_RST, ATMEL_SPI_SLP, ATMEL_SPI_IRQ, ATMEL_I2C_SDA, ATMEL_I2C_SCL); +#elif MBED_CONF_APP_MESH_RADIO_TYPE == MCR20 +#include "NanostackRfPhyMcr20a.h" +NanostackRfPhyMcr20a rf_phy(MCR20A_SPI_MOSI, MCR20A_SPI_MISO, MCR20A_SPI_SCLK, MCR20A_SPI_CS, MCR20A_SPI_RST, MCR20A_SPI_IRQ); +#endif //MBED_CONF_APP_RADIO_TYPE +#endif //MESH + +#ifndef MESH +// This is address to mbed Device Connector +#define MBED_SERVER_ADDRESS "coap://api.connector.mbed.com:5684" +#else +// This is address to mbed Device Connector +#define MBED_SERVER_ADDRESS "coaps://[2607:f0d0:2601:52::20]:5684" +#endif + +#ifdef MBED_CONF_APP_ESP8266_SSID +#define MBED_CONF_APP_WIFI_SSID MBED_CONF_APP_ESP8266_SSID +#endif + +#ifdef MBED_CONF_APP_ESP8266_PASSWORD +#define MBED_CONF_APP_WIFI_PASSWORD MBED_CONF_APP_ESP8266_PASSWORD +#endif + + +NetworkInterface* easy_connect(bool log_messages = false) { + NetworkInterface* network_interface = 0; + int connect_success = -1; +#if MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ESP8266 + if (log_messages) { + printf("[EasyConnect] Using WiFi (ESP8266) \n"); + printf("[EasyConnect] Connecting to WiFi %s\n", MBED_CONF_APP_WIFI_SSID); + } + connect_success = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2); + network_interface = &wifi; +#elif MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ODIN + if (log_messages) { + printf("[EasyConnect] Using WiFi (ODIN) \n"); + printf("[EasyConnect] Connecting to WiFi %s\n", MBED_CONF_APP_WIFI_SSID); + } + connect_success = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2); + network_interface = &wifi; +#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET + if (log_messages) { + printf("[EasyConnect] Using Ethernet\n"); + } + connect_success = eth.connect(); + network_interface = ð +#endif +#ifdef MESH + if (log_messages) { + printf("[EasyConnect] Using Mesh\n"); + printf("[EasyConnect] Connecting to Mesh..\n"); + } + mesh.initialize(&rf_phy); + connect_success = mesh.connect(); + network_interface = &mesh; +#endif + if(connect_success == 0) { + if (log_messages) { + printf("[EasyConnect] Connected to Network successfully\n"); + } + } else { + if (log_messages) { + printf("[EasyConnect] Connection to Network Failed %d!\n", connect_success); + } + return NULL; + } + const char *ip_addr = network_interface->get_ip_address(); + const char *mac_addr = network_interface->get_mac_address(); + if (ip_addr == NULL) { + if (log_messages) { + printf("[EasyConnect] ERROR - No IP address\n"); + } + return NULL; + } + if (mac_addr == NULL) { + if (log_messages) { + printf("[EasyConnect] ERROR - No MAC address\n"); + } + return NULL; + } + if (log_messages) { + printf("[EasyConnect] IP address %s\n", ip_addr); + printf("[EasyConnect] MAC address %s\n", mac_addr); + } + return network_interface; +} + +#endif // __MAGIC_CONNECT_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/esp8266-driver/#4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,7 @@ +e47620ee6560c710adba1067e8e52937c4eacf3c branch 'master' of https://github.com/ARMmbed/esp8266-driver +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb not-for-merge branch 'firmware-0.2' of https://github.com/ARMmbed/esp8266-driver +e47620ee6560c710adba1067e8e52937c4eacf3c not-for-merge branch 'firmware-2.0' of https://github.com/ARMmbed/esp8266-driver +63cefc73abddc2637cafb0b5785bc2ef4b8ac280 not-for-merge branch 'imsherlock' of https://github.com/ARMmbed/esp8266-driver +d48a1b10b59a136a78b10e8625f8b3cff82670c9 not-for-merge branch 'new_at' of https://github.com/ARMmbed/esp8266-driver +a38dbbaf66265199af60050cabc6618c4b530edc not-for-merge branch 'testing' of https://github.com/ARMmbed/esp8266-driver +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb not-for-merge tag 'v1.2' of https://github.com/ARMmbed/esp8266-driver
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/esp8266-driver/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file easy-connect/esp8266-driver/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores +ESP8266/ATParser \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199000 +0000 clone: from https://github.com/ARMmbed/esp8266-driver/ +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199001 +0000 checkout: moving from master to 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199001 +0000 checkout: moving from 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb to master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199000 +0000 clone: from https://github.com/ARMmbed/esp8266-driver/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199000 +0000 clone: from https://github.com/ARMmbed/esp8266-driver/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/remotes/origin/firmware-0.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787109 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/remotes/origin/firmware-2.0 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 e47620ee6560c710adba1067e8e52937c4eacf3c www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787109 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/remotes/origin/imsherlock Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 63cefc73abddc2637cafb0b5785bc2ef4b8ac280 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787109 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb e47620ee6560c710adba1067e8e52937c4eacf3c www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787109 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/remotes/origin/new_at Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d48a1b10b59a136a78b10e8625f8b3cff82670c9 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787109 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/logs/refs/remotes/origin/testing Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 a38dbbaf66265199af60050cabc6618c4b530edc www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787109 +0000 fetch --append origin: storing head
Binary file easy-connect/esp8266-driver/.git/objects/01/8fbc674478dd2eb5b84c589c10471daba6edef has changed
Binary file easy-connect/esp8266-driver/.git/objects/02/2372c94a9903461f16cbc21f3e711efab2320a has changed
Binary file easy-connect/esp8266-driver/.git/objects/06/49189479546e12b04914acae29043997585e91 has changed
Binary file easy-connect/esp8266-driver/.git/objects/07/bcb9b245abc132562d04eda40e8a19f1597603 has changed
Binary file easy-connect/esp8266-driver/.git/objects/09/3cbfaa677ad0f1a8b2e9e71e5eb3c9b59e5c6c has changed
Binary file easy-connect/esp8266-driver/.git/objects/09/43031a3a5749aa92978403ddda1c150697fc05 has changed
Binary file easy-connect/esp8266-driver/.git/objects/0a/bc1ccd429ef3c2f4cd7db7ec130d6405ba2487 has changed
Binary file easy-connect/esp8266-driver/.git/objects/0e/94baad889ef2944d106c6da8910fdf946e2559 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/12/40d829f74657234ccb6a2314d3604017569be7 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x[jÃ0DûUÜ ÔèaK2ÒBóRH7 ÇU,YFíW ]@?g3̸Rl zj\xÊ$*&gË,*>R.(&ÃçQÛÚO6Spm0¢×ÊP(?YC=J7¢ÒZê éh4%foK.p6Å,p2¥.pxá!^MIËéØ8SNg.4<ÓRÒÝ>±á?a&`ýÁä½ÄöÍ´h¯·Øà cÝ +ÖXÒ9ŵÏtY/X¡exûºÃɬ¾ä#ßÀçøµÂ5çï}û¯¼_8?5RöûµwýrÙmr \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/12/d735332b666f81d8df1a90a5b8c278240c70f3 has changed
Binary file easy-connect/esp8266-driver/.git/objects/16/2b2928e8077fcca7c6e1b68fabebe140a545f2 has changed
Binary file easy-connect/esp8266-driver/.git/objects/16/80c8292e1addcea4defbe1d2469c4106964e89 has changed
Binary file easy-connect/esp8266-driver/.git/objects/18/7bb094d5f1910589e4bd343db0ce1fa0868c5f has changed
Binary file easy-connect/esp8266-driver/.git/objects/19/6587025cf513267b3951ed7ae861f6b5887854 has changed
Binary file easy-connect/esp8266-driver/.git/objects/19/99dae3ef80f9c4cb363ee01d9696dca1e4ad61 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/1c/f9de7a21e429683d2eb0b66fe432ed62076940 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xÑJÄ0E}ÎWûîIÒd">ëL -Òí¤âç[ëø4áÞÃIë²Ì¬w½@ÙÖì2æTu4Lät¼.>¹Xuã*×ãHH¦8Ça@#}6qLÁ:æX°`̦(Þú´VxêÜúz¤Â+·¾4áiëòÍí,y{t>ÜëAkÑßþ¿ê]¾¤v8]d·ç.0_w`á$Pêº@ë>÷'¼\ÞÈxRêcÔc×àÏHtL½%[&(:Æ´L&}DögõÞokû \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/1d/a853686baeb82ad49a3096a35a6039e3784d0f has changed
Binary file easy-connect/esp8266-driver/.git/objects/1f/ebc6b296641ca1db45adc9dbeb6cd07a0c826f has changed
Binary file easy-connect/esp8266-driver/.git/objects/1f/fb7d341d8e640475216fbe547a27a414b6da8c has changed
Binary file easy-connect/esp8266-driver/.git/objects/21/64526e41311aee415f075c54bb08f7385f64d6 has changed
Binary file easy-connect/esp8266-driver/.git/objects/22/3dd241b1fc8f44dd138118cf6fec74cd1a9bc0 has changed
Binary file easy-connect/esp8266-driver/.git/objects/24/3b477fac9d76157265e1dcaecb098442120abf has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/26/581eb19513048e546c17a6b7e8c666144dcc01 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xM0F]÷sÉtúã\qiÄDÀºðöàò}y_òò:ÏÏ +DáT*·½%ÇÁ;ÛyrÚ!æ10%4·]*XbÅѳÛåsNN¨µ<´ï\Lê|ê´è¥Èw)ÛnRæ&¯ó,GpÆÑìëXõ¯³éë÷¥'Yº¥F5 \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/28/42cffee5a2e5ced2dd2be10ebef3706f615b42 has changed
Binary file easy-connect/esp8266-driver/.git/objects/29/cc547a20c724f7bc42b054348b67bbeaed6b19 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/29/d63ae2ee0a233e2fbd9577cdddc7661bb783d1 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xm»NÄ0D©óW¢ÞÅv®GZ¡Ý +møäØ×I´y?$öï QQMsæhÆ®ó<f¨Uý#´è¡ò(ÛFc97BwÒZ ´A"åDSiÉYË ÖJzßµl;OÒxÞÖJp ÈzóÇ«ÚÉ%¹½ðLÛÚ8ÿ]ã(µEÝrR¼Æ¦2%knw8ÙÁ¤Lñ\2}t$WcÃ` p`±Êþ\Ù0xókéà´¬Ât?÷cJwÜjÕbOÊ4A¤B)ã×.o×¹#÷V{£|0ÖRعH)UÕÅ9H%5fðÛØH¹Äe\z´ÍøåvÕ®xß_$»v \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/2b/043ceb297fac4e61b9692b067dc0aa687e908e Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xOANÃ0äìWìØqÁ ¨ÖÞubØí@û{L%>ÀiwF3³³.k¨ ÌxS33uÆ©I;+µ×Ö"I©ï¤âò^r¯Ä 3Ç +äÔÞÁá¸ßÓd&D=õ^éÑô¼áÎJÛ·º¤OK¥¦ÓÂ^±Ô6îÝr]·Êg,·LÛtzFÉAØI#¥p×¢¿úGpf\m·P/À9§\Àç´KÑWCaåÕ¶C~ §Xxfbó6ÕÞ¹~§||GÇþÈîx'v0s{¹T{¸rÃHt X ógñÕ»}Þ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/2b/ac3dde128ea49dfedcf71a634d278a4d183721 has changed
Binary file easy-connect/esp8266-driver/.git/objects/2c/b42275ecb72337156ccc82bd4b294c76478cc8 has changed
Binary file easy-connect/esp8266-driver/.git/objects/2d/4c36ef2e6528e1c8327babe5bedd834d6e558d has changed
Binary file easy-connect/esp8266-driver/.git/objects/2e/9e58d448e915e171348d6fcc3881e007359e87 has changed
Binary file easy-connect/esp8266-driver/.git/objects/30/4227415488b0db76635ed7b076be88ea72c82f has changed
Binary file easy-connect/esp8266-driver/.git/objects/31/3aadb81afac687759a7eeb81ab3bd6b807ca59 has changed
Binary file easy-connect/esp8266-driver/.git/objects/35/4b47b19c9e48a6d2cc99bfb84838355ff8e59b has changed
Binary file easy-connect/esp8266-driver/.git/objects/36/dcaec219088ae255ccd1b63a6bd213ea08b43a has changed
Binary file easy-connect/esp8266-driver/.git/objects/37/084b5e2bef8a8997323b0afb3d664c5143a7ed has changed
Binary file easy-connect/esp8266-driver/.git/objects/38/c12f7dbe69c61cef096709267bef8ee7b46233 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/3b/6d076031a93285f075bf9342b24b64db0e6082 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xANÃ0EY糡VvÇlX°qñxÜX$vä¸M{{°ÿÿ§OiBÕÈ»Á÷Æ6Ò)o´U§,×$)¬Ê ©µnU5cæXÀµE_wÞíXw¦¯ éÑ·%ê©V,q Ç2¤aÀ0ÂWIéOëô²LÉñ>åÃ3ȦÕ}£ð(¤Ýü +ÿ?Y}Ï; ÖPxýÎà¯"»ÝiDÀèÀ"ý¬7p±Ø0rÙÃ[8ßÂÑ,e+¹ÑGï9³[8a8þu b*0g^¶gî¯kÕ/àçpj \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/3d/baeb9a786c00447aba43594d338a54bb632497 has changed
Binary file easy-connect/esp8266-driver/.git/objects/3f/94dc2b3588b4bd00580ad52d1e3f2ee3606269 has changed
Binary file easy-connect/esp8266-driver/.git/objects/40/050a429b64dacc27067d0c6f5ec1aa9858cedd has changed
Binary file easy-connect/esp8266-driver/.git/objects/43/a7b0081a3680c6bb5d7d423466d1e28bf62dbf has changed
Binary file easy-connect/esp8266-driver/.git/objects/45/0cc128865ffb90b5cbfe5af193621644024fa7 has changed
Binary file easy-connect/esp8266-driver/.git/objects/46/8b1d817767e921e96c76b5c0cc2ce6255d6660 has changed
Binary file easy-connect/esp8266-driver/.git/objects/4a/3f18ae22a0402db6001e0b2145f79693c66a7f has changed
Binary file easy-connect/esp8266-driver/.git/objects/4d/b995261bedf198ea3805bb29712bd9d5abff06 has changed
Binary file easy-connect/esp8266-driver/.git/objects/4d/d9590c534870fb588f737b862c3b3332be35ac has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/4e/d87bf7fe37d5ba0de6c4e78868f604a82f8ecb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +xmËJ1E]÷W¸Í³; ÌàÂÙ.üJR4ôË<Àù{ã;WUÎ¥¨ë¶e +H-J"A#iã24rM|àRßç¤1¤ÉÝÖ6¼A/¸öÖséñ9zRÂöZýç= +gÆ¢dQJzTbpÁºlCcµÄ-ÁkLS.Û)Ásiãèâ}9ÕBßÈ×àÊ(¡£4XÏXçîýúoS¹TÇuK´Ï·Óu*±Ú§&üëÞ)] ö:Ïè«R.ð(´-1a\0åx{Ærð´wÝÙ{òpþüh¸ÃZ;XæÉB³hõ´ºÛ±q_ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/50/35acbf503ac58e45567c1a4bec1fdbf350039b has changed
Binary file easy-connect/esp8266-driver/.git/objects/50/c31750c3a5b742d95c1fbfba439a626f96809c has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/52/e9d2e8c9161173934c4b6ea9c966581729ee0b Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x+)JMU06c040031QÈMÌÌÓK.(``óR'´ÁSdÍ:MËéqV \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/53/0ab25e04af1e276c73b85c0e52ec7f82e10a3f has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/55/2a4e64cebc9be7747f92282c391fdc606e8f73 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +x¥RMÚ0ì9¿b´VªzØ"D+±|´H»Uà$/Ä"¶SÛÙhÿ}éǪ·ûÍ7o&ieR?ß p( ËývüááßåJ"·ò , +c¡RÊc㢠ßØìÿ,û·ÊäMEQ4`%j %0FGý+Æ!3 5rYdI{¸RÔä t+7DÚx(ã<¤ªõA=<ãf¶YâÍ,Hîp¨9[¡ën¥/G8(q!¸uùRx¼·ìT£®_8« iE¿ÉSU¦ESçÂÎÌiÒûÚM$§ªLMv|{N< åÛÚI+/2éM¿u$Qr^êsçqïQ%S+ì+ËÐ^HíX,ñ Ukò±xîâgÞF£°Fõñ0+<§ÇM^T_+ó§ugìÕÈð(ûLoóÝã:)ÁòÌë*§ê§àâ¤&ÑétB*\ °knRû=þR;¥´!bæ,$DãÔ>úÅØc:ß<o×O˾.wËϦÙnÑßõÕ'¼G¼$/ã|õåxÓpÜï×O÷wÓp^»ïîÿ ÛÎöûgû?Q¶Ñ,ÿÿÔ8 +>E?c:%J \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/56/c1ae161bfe5be7d0a121218aae8e341931031e has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/58/8eb441e386da562bc0b29358186a0414b2eb21 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x=»N1D©÷+nìõs¥ Hé"(¨¯íkÅÚ#¯E|=nÎHg4>ÏsªÐkùP u÷jà}$-Þ£ 2SÖ0ï]wÇBK= +?ÈàEtEä<£AÙ`¬ ÜxºÃÞr3J#¼có¾ nÒ:á~Ò²}|K#¸±L2xd±®µíg¥oÛºÂy«SËÇÒààþàeþrÙÃSMT õÞ[!ôÙÜa¡>Òkº,m8¢'x¹^ºßoUÍ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/58/e9a0ed3ecc7e05ddf9578c6153c2a4882e8484 has changed
Binary file easy-connect/esp8266-driver/.git/objects/59/5c4b18c24a7bcc0c78aa6c538978299ce488b2 has changed
Binary file easy-connect/esp8266-driver/.git/objects/5b/4738e954bf4334154f93579a3e871ad02e4381 has changed
Binary file easy-connect/esp8266-driver/.git/objects/5d/35319edb89b41476697866cc92914d20be4329 has changed
Binary file easy-connect/esp8266-driver/.git/objects/5e/31998809add627f26fe3e3319a51b76e9ee1eb has changed
Binary file easy-connect/esp8266-driver/.git/objects/5f/6cb27a3390f822d87486ca58d8e22d0630476b has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/60/7744089602deb46784e2f5d7bd815837f65a1f Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,4 @@ +xÐQJÄ0`s¹ÀJ4i"."¸Â4ùkBm³¦SõøvðiæáçûñyÖÝ T¨½¶¬Q-*ßjÕô®éB«ë`aLÄÅÌLºÆ© +µêl«B/{kÔZ!X%ÛÕR¸c.ôKZ8_" +=» ·qçã¾<¬·Ü"¬÷TÕ¶k¤ªLEi¤~?ôÿÑlÐ!! ôܽßv~¤ S¿ÁÃ:{Ny&Îôôznµ§yk/}ÄBnG +>×T0]°Å9fðw.ãaÉ~Óñ|¿VÆqy \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/63/6af254ddfee68e83cd550e5184e253efa469a0 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/63/cefc73abddc2637cafb0b5785bc2ef4b8ac280 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x¥OÛJÄ0ô9_qØwËÉ¥M"îÈê¤'Û°mS¬àßÔ|aOÛ+hjf0"GÚªàл#ÛÙ³qö4ÛÄA÷ +¨TóúÉÐ4¡6rðÎ+4[)9SZ! º×%e¸|Òoç5ù<åF»+¿ÂËu£¸v>mÏ Íd´}ð=¢hjZù_!âÂ+Îó÷+Ä=ÖH+*_¡Ü#åzâ}ò·»ÀO÷ßvâ,LhË \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/63/da515ed94f2f08c3adf90b51458c4891e61347 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xÁJÅ0E]÷+æ$¤)(nüN&¶<Úd +~¾õ-Ü»ºwq8.û¾)¸´ÀÉ~[K..9`H(JMôÙºÏyÍ.Y<e;ÁÙhf:u- Þ׶u-uÔõg^ïçõTù¦þ$é|5££GãøúËÿO1á-%IÐÏZKSÈWN=Û±_PåRSJMzÜʽðMô¥êðF_m \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/65/f1bd80dc0d4adf6e984a225c0c37b98788fd7c has changed
Binary file easy-connect/esp8266-driver/.git/objects/69/aa3c94dc3fbc0fa13e539c0e958d787d17c8a6 has changed
Binary file easy-connect/esp8266-driver/.git/objects/6b/c5adb00823cae6f5d233babb9629f4d1f2a1a6 has changed
Binary file easy-connect/esp8266-driver/.git/objects/6f/c14e3cc6a40c322c8e5c4d8a2e9da552537027 has changed
Binary file easy-connect/esp8266-driver/.git/objects/70/9fc036051c390ce68c83f49178def9e3bc8fdd has changed
Binary file easy-connect/esp8266-driver/.git/objects/71/cc5953f21d106855490b4ff1b08472472c3a3d has changed
Binary file easy-connect/esp8266-driver/.git/objects/72/02907f786dec6fedf5618a1df556ebf15679c1 has changed
Binary file easy-connect/esp8266-driver/.git/objects/74/b05f50b0d7e5e40753dceb5b55f44776572277 has changed
Binary file easy-connect/esp8266-driver/.git/objects/76/27ac0bc2f5d7e79d81861e328d7a44757e81d0 has changed
Binary file easy-connect/esp8266-driver/.git/objects/77/d37a0a4d1dcf2348571c8407560f6786e4daf3 has changed
Binary file easy-connect/esp8266-driver/.git/objects/7b/0c8295c4cdacfca8e2d43ded3b2c3722666851 has changed
Binary file easy-connect/esp8266-driver/.git/objects/83/1e027303af67fcf6df5adb872b801f6449ee3b has changed
Binary file easy-connect/esp8266-driver/.git/objects/83/76fae074f632e3ca81ce6dfc91944c3cb11847 has changed
Binary file easy-connect/esp8266-driver/.git/objects/84/cfa3f82832ab38317e00c595ada26082a85c9f has changed
Binary file easy-connect/esp8266-driver/.git/objects/85/42c211a5de5eeccef8a9a9997f9321ba6d880c has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/85/92c80138ba308aa332f6a427cfd97ac6eb3329 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xÁiÄ0DsV¿IdBÈvHøÖ¯ +yµí> +¤æðÞL:rÞÙ_ZÈbâ\Äl<ÌdF%¬)1h=~FÔ+J#æeµË*Å/VGÌVÀÎ.Á{ë?ÚvTúâʽ¿1d®ç6 \÷Ôkæý6¤#¿qÑYFíèUUoûÎÿ#¨.ßÝÚ9|Óþè¶/$¸£JzªµVm \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/85/fbaf1da3ed19b09195fcb4138178b5f0f4c2c4 has changed
Binary file easy-connect/esp8266-driver/.git/objects/86/45716bafafd88b0d67b2c3d12b8b8e4bf46a0a has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/86/ed47c8bf40c86fdc569c7e678a8944f5e01c2a Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xmÉj1Ds¯hÈÙ4ÒôH`M ñÅä´´<"³E#çïãßrª¦ëUA¹ibê)'"-SÒ6T[ +Ê([QËL°Â#J×p)LK¾M¢1w¢µØ8£ÚÖkÔÆH]!Öè·ÌrØwÛèV¡'ªUpDÍ(±%W»)Á[⧹£{³äl\w;¶%ÓÙ,kòå¸T%oV«ÜmØÿy_,lÆ)ÑÜÿn1wÅ®/À?±ê@éH0¾D? Ï!¤iÝça°ä_B<¯¹Óõ¹2Þ'ZªzgãÉôÑÃ×ä¾)ïîÖ¥(4¿·<*`y: \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/87/feb9c915ce02302bc9822778637ab2ec0d7ed6 has changed
Binary file easy-connect/esp8266-driver/.git/objects/89/1b2f35b476ddfc63f5835a235f9662fdc75702 has changed
Binary file easy-connect/esp8266-driver/.git/objects/8a/21294bb1073d2d6804235b6bc6af2fb2d08ce6 has changed
Binary file easy-connect/esp8266-driver/.git/objects/8a/528dbee9038ed90855836556014e9389539f41 has changed
Binary file easy-connect/esp8266-driver/.git/objects/8a/ae3bd490162291eef8d92f0b169b9b8fd706a6 has changed
Binary file easy-connect/esp8266-driver/.git/objects/8b/3302ea06c0f2d012f20563700f48c7d75d4b3c has changed
Binary file easy-connect/esp8266-driver/.git/objects/8b/fea411eb7c6b2a1c6f723b05a6bbe05056f707 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/8d/1823c75c461e49fa7dc8f7cd0bc3a4eb980ef6 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,4 @@ +xTÛNÛ@í³¿b¾r*BQÃ¥jTH8!¢=vVØ^wwIQûíÙØ\zIðCÙ9sæسDÍ ··»ûÆëlnz° # ÐuTDêvçîx¦%Ftì«ÈBc-`'Âbç2ëóHiH± ++À.r4GvN)0" X«;t§w¨TôÚ]tU¾Ð2[h°ÝííT3`f¨u ¨ÁιèVeZðÞnw¡É*ÕØè3öBdÊBa0¤'Þ[F"Jiç®O Òf« +Cͬ rAäPÑóB¶"ÍêÎÍ÷;²,ÛÂn+wå8¦s6<>ù§[Dºzè"KÐÐø½-@äD*3ÚW"J UE¬rV1éRKKi©VÆLCi¬³×õ¤Y5ÐäÏh!"ÆÀ¡ß£?ô[r9|_Làrp~>M§>Ïáx<:NãE`0º/ÃÑI£Ýà}®y¢)YMt>m·RS`ßplrd$-#Äd±ÅrÔ©4lCC¦ÈTZaÝÑ_sq£Þ[I¾.*{Ïg+ÃAb89ôêüÁäp¿ ÌìÎöÔ?pÃ{ðxÓYÁÈ° \sæ|Å þO¾-O n²íèr?m¡³¾÷s=_4êÎ!&h®oW£>NQº!c´>mn÷ð-CC7LþCôNÉ^À-Gåóí´LT@rt+uô0ÅÔ m²-è¶â½^©Ï#Þ6¹ÐÔ,CÏIÞéлô_"³[r©pß6zsJrE.ã÷kùýz4ÊÒ's÷÷S{زÒk¢··cMEÂj"ìà²÷neÉú +}Eó®ÅoÜóâ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/8d/b3ba5bf71b3482ada53e1585f49334d8cf992e has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/8e/0c9a889667fd3a837894a1cace2d8196a691a6 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xÑN!E}æ+úNÂ$ÆïÆýJvW0ÿoݾ´émÏíµËY»ÑÀi©é²ó(b¦-*w´feÑ-Q¯Ðh£A|Ò¤Åuv³á²èÐFJ&¨Y{)³û8×ï{ïð¼OjðÐxÖÛðZb- òtÎý´R +V9â`à°ËâõqÒ0.[ä r«úñEx=½y(ÄK£»þÔõJqtÈ{ÿ-|Í·Õá1o-&hÜ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/8f/231b0645ab4e7081eccc0b3a1bf366c70634e7 has changed
Binary file easy-connect/esp8266-driver/.git/objects/8f/2bc9cd442ea21d44a52c8bab55333c6941fb17 has changed
Binary file easy-connect/esp8266-driver/.git/objects/90/10cd39078cc91486da1d08547eb05660362c2c has changed
Binary file easy-connect/esp8266-driver/.git/objects/93/6f7d5534f1f316377fef82dd98f0da85976fdb has changed
Binary file easy-connect/esp8266-driver/.git/objects/94/4e0fd12eae9337c713e70f21428f405ff15cf6 has changed
Binary file easy-connect/esp8266-driver/.git/objects/94/d0e46f45972aac11ae428b5cc64fe8a4ee6d27 has changed
Binary file easy-connect/esp8266-driver/.git/objects/95/3bb50291cd5a3100d0e45b128a5d266235e24a has changed
Binary file easy-connect/esp8266-driver/.git/objects/95/9c04625282673ad11f65ffd55ed8f97a1a0cea has changed
Binary file easy-connect/esp8266-driver/.git/objects/95/fa03f0877a430ed3de5474f6394401eea74be4 has changed
Binary file easy-connect/esp8266-driver/.git/objects/98/01dd6d72f5ffa03be984ad0c40255c87fdc303 has changed
Binary file easy-connect/esp8266-driver/.git/objects/98/2da6743ef487d0d0947cb5fc1f0b305ff310d3 has changed
Binary file easy-connect/esp8266-driver/.git/objects/98/e36f8be56887897782da71422bdce8c221370f has changed
Binary file easy-connect/esp8266-driver/.git/objects/98/f874ba14deaf6a8faa6666d75207b39b28cd57 has changed
Binary file easy-connect/esp8266-driver/.git/objects/9c/bdd4978cf65841ecee30679811fbd6d3fd8c09 has changed
Binary file easy-connect/esp8266-driver/.git/objects/9d/21b4ceed39393573294b70014c4d43b3c40b7f has changed
Binary file easy-connect/esp8266-driver/.git/objects/9d/54161261715aa62843752a37a092b48db56c27 has changed
Binary file easy-connect/esp8266-driver/.git/objects/9d/b8175b0e1c4cad3c513ce1be6d60f44fb476bf has changed
Binary file easy-connect/esp8266-driver/.git/objects/a0/9061bb1823bd9c729a46cf3b2cd121063a5af1 has changed
Binary file easy-connect/esp8266-driver/.git/objects/a3/8dbbaf66265199af60050cabc6618c4b530edc has changed
Binary file easy-connect/esp8266-driver/.git/objects/a3/b83979ec8272d283fb1a2ad25c9b9e74d9e0cf has changed
Binary file easy-connect/esp8266-driver/.git/objects/a7/016f754cb91cab9a5931d45599ca6531b70183 has changed
Binary file easy-connect/esp8266-driver/.git/objects/a7/d7865dd1220517df85db60a31927549247fb91 has changed
Binary file easy-connect/esp8266-driver/.git/objects/a8/b5125912fe6450dcca33fa357ad7b5870cbeab has changed
Binary file easy-connect/esp8266-driver/.git/objects/a8/d252d67bcbf06bbeb53aff60cb01f96136ef92 has changed
Binary file easy-connect/esp8266-driver/.git/objects/a8/d28f70504af3c35bfc8766ad44122f0432ee1a has changed
Binary file easy-connect/esp8266-driver/.git/objects/aa/a4c65d9a632c8d3118b7aab427eecc7935cb39 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/aa/bf2bfd8ad215d2080613cfe16a1ade42b65525 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,4 @@ +xmÍNÃ09ç)VâL±ÿJj½ôÒ@k{ÝXà8*¼=¥7N3o4ñSΩB'íC-D`\ñVqÍ%¢jè´l±ÓÈlë N*ßêfÆBc£(íy£bðRY¯IiÆ +%1î[üã#s䥵ËÎ 8Fã½GF`\«¨4³±ÁµöS×¾¤¥NsO¸Ôl}7»µÒ. +ëpa:Ý2«<1ÅXãïÃ~ù÷T«í8ïÝ%Õ~uðO¬9Q¹Ìë0@¡Ï +ÜB,Sýù g·iðú!|©iö!Àù°;69ÀõV1|½ýiSÉXÓ4.?Ûs¡ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/ab/97c25ea1d899fb821e46703e6ddb84506840f8 has changed
Binary file easy-connect/esp8266-driver/.git/objects/ab/d45947366baae35035dc7850e9541be05ba05d has changed
Binary file easy-connect/esp8266-driver/.git/objects/ad/4b5ab81528cfc89fbd46c88c21728fec8d0aaf has changed
Binary file easy-connect/esp8266-driver/.git/objects/ad/baed3a1a00735f51ba1e24c38d552a80acd3b8 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/b2/4b6ee77927c403197c798a4d8ba1cfef4ce7ec Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xmÍjÃ0{öS,ôWõg%ÐæÒäU$°cW?IóöU¹õ´;ß³n]X`ì©$D`|°\)oÜ8)I bR Agɨ9gc}·ç'¬W5 kÈÒqTZKí%áF3¯ûÐ7;MÑÒQÐpKGV¡vRJÊùä¡©%¬ ÞB¹¬[ÀGK{îË¡ü1¹Ç©¾å#ÕJÁaG!»ûÓÆr¬öç5á6ߧXBµ}üu_N[gHø]1xf|ZÈ&°ÃíÅÇ´\ÛvÖ®{OñÒ²éfJ´3µÅ@»ÁGÞæ=<_rau5 \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/b8/8add7ec5d94cae6d187ada1bcb5ab545eb846e has changed
Binary file easy-connect/esp8266-driver/.git/objects/b8/e4c28bf4a640e48175f93d2c1f3b0b67f5999a has changed
Binary file easy-connect/esp8266-driver/.git/objects/b8/fc20f3b0e4f5fd248c99722cfe46a2572e9958 has changed
Binary file easy-connect/esp8266-driver/.git/objects/bb/7241e66ae1a98dd28403a201fd348f89b27d94 has changed
Binary file easy-connect/esp8266-driver/.git/objects/bb/8182f41bb5512e916d29be1c734aa9f1f19d2f has changed
Binary file easy-connect/esp8266-driver/.git/objects/bd/8c867a07f91c28d366a046c9c1474918489cf8 has changed
Binary file easy-connect/esp8266-driver/.git/objects/c0/707dff7c7ff4d039969fdfbddbbf0521845e6b has changed
Binary file easy-connect/esp8266-driver/.git/objects/c0/a6ec9ca7f4aa3e01244ac4c2470813cfe1f599 has changed
Binary file easy-connect/esp8266-driver/.git/objects/c2/09d637a05d23a7390c41c594867e66cd7a2b61 has changed
Binary file easy-connect/esp8266-driver/.git/objects/c2/c998194a60949f4ff70b54d9f2f569c7a6c197 has changed
Binary file easy-connect/esp8266-driver/.git/objects/c3/0ea2129fa524f9352ef4ec7388986fe0a3513f has changed
Binary file easy-connect/esp8266-driver/.git/objects/c5/7ac6e8b53e1d1b6f35b673ce6325b55fd7e47e has changed
Binary file easy-connect/esp8266-driver/.git/objects/c5/88afe92e4f1f5d2e16df2ddbf7033c1320e937 has changed
Binary file easy-connect/esp8266-driver/.git/objects/c6/f23d016e7169b1be7240230155a2948bfe8cfd has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/cc/460d8d2e1456b3734b3792da65ced4a132800f Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xPMKÄ0õ_1àyK6I¸âMAoâ!ÓLl°mJ.ûóM׫'OóÞ|¼÷!̳ÏÐôú&G" V ¾®ÔR×èæ3Úôu£DTZ#²ÕDZÊ!*˵âMmúFtÒq-ÑõM+P´¨Zï3[C1úÃ:Rgr)Ça¼û-ÓŤìvu«âZ .9gÃ5è¾ÿo öAiíRp²,ÌT¬fp%ZvòË-;`ápzݹÀÄØËßp1Ì`éìò_¥¢¿àæÅBÎÞ°ÁLá»*ÂK×/ðøöºª{òJpÛ´ûJê2 \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/cc/760c5cfd58ef1044951e299f3ade8b9693ca1c has changed
Binary file easy-connect/esp8266-driver/.git/objects/cc/a5889189d13b773e77ed1fe313e3ebd806d80f has changed
Binary file easy-connect/esp8266-driver/.git/objects/cd/1bf66c5d69ec983c6dee28fc1e321f9f6467ec has changed
Binary file easy-connect/esp8266-driver/.git/objects/cd/f18f963bf7b878b9801d5f590f99222ecaeb5d has changed
Binary file easy-connect/esp8266-driver/.git/objects/d2/7cda6fc43adbbec6b38e44031a4188b8941093 has changed
Binary file easy-connect/esp8266-driver/.git/objects/d2/e763c6eb1600169b83686fd98975e4ad9a798a has changed
Binary file easy-connect/esp8266-driver/.git/objects/d4/8a1b10b59a136a78b10e8625f8b3cff82670c9 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/d4/cafb54670e6e9dbdd0bc7ca65aa05eee8cd8cd Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xOIn!ÌWôÃ2HQ+ß|Èh± GÉó- ª:jImÛ.Ú-/ÜÀäÕNEÊE pY¥Q¯tÌ![¥H'nØéÊ@Æ;-u2y%1GTÒyZÉê°ødSYÀkëðYûep»UêpÂÁÞR}éÇ+åý ÆÉY-á0Aôz÷ÿ+b^ö!9S®WâÖ¿iðÒÛÛ|ç/ñ VN \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/d6/5614f258221439bf2c999710296f2eed68c757 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/d6/fc3baf28fbcb8e58792079af68bcc9c23e1dce Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +xK +Â0@]ç³$c>4 â\ÉÔSÒÒÛ[÷n¼÷2 +`p©DZLÑXÓÚ¢ÍÑ~ExäM¯÷SH*6¸ÂyâøðüûæÂv\ïG@ë]g¼óÛ5§Uúþþ3-üê:å(ánÂ0·iâ*ÐSViVfð@ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/d9/07f236bd4e98483a1d4096873ad51e67bacf8a has changed
Binary file easy-connect/esp8266-driver/.git/objects/d9/141ca34383010414da53f1ca1b9e63f02d1c9c has changed
Binary file easy-connect/esp8266-driver/.git/objects/d9/566bd8f78b611da45730ac75e7a07eca493a03 has changed
Binary file easy-connect/esp8266-driver/.git/objects/da/dd0c5ed6c6246b0a1d800e832cf49b5ac008ea has changed
Binary file easy-connect/esp8266-driver/.git/objects/db/de089f2f8ca06714f1f9c94212a5cb6d2aad02 has changed
Binary file easy-connect/esp8266-driver/.git/objects/dc/37b65ca877d969aa492f348626df6e1b0b1df0 has changed
Binary file easy-connect/esp8266-driver/.git/objects/dc/7c4a6d7b6e1f8aab293df0e70b14085f7eaf7e has changed
Binary file easy-connect/esp8266-driver/.git/objects/dd/16c394cb04f4bbad0e8d2103e5a33ff0e24bf5 has changed
Binary file easy-connect/esp8266-driver/.git/objects/de/b0b90a3ec974c3b1634155711cdd74ed498d2e has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/e2/1cfb7dc779c8f4eb259d1d2beeb13fd1d18a68 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xÁJÅ0E]ç+·JÒ¤I"n]ëL2Z^Ótâß[ýçr÷æVë*0ÎúI:3RR ëÍìva/'pèKpÎêÀλ1²å2ë³ËÉzˬ E=e4ì¼Qø¥uøàãhðwܼ¿4Ƚa¯Cnõ̵:ÍvµÕZ]éuRøºzßóö [MLÃru? µsív¯ÖïÐyCaå*p?õ³[r \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/e2/2af3a8db31849083d7102dafc3ed9f882b4696 has changed
Binary file easy-connect/esp8266-driver/.git/objects/e2/f0dc5443e5a1d9c7ad96f98202c93749158758 has changed
Binary file easy-connect/esp8266-driver/.git/objects/e4/05ea1a4ba8a7e1fec92090394b3be59e268afc has changed
Binary file easy-connect/esp8266-driver/.git/objects/e4/2e2eeb911f57571bf2708fa7a9136f5bb677bb has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/e4/7620ee6560c710adba1067e8e52937c4eacf3c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xmËNÃ0EYç+FbÝâWìDªP¡¥EQUÔðcÜXjâà8¨ü=i;63çêYm2pYßå¾"DÍ«Õ4,'*gQÉvªÖE¯v¼ôÊr-%JÍõmYÕT£X^PñçÛ²ª´Ç¡ðÔ!Î3çWsK9#XsUè171ÁªIaȱo0ÁVyZÛÜ`9f¼èan|*jÎI-©) )ìí±«ÿòv4°èbÂþü½< Üf> ÿ;L'~<!áçC{&Á§ØÂÓa×t«·ýÇËûzv\ïgp)~aÊ¡;Áoõ|Ü@é>\`òÁÆ®CCìDhtÙ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/e4/c54243acb2e7a28d0913dee7ebbe369311e8b3 has changed
Binary file easy-connect/esp8266-driver/.git/objects/e6/009077487630c0f6754edc5992c7d4deff5fc3 has changed
Binary file easy-connect/esp8266-driver/.git/objects/e6/3195ae4ab54a1510b868b8cd368909f18010b3 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/ed/2c98d0a9878f01b5a9996497223be7e1361fac Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x]ÁjÃ@D{öWäÚÄ´SroΦô¼ÎÊY]kYÉ1ýûnBoÌ<¦Òã{yZ4¿¿vRO~- +_øB¥9ZFR`uýøÜßß¼c$ñS¤¦Y°ãfWÕ§,có@Þ4£$ð<Th4hpnôWzÒgôU¦8e)æªè.?V³b|þÝW"9yÌla ¹3A§Ë3üÈTÔNÿÖpÙ÷þàÄ(3¦ìN{Ú"eݶ§EÉT6×Ê6RNKÚ.ý´3¹½²þºA_*$ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/ee/186e1e8d39fc6b99cb97cc3690aa43dcdf3b8c has changed
Binary file easy-connect/esp8266-driver/.git/objects/ee/fdaba7a9dee8e0b7db8b369517b7fe43258fbd has changed
Binary file easy-connect/esp8266-driver/.git/objects/ef/691c95ebe71e77fb5a6f8eaa49305cad55ca88 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/f0/bec599b1539dd61af8ccca0e7a640176f6709f Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xuÍjÃ0{öSì½`,YÒÊJÚK/í¬þáÊ +²i¾:õÖ¹ÍÇÌØR¬À{ªÅ{L±æI"ŵQr¡ÊrìîTüRA+ïZm¬VÁY©&^¡&= ¤åÔÑVo¹ÀJõ3|>¨Îy_çÓP^ýúÇTRosz&ôèáyhêm{«/ðëÛfà°äâïß?ǯXoù§Öëéò~í½e!ÄööârITc^Ö_~ÜT^ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/objects/f1/c3f75ad0a80184aa30155e298f07f373a75263 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xÍJ1=ç)ú¾ ùéÌõàzpÑ'è$ÙYLZ2Qðí }UEQ¥¥Óã]oÌ0eëLÐ8öz2cÔÁ Ù!F¯Ñmú¢ÆµÝ'tÄYumi?zSJÑ#üäQôÝÏÒàHRç RàáBõrOs¡åó>Jy3x;âh ¶Z«ÍÝ(;ÿ·¯Þ9^i¸Ô$ÃóÇi²ªtX¹&x{ª¿Eåë\cJK¡Öí *·àåtPøcJ \ No newline at end of file
Binary file easy-connect/esp8266-driver/.git/objects/f3/e3d6d5476b159f82b07d3dec0220e1047bd9b0 has changed
Binary file easy-connect/esp8266-driver/.git/objects/f5/d7e617cb83a03c1165681dd51a2a0fc8524889 has changed
Binary file easy-connect/esp8266-driver/.git/objects/f6/f7c3a42a65e6a271fcec55b8291ae44e85f414 has changed
Binary file easy-connect/esp8266-driver/.git/objects/f8/004ba37280748807065bf08e7dce4b63cad79a has changed
Binary file easy-connect/esp8266-driver/.git/objects/f9/7b41d3f75717a383be2c0410acb3137a725563 has changed
Binary file easy-connect/esp8266-driver/.git/objects/fc/0f1633de1d2b92aacc30e8cbee920f8e495b7f has changed
Binary file easy-connect/esp8266-driver/.git/objects/fd/612d3304a70f928496e13f3a54aba553b0dd9f has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +# pack-refs with: peeled +f0bec599b1539dd61af8ccca0e7a640176f6709f refs/remotes/origin/bulislaw_add_readme +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb refs/remotes/origin/master +1999dae3ef80f9c4cb363ee01d9696dca1e4ad61 refs/tags/latest +450cc128865ffb90b5cbfe5af193621644024fa7 refs/tags/v1.0 +29d63ae2ee0a233e2fbd9577cdddc7661bb783d1 refs/tags/v1.1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/remotes/origin/firmware-0.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/remotes/origin/firmware-2.0 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e47620ee6560c710adba1067e8e52937c4eacf3c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/remotes/origin/imsherlock Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +63cefc73abddc2637cafb0b5785bc2ef4b8ac280
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e47620ee6560c710adba1067e8e52937c4eacf3c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/remotes/origin/new_at Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d48a1b10b59a136a78b10e8625f8b3cff82670c9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/remotes/origin/testing Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +a38dbbaf66265199af60050cabc6618c4b530edc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.git/refs/tags/v1.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4ed87bf7fe37d5ba0de6c4e78868f604a82f8ecb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/.msub Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ESP8266/ATParser = https://github.com/ARMmbed/ATParser/#1:269f14532b98442669c50383782cbce1c67aced5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/ATParser/#269f14532b98442669c50383782cbce1c67aced5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +269f14532b98442669c50383782cbce1c67aced5 branch 'master' of https://github.com/ARMmbed/ATParser +3bfc95eb3c81fe98d7792e82608699e566f97603 not-for-merge branch 'baud' of https://github.com/ARMmbed/ATParser
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +269f14532b98442669c50383782cbce1c67aced5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/ATParser/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 269f14532b98442669c50383782cbce1c67aced5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199011 +0000 clone: from https://github.com/ARMmbed/ATParser/ +269f14532b98442669c50383782cbce1c67aced5 269f14532b98442669c50383782cbce1c67aced5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199011 +0000 checkout: moving from master to 269f14532b98442669c50383782cbce1c67aced5 +269f14532b98442669c50383782cbce1c67aced5 269f14532b98442669c50383782cbce1c67aced5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199011 +0000 checkout: moving from 269f14532b98442669c50383782cbce1c67aced5 to master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 269f14532b98442669c50383782cbce1c67aced5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199011 +0000 clone: from https://github.com/ARMmbed/ATParser/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 269f14532b98442669c50383782cbce1c67aced5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199011 +0000 clone: from https://github.com/ARMmbed/ATParser/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/logs/refs/remotes/origin/baud Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 3bfc95eb3c81fe98d7792e82608699e566f97603 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787107 +0000 fetch --append origin: storing head
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/08/2f11ce298302a41ff877eed55ec226b944c24d has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/26/9f14532b98442669c50383782cbce1c67aced5 has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/27/80390d5b3a7ed7a95478fc61b1a8632b843d1b has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/3b/fc95eb3c81fe98d7792e82608699e566f97603 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +x] +Â0}Î)ö4ÿ=O`³ÝR¡1¦x}CàÃÀÌÀ7_ v§V!IÎ?i½ö¬¬Ò<Qì6yäL³f¬üî óh¬V)cs¬ÔAû (}'+poK©ðÄ<°n\0á5TòFr +ÎÒJ)zÛ/6þ÷u-_ظuÕ®pÄMIÔ \ No newline at end of file
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/45/c2c9504f680cc5f6b1624cd262117036a7a774 has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/4d/677496a85bcdfd5a2d8bd5260f36d92bec09a5 has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/52/f9e7d0c92be3026ed8e2d929f5a2f3af5c7216 has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/6c/1e45c98871f7bf381fb2c43262ed9a05ebe1a9 has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/7d/0e42380917cbd4e2b474ba5771a7e15215e74c has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/80/0d8517da4d091eb52094a1cac0a66903aed59a has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/84/0c6747d369737e2523eb7cc9e25b7ed0fcf3ee has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/85/cf37770993beecac1e4d1b9dd5fcb3d03acee5 has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/93/e4cb7ebd99ce690370a168ac831cacea4034a9 has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/98/76baf6df887b76b6cb5da0a2e9bec41146001b has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/ac/0e4a88ca41a9de0f9d03f1d6b75ac2ba0b4ccc has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/e2/3cc82f00dee6d8a91d5fd2bbdf6f4b548a0ffe has changed
Binary file easy-connect/esp8266-driver/ESP8266/ATParser/.git/objects/f3/e3d6d5476b159f82b07d3dec0220e1047bd9b0 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# pack-refs with: peeled +269f14532b98442669c50383782cbce1c67aced5 refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +269f14532b98442669c50383782cbce1c67aced5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/.git/refs/remotes/origin/baud Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +3bfc95eb3c81fe98d7792e82608699e566f97603
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/ATParser.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,333 @@ +/* Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + * + * @section DESCRIPTION + * + * Parser for the AT command syntax + * + */ + +#include "ATParser.h" +#include "mbed_debug.h" + + +// getc/putc handling with timeouts +int ATParser::putc(char c) +{ + Timer timer; + timer.start(); + + while (true) { + if (_serial->writeable()) { + return _serial->putc(c); + } + if (timer.read_ms() > _timeout) { + return -1; + } + } +} + +int ATParser::getc() +{ + Timer timer; + timer.start(); + + while (true) { + if (_serial->readable()) { + return _serial->getc(); + } + if (timer.read_ms() > _timeout) { + return -1; + } + } +} + +void ATParser::flush() +{ + while (_serial->readable()) { + _serial->getc(); + } +} + + +// read/write handling with timeouts +int ATParser::write(const char *data, int size) +{ + int i = 0; + for ( ; i < size; i++) { + if (putc(data[i]) < 0) { + return -1; + } + } + return i; +} + +int ATParser::read(char *data, int size) +{ + int i = 0; + for ( ; i < size; i++) { + int c = getc(); + if (c < 0) { + return -1; + } + data[i] = c; + } + return i; +} + + +// printf/scanf handling +int ATParser::vprintf(const char *format, va_list args) +{ + if (vsprintf(_buffer, format, args) < 0) { + return false; + } + int i = 0; + for ( ; _buffer[i]; i++) { + if (putc(_buffer[i]) < 0) { + return -1; + } + } + return i; +} + +int ATParser::vscanf(const char *format, va_list args) +{ + // Since format is const, we need to copy it into our buffer to + // add the line's null terminator and clobber value-matches with asterisks. + // + // We just use the beginning of the buffer to avoid unnecessary allocations. + int i = 0; + int offset = 0; + + while (format[i]) { + if (format[i] == '%' && format[i+1] != '%' && format[i+1] != '*') { + _buffer[offset++] = '%'; + _buffer[offset++] = '*'; + i++; + } else { + _buffer[offset++] = format[i++]; + } + } + + // Scanf has very poor support for catching errors + // fortunately, we can abuse the %n specifier to determine + // if the entire string was matched. + _buffer[offset++] = '%'; + _buffer[offset++] = 'n'; + _buffer[offset++] = 0; + + // To workaround scanf's lack of error reporting, we actually + // make two passes. One checks the validity with the modified + // format string that only stores the matched characters (%n). + // The other reads in the actual matched values. + // + // We keep trying the match until we succeed or some other error + // derails us. + int j = 0; + + while (true) { + // Ran out of space + if (j+1 >= _buffer_size - offset) { + return false; + } + // Recieve next character + int c = getc(); + if (c < 0) { + return -1; + } + _buffer[offset + j++] = c; + _buffer[offset + j] = 0; + + // Check for match + int count = -1; + sscanf(_buffer+offset, _buffer, &count); + + // We only succeed if all characters in the response are matched + if (count == j) { + // Store the found results + vsscanf(_buffer+offset, format, args); + return j; + } + } +} + + +// Command parsing with line handling +bool ATParser::vsend(const char *command, va_list args) +{ + // Create and send command + if (vsprintf(_buffer, command, args) < 0) { + return false; + } + for (int i = 0; _buffer[i]; i++) { + if (putc(_buffer[i]) < 0) { + return false; + } + } + + // Finish with newline + for (int i = 0; _delimiter[i]; i++) { + if (putc(_delimiter[i]) < 0) { + return false; + } + } + + debug_if(dbg_on, "AT> %s\r\n", _buffer); + return true; +} + +bool ATParser::vrecv(const char *response, va_list args) +{ + // Iterate through each line in the expected response + while (response[0]) { + // Since response is const, we need to copy it into our buffer to + // add the line's null terminator and clobber value-matches with asterisks. + // + // We just use the beginning of the buffer to avoid unnecessary allocations. + int i = 0; + int offset = 0; + + while (response[i]) { + if (memcmp(&response[i+1-_delim_size], _delimiter, _delim_size) == 0) { + i++; + break; + } else if (response[i] == '%' && response[i+1] != '%' && response[i+1] != '*') { + _buffer[offset++] = '%'; + _buffer[offset++] = '*'; + i++; + } else { + _buffer[offset++] = response[i++]; + } + } + + // Scanf has very poor support for catching errors + // fortunately, we can abuse the %n specifier to determine + // if the entire string was matched. + _buffer[offset++] = '%'; + _buffer[offset++] = 'n'; + _buffer[offset++] = 0; + + // To workaround scanf's lack of error reporting, we actually + // make two passes. One checks the validity with the modified + // format string that only stores the matched characters (%n). + // The other reads in the actual matched values. + // + // We keep trying the match until we succeed or some other error + // derails us. + int j = 0; + + while (true) { + // Recieve next character + int c = getc(); + if (c < 0) { + return false; + } + _buffer[offset + j++] = c; + _buffer[offset + j] = 0; + + // Check for oob data + for (int k = 0; k < _oobs.size(); k++) { + if (j == _oobs[k].len && memcmp( + _oobs[k].prefix, _buffer+offset, _oobs[k].len) == 0) { + debug_if(dbg_on, "AT! %s\r\n", _oobs[k].prefix); + _oobs[k].cb(); + + // oob may have corrupted non-reentrant buffer, + // so we need to set it up again + return vrecv(response, args); + } + } + + // Check for match + int count = -1; + sscanf(_buffer+offset, _buffer, &count); + + // We only succeed if all characters in the response are matched + if (count == j) { + debug_if(dbg_on, "AT= %s\r\n", _buffer+offset); + // Reuse the front end of the buffer + memcpy(_buffer, response, i); + _buffer[i] = 0; + + // Store the found results + vsscanf(_buffer+offset, _buffer, args); + + // Jump to next line and continue parsing + response += i; + break; + } + + // Clear the buffer when we hit a newline or ran out of space + // running out of space usually means we ran into binary data + if (j+1 >= _buffer_size - offset || + strcmp(&_buffer[offset + j-_delim_size], _delimiter) == 0) { + + debug_if(dbg_on, "AT< %s", _buffer+offset); + j = 0; + } + } + } + + return true; +} + + +// Mapping to vararg functions +int ATParser::printf(const char *format, ...) +{ + va_list args; + va_start(args, format); + int res = vprintf(format, args); + va_end(args); + return res; +} + +int ATParser::scanf(const char *format, ...) +{ + va_list args; + va_start(args, format); + int res = vscanf(format, args); + va_end(args); + return res; +} + +bool ATParser::send(const char *command, ...) +{ + va_list args; + va_start(args, command); + bool res = vsend(command, args); + va_end(args); + return res; +} + +bool ATParser::recv(const char *response, ...) +{ + va_list args; + va_start(args, response); + bool res = vrecv(response, args); + va_end(args); + return res; +} + + +// oob registration +void ATParser::oob(const char *prefix, Callback<void()> cb) +{ + struct oob oob; + oob.len = strlen(prefix); + oob.prefix = prefix; + oob.cb = cb; + _oobs.push_back(oob); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/ATParser.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,234 @@ +/* Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + * + * @section DESCRIPTION + * + * Parser for the AT command syntax + * + */ +#ifndef AT_PARSER_H +#define AT_PARSER_H + +#include "mbed.h" +#include <cstdarg> +#include <vector> +#include "BufferedSerial.h" +#include "Callback.h" + + +/** +* Parser class for parsing AT commands +* +* Here are some examples: +* @code +* ATParser at = ATParser(serial, "\r\n"); +* int value; +* char buffer[100]; +* +* at.send("AT") && at.recv("OK"); +* at.send("AT+CWMODE=%d", 3) && at.recv("OK"); +* at.send("AT+CWMODE?") && at.recv("+CWMODE:%d\r\nOK", &value); +* at.recv("+IPD,%d:", &value); +* at.read(buffer, value); +* at.recv("OK"); +* @endcode +*/ +class ATParser +{ +private: + // Serial information + BufferedSerial *_serial; + int _buffer_size; + char *_buffer; + int _timeout; + + // Parsing information + const char *_delimiter; + int _delim_size; + bool dbg_on; + + struct oob { + unsigned len; + const char *prefix; + mbed::Callback<void()> cb; + }; + std::vector<oob> _oobs; + +public: + /** + * Constructor + * + * @param serial serial interface to use for AT commands + * @param buffer_size size of internal buffer for transaction + * @param timeout timeout of the connection + * @param delimiter string of characters to use as line delimiters + */ + ATParser(BufferedSerial &serial, const char *delimiter = "\r\n", int buffer_size = 256, int timeout = 8000, bool debug = false) : + _serial(&serial), + _buffer_size(buffer_size) { + _buffer = new char[buffer_size]; + setTimeout(timeout); + setDelimiter(delimiter); + debugOn(debug); + } + + /** + * Destructor + */ + ~ATParser() { + delete [] _buffer; + } + + /** + * Allows timeout to be changed between commands + * + * @param timeout timeout of the connection + */ + void setTimeout(int timeout) { + _timeout = timeout; + } + + /** + * Sets string of characters to use as line delimiters + * + * @param delimiter string of characters to use as line delimiters + */ + void setDelimiter(const char *delimiter) { + _delimiter = delimiter; + _delim_size = strlen(delimiter); + } + + /** + * Allows echo to be on or off + * + * @param echo 1 for echo and 0 turns it off + */ + void debugOn(uint8_t on) { + dbg_on = (on) ? 1 : 0; + } + + /** + * Sends an AT command + * + * Sends a formatted command using printf style formatting + * @see ::printf + * + * @param command printf-like format string of command to send which + * is appended with the specified delimiter + * @param ... all printf-like arguments to insert into command + * @return true only if command is successfully sent + */ + bool send(const char *command, ...); + bool vsend(const char *command, va_list args); + + /** + * Recieve an AT response + * + * Recieves a formatted response using scanf style formatting + * @see ::scanf + * + * Responses are parsed line at a time using the specified delimiter. + * Any recieved data that does not match the response is ignored until + * a timeout occurs. + * + * @param response scanf-like format string of response to expect + * @param ... all scanf-like arguments to extract from response + * @return true only if response is successfully matched + */ + bool recv(const char *response, ...); + bool vrecv(const char *response, va_list args); + + /** + * Write a single byte to the underlying stream + * + * @param c The byte to write + * @return The byte that was written or -1 during a timeout + */ + int putc(char c); + + /** + * Get a single byte from the underlying stream + * + * @return The byte that was read or -1 during a timeout + */ + int getc(); + + /** + * Write an array of bytes to the underlying stream + * + * @param data the array of bytes to write + * @param size number of bytes to write + * @return number of bytes written or -1 on failure + */ + int write(const char *data, int size); + + /** + * Read an array of bytes from the underlying stream + * + * @param data the destination for the read bytes + * @param size number of bytes to read + * @return number of bytes read or -1 on failure + */ + int read(char *data, int size); + + /** + * Direct printf to underlying stream + * @see ::printf + * + * @param format format string to pass to printf + * @param ... arguments to printf + * @return number of bytes written or -1 on failure + */ + int printf(const char *format, ...); + int vprintf(const char *format, va_list args); + + /** + * Direct scanf on underlying stream + * @see ::scanf + * + * @param format format string to pass to scanf + * @param ... arguments to scanf + * @return number of bytes read or -1 on failure + */ + int scanf(const char *format, ...); + int vscanf(const char *format, va_list args); + + /** + * Attach a callback for out-of-band data + * + * @param prefix string on when to initiate callback + * @param func callback to call when string is read + * @note out-of-band data is only processed during a scanf call + */ + void oob(const char *prefix, mbed::Callback<void()> func); + + /** + * Attach a callback for out-of-band data + * + * @param prefix string on when to initiate callback + * @param obj pointer to object to call member function on + * @param method callback to call when string is read + * @note out-of-band data is only processed during a scanf call + */ + template <typename T, typename M> + void oob(const char *prefix, T *obj, M method) { + return oob(prefix, mbed::Callback<void()>(obj, method)); + } + + /** + * Flushes the underlying stream + */ + void flush(); +}; +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/BufferedSerial/Buffer/MyBuffer.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,76 @@ + +/** + * @file Buffer.cpp + * @brief Software Buffer - Templated Ring Buffer for most data types + * @author sam grove + * @version 1.0 + * @see + * + * Copyright (c) 2013 + * + * 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 + * 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. + */ + +#include "MyBuffer.h" + +template <class T> +MyBuffer<T>::MyBuffer(uint32_t size) +{ + _buf = new T [size]; + _size = size; + clear(); + + return; +} + +template <class T> +MyBuffer<T>::~MyBuffer() +{ + delete [] _buf; + + return; +} + +template <class T> +uint32_t MyBuffer<T>::getSize() +{ + return this->_size; +} + +template <class T> +void MyBuffer<T>::clear(void) +{ + _wloc = 0; + _rloc = 0; + memset(_buf, 0, _size); + + return; +} + +template <class T> +uint32_t MyBuffer<T>::peek(char c) +{ + return 1; +} + +// make the linker aware of some possible types +template class MyBuffer<uint8_t>; +template class MyBuffer<int8_t>; +template class MyBuffer<uint16_t>; +template class MyBuffer<int16_t>; +template class MyBuffer<uint32_t>; +template class MyBuffer<int32_t>; +template class MyBuffer<uint64_t>; +template class MyBuffer<int64_t>; +template class MyBuffer<char>; +template class MyBuffer<wchar_t>;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/BufferedSerial/Buffer/MyBuffer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,163 @@ + +/** + * @file Buffer.h + * @brief Software Buffer - Templated Ring Buffer for most data types + * @author sam grove + * @version 1.0 + * @see + * + * Copyright (c) 2013 + * + * 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 + * 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. + */ + +#ifndef MYBUFFER_H +#define MYBUFFER_H + +#include <stdint.h> +#include <string.h> + +/** A templated software ring buffer + * + * Example: + * @code + * #include "mbed.h" + * #include "MyBuffer.h" + * + * MyBuffer <char> buf; + * + * int main() + * { + * buf = 'a'; + * buf.put('b'); + * char *head = buf.head(); + * puts(head); + * + * char whats_in_there[2] = {0}; + * int pos = 0; + * + * while(buf.available()) + * { + * whats_in_there[pos++] = buf; + * } + * printf("%c %c\n", whats_in_there[0], whats_in_there[1]); + * buf.clear(); + * error("done\n\n\n"); + * } + * @endcode + */ + +template <typename T> +class MyBuffer +{ +private: + T *_buf; + volatile uint32_t _wloc; + volatile uint32_t _rloc; + uint32_t _size; + +public: + /** Create a Buffer and allocate memory for it + * @param size The size of the buffer + */ + MyBuffer(uint32_t size = 0x100); + + /** Get the size of the ring buffer + * @return the size of the ring buffer + */ + uint32_t getSize(); + + /** Destry a Buffer and release it's allocated memory + */ + ~MyBuffer(); + + /** Add a data element into the buffer + * @param data Something to add to the buffer + */ + void put(T data); + + /** Remove a data element from the buffer + * @return Pull the oldest element from the buffer + */ + T get(void); + + /** Get the address to the head of the buffer + * @return The address of element 0 in the buffer + */ + T *head(void); + + /** Reset the buffer to 0. Useful if using head() to parse packeted data + */ + void clear(void); + + /** Determine if anything is readable in the buffer + * @return 1 if something can be read, 0 otherwise + */ + uint32_t available(void); + + /** Overloaded operator for writing to the buffer + * @param data Something to put in the buffer + * @return + */ + MyBuffer &operator= (T data) + { + put(data); + return *this; + } + + /** Overloaded operator for reading from the buffer + * @return Pull the oldest element from the buffer + */ + operator int(void) + { + return get(); + } + + uint32_t peek(char c); + +}; + +template <class T> +inline void MyBuffer<T>::put(T data) +{ + _buf[_wloc++] = data; + _wloc %= (_size-1); + + return; +} + +template <class T> +inline T MyBuffer<T>::get(void) +{ + T data_pos = _buf[_rloc++]; + _rloc %= (_size-1); + + return data_pos; +} + +template <class T> +inline T *MyBuffer<T>::head(void) +{ + T *data_pos = &_buf[0]; + + return data_pos; +} + +template <class T> +inline uint32_t MyBuffer<T>::available(void) +{ + return (_wloc == _rloc) ? 0 : 1; +} + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/BufferedSerial/BufferedPrint.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include <stdarg.h> +#include <stdint.h> +#include <stdio.h> +#include <string.h> + +#include "mbed_error.h" + +size_t BufferedSerialThunk(void *buf_serial, const void *s, size_t length); + +int BufferedPrintfC(void *stream, int size, const char* format, va_list arg) +{ + int r; + char buffer[512]; + if (size >= 512) { + return -1; + } + memset(buffer, 0, size); + r = vsprintf(buffer, format, arg); + // this may not hit the heap but should alert the user anyways + if(r > (int32_t) size) { + error("%s %d buffer overwrite (max_buf_size: %d exceeded: %d)!\r\n", __FILE__, __LINE__, size, r); + return 0; + } + if ( r > 0 ) { + BufferedSerialThunk(stream, buffer, r); + } + return r; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/BufferedSerial/BufferedSerial.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,166 @@ +/** + * @file BufferedSerial.cpp + * @brief Software Buffer - Extends mbed Serial functionallity adding irq driven TX and RX + * @author sam grove + * @version 1.0 + * @see + * + * Copyright (c) 2013 + * + * 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 + * 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. + */ + +#include "BufferedSerial.h" +#include <stdarg.h> + +extern "C" int BufferedPrintfC(void *stream, int size, const char* format, va_list arg); + +BufferedSerial::BufferedSerial(PinName tx, PinName rx, uint32_t buf_size, uint32_t tx_multiple, const char* name) + : RawSerial(tx, rx) , _rxbuf(buf_size), _txbuf((uint32_t)(tx_multiple*buf_size)) +{ + RawSerial::attach(this, &BufferedSerial::rxIrq, Serial::RxIrq); + this->_buf_size = buf_size; + this->_tx_multiple = tx_multiple; + return; +} + +BufferedSerial::~BufferedSerial(void) +{ + RawSerial::attach(NULL, RawSerial::RxIrq); + RawSerial::attach(NULL, RawSerial::TxIrq); + + return; +} + +int BufferedSerial::readable(void) +{ + return _rxbuf.available(); // note: look if things are in the buffer +} + +int BufferedSerial::writeable(void) +{ + return 1; // buffer allows overwriting by design, always true +} + +int BufferedSerial::getc(void) +{ + return _rxbuf; +} + +int BufferedSerial::putc(int c) +{ + _txbuf = (char)c; + BufferedSerial::prime(); + + return c; +} + +int BufferedSerial::puts(const char *s) +{ + if (s != NULL) { + const char* ptr = s; + + while(*(ptr) != 0) { + _txbuf = *(ptr++); + } + _txbuf = '\n'; // done per puts definition + BufferedSerial::prime(); + + return (ptr - s) + 1; + } + return 0; +} + +extern "C" size_t BufferedSerialThunk(void *buf_serial, const void *s, size_t length) +{ + BufferedSerial *buffered_serial = (BufferedSerial *)buf_serial; + return buffered_serial->write(s, length); +} + +int BufferedSerial::printf(const char* format, ...) +{ + va_list arg; + va_start(arg, format); + int r = BufferedPrintfC((void*)this, this->_buf_size, format, arg); + va_end(arg); + return r; +} + +ssize_t BufferedSerial::write(const void *s, size_t length) +{ + if (s != NULL && length > 0) { + const char* ptr = (const char*)s; + const char* end = ptr + length; + + while (ptr != end) { + _txbuf = *(ptr++); + } + BufferedSerial::prime(); + + return ptr - (const char*)s; + } + return 0; +} + + +void BufferedSerial::rxIrq(void) +{ + // read from the peripheral and make sure something is available + if(serial_readable(&_serial)) { + _rxbuf = serial_getc(&_serial); // if so load them into a buffer + // trigger callback if necessary + if (_cbs[RxIrq]) { + _cbs[RxIrq](); + } + } + + return; +} + +void BufferedSerial::txIrq(void) +{ + // see if there is room in the hardware fifo and if something is in the software fifo + while(serial_writable(&_serial)) { + if(_txbuf.available()) { + serial_putc(&_serial, (int)_txbuf.get()); + } else { + // disable the TX interrupt when there is nothing left to send + RawSerial::attach(NULL, RawSerial::TxIrq); + // trigger callback if necessary + if (_cbs[TxIrq]) { + _cbs[TxIrq](); + } + break; + } + } + + return; +} + +void BufferedSerial::prime(void) +{ + // if already busy then the irq will pick this up + if(serial_writable(&_serial)) { + RawSerial::attach(NULL, RawSerial::TxIrq); // make sure not to cause contention in the irq + BufferedSerial::txIrq(); // only write to hardware in one place + RawSerial::attach(this, &BufferedSerial::txIrq, RawSerial::TxIrq); + } + + return; +} + +void BufferedSerial::attach(Callback<void()> func, IrqType type) +{ + _cbs[type] = func; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/BufferedSerial/BufferedSerial.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,168 @@ + +/** + * @file BufferedSerial.h + * @brief Software Buffer - Extends mbed Serial functionallity adding irq driven TX and RX + * @author sam grove + * @version 1.0 + * @see + * + * Copyright (c) 2013 + * + * 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 + * 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. + */ + +#ifndef BUFFEREDSERIAL_H +#define BUFFEREDSERIAL_H + +#include "mbed.h" +#include "MyBuffer.h" + +/** A serial port (UART) for communication with other serial devices + * + * Can be used for Full Duplex communication, or Simplex by specifying + * one pin as NC (Not Connected) + * + * Example: + * @code + * #include "mbed.h" + * #include "BufferedSerial.h" + * + * BufferedSerial pc(USBTX, USBRX); + * + * int main() + * { + * while(1) + * { + * Timer s; + * + * s.start(); + * pc.printf("Hello World - buffered\n"); + * int buffered_time = s.read_us(); + * wait(0.1f); // give time for the buffer to empty + * + * s.reset(); + * printf("Hello World - blocking\n"); + * int polled_time = s.read_us(); + * s.stop(); + * wait(0.1f); // give time for the buffer to empty + * + * pc.printf("printf buffered took %d us\n", buffered_time); + * pc.printf("printf blocking took %d us\n", polled_time); + * wait(0.5f); + * } + * } + * @endcode + */ + +/** + * @class BufferedSerial + * @brief Software buffers and interrupt driven tx and rx for Serial + */ +class BufferedSerial : public RawSerial +{ +private: + MyBuffer <char> _rxbuf; + MyBuffer <char> _txbuf; + uint32_t _buf_size; + uint32_t _tx_multiple; + + void rxIrq(void); + void txIrq(void); + void prime(void); + + Callback<void()> _cbs[2]; + +public: + /** Create a BufferedSerial port, connected to the specified transmit and receive pins + * @param tx Transmit pin + * @param rx Receive pin + * @param buf_size printf() buffer size + * @param tx_multiple amount of max printf() present in the internal ring buffer at one time + * @param name optional name + * @note Either tx or rx may be specified as NC if unused + */ + BufferedSerial(PinName tx, PinName rx, uint32_t buf_size = 256, uint32_t tx_multiple = 4,const char* name=NULL); + + /** Destroy a BufferedSerial port + */ + virtual ~BufferedSerial(void); + + /** Check on how many bytes are in the rx buffer + * @return 1 if something exists, 0 otherwise + */ + virtual int readable(void); + + /** Check to see if the tx buffer has room + * @return 1 always has room and can overwrite previous content if too small / slow + */ + virtual int writeable(void); + + /** Get a single byte from the BufferedSerial Port. + * Should check readable() before calling this. + * @return A byte that came in on the Serial Port + */ + virtual int getc(void); + + /** Write a single byte to the BufferedSerial Port. + * @param c The byte to write to the Serial Port + * @return The byte that was written to the Serial Port Buffer + */ + virtual int putc(int c); + + /** Write a string to the BufferedSerial Port. Must be NULL terminated + * @param s The string to write to the Serial Port + * @return The number of bytes written to the Serial Port Buffer + */ + virtual int puts(const char *s); + + /** Write a formatted string to the BufferedSerial Port. + * @param format The string + format specifiers to write to the Serial Port + * @return The number of bytes written to the Serial Port Buffer + */ + virtual int printf(const char* format, ...); + + /** Write data to the Buffered Serial Port + * @param s A pointer to data to send + * @param length The amount of data being pointed to + * @return The number of bytes written to the Serial Port Buffer + */ + virtual ssize_t write(const void *s, std::size_t length); + + /** Attach a function to call whenever a serial interrupt is generated + * @param func A pointer to a void function, or 0 to set as none + * @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty) + */ + virtual void attach(Callback<void()> func, IrqType type=RxIrq); + + /** Attach a member function to call whenever a serial interrupt is generated + * @param obj pointer to the object to call the member function on + * @param method pointer to the member function to call + * @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty) + */ + template <typename T> + void attach(T *obj, void (T::*method)(), IrqType type=RxIrq) { + attach(Callback<void()>(obj, method), type); + } + + /** Attach a member function to call whenever a serial interrupt is generated + * @param obj pointer to the object to call the member function on + * @param method pointer to the member function to call + * @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty) + */ + template <typename T> + void attach(T *obj, void (*method)(T*), IrqType type=RxIrq) { + attach(Callback<void()>(obj, method), type); + } +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ATParser/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +# AT Command Parser + +An mbed-os compatible AT command parser.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ESP8266.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,306 @@ +/* ESP8266 Example + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ + +#include "ESP8266.h" + +ESP8266::ESP8266(PinName tx, PinName rx, bool debug) + : _serial(tx, rx, 1024), _parser(_serial) + , _packets(0), _packets_end(&_packets) +{ + _serial.baud(115200); + _parser.debugOn(debug); +} + +bool ESP8266::startup(int mode) +{ + //only 3 valid modes + if(mode < 1 || mode > 3) { + return false; + } + + bool success = reset() + && _parser.send("AT+CWMODE=%d", mode) + && _parser.recv("OK") + && _parser.send("AT+CIPMUX=1") + && _parser.recv("OK"); + + _parser.oob("+IPD", this, &ESP8266::_packet_handler); + + return success; +} + +bool ESP8266::reset(void) +{ + for (int i = 0; i < 2; i++) { + if (_parser.send("AT+RST") + && _parser.recv("OK\r\nready")) { + return true; + } + } + + return false; +} + +bool ESP8266::dhcp(bool enabled, int mode) +{ + //only 3 valid modes + if(mode < 0 || mode > 2) { + return false; + } + + return _parser.send("AT+CWDHCP=%d,%d", enabled?1:0, mode) + && _parser.recv("OK"); +} + +bool ESP8266::connect(const char *ap, const char *passPhrase) +{ + return _parser.send("AT+CWJAP=\"%s\",\"%s\"", ap, passPhrase) + && _parser.recv("OK"); +} + +bool ESP8266::disconnect(void) +{ + return _parser.send("AT+CWQAP") && _parser.recv("OK"); +} + +const char *ESP8266::getIPAddress(void) +{ + if (!(_parser.send("AT+CIFSR") + && _parser.recv("+CIFSR:STAIP,\"%15[^\"]\"", _ip_buffer) + && _parser.recv("OK"))) { + return 0; + } + + return _ip_buffer; +} + +const char *ESP8266::getMACAddress(void) +{ + if (!(_parser.send("AT+CIFSR") + && _parser.recv("+CIFSR:STAMAC,\"%17[^\"]\"", _mac_buffer) + && _parser.recv("OK"))) { + return 0; + } + + return _mac_buffer; +} + +const char *ESP8266::getGateway() +{ + if (!(_parser.send("AT+CIPSTA?") + && _parser.recv("+CIPSTA:gateway:\"%15[^\"]\"", _gateway_buffer) + && _parser.recv("OK"))) { + return 0; + } + + return _gateway_buffer; +} + +const char *ESP8266::getNetmask() +{ + if (!(_parser.send("AT+CIPSTA?") + && _parser.recv("+CIPSTA:netmask:\"%15[^\"]\"", _netmask_buffer) + && _parser.recv("OK"))) { + return 0; + } + + return _netmask_buffer; +} + +int8_t ESP8266::getRSSI() +{ + int8_t rssi; + char bssid[18]; + + if (!(_parser.send("AT+CWJAP?") + && _parser.recv("+CWJAP:\"%*[^\"]\",\"%17[^\"]\"", bssid) + && _parser.recv("OK"))) { + return 0; + } + + if (!(_parser.send("AT+CWLAP=\"\",\"%s\",", bssid) + && _parser.recv("+CWLAP:(%*d,\"%*[^\"]\",%hhd,", &rssi) + && _parser.recv("OK"))) { + return 0; + } + + return rssi; +} + +bool ESP8266::isConnected(void) +{ + return getIPAddress() != 0; +} + +int ESP8266::scan(WiFiAccessPoint *res, unsigned limit) +{ + unsigned cnt = 0; + nsapi_wifi_ap_t ap; + + if (!_parser.send("AT+CWLAP")) { + return NSAPI_ERROR_DEVICE_ERROR; + } + + while (recv_ap(&ap)) { + if (cnt < limit) { + res[cnt] = WiFiAccessPoint(ap); + } + + cnt++; + if (limit != 0 && cnt >= limit) { + break; + } + } + + return cnt; +} + +bool ESP8266::open(const char *type, int id, const char* addr, int port) +{ + //IDs only 0-4 + if(id > 4) { + return false; + } + + return _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d", id, type, addr, port) + && _parser.recv("OK"); +} + +bool ESP8266::send(int id, const void *data, uint32_t amount) +{ + //May take a second try if device is busy + for (unsigned i = 0; i < 2; i++) { + if (_parser.send("AT+CIPSEND=%d,%d", id, amount) + && _parser.recv(">") + && _parser.write((char*)data, (int)amount) >= 0) { + return true; + } + } + + return false; +} + +void ESP8266::_packet_handler() +{ + int id; + uint32_t amount; + + // parse out the packet + if (!_parser.recv(",%d,%d:", &id, &amount)) { + return; + } + + struct packet *packet = (struct packet*)malloc( + sizeof(struct packet) + amount); + if (!packet) { + return; + } + + packet->id = id; + packet->len = amount; + packet->next = 0; + + if (!(_parser.read((char*)(packet + 1), amount))) { + free(packet); + return; + } + + // append to packet list + *_packets_end = packet; + _packets_end = &packet->next; +} + +int32_t ESP8266::recv(int id, void *data, uint32_t amount) +{ + while (true) { + // check if any packets are ready for us + for (struct packet **p = &_packets; *p; p = &(*p)->next) { + if ((*p)->id == id) { + struct packet *q = *p; + + if (q->len <= amount) { // Return and remove full packet + memcpy(data, q+1, q->len); + + if (_packets_end == &(*p)->next) { + _packets_end = p; + } + *p = (*p)->next; + + uint32_t len = q->len; + free(q); + return len; + } else { // return only partial packet + memcpy(data, q+1, amount); + + q->len -= amount; + memmove(q+1, (uint8_t*)(q+1) + amount, q->len); + + return amount; + } + } + } + + // Wait for inbound packet + if (!_parser.recv("OK")) { + return -1; + } + } +} + +bool ESP8266::close(int id) +{ + //May take a second try if device is busy + for (unsigned i = 0; i < 2; i++) { + if (_parser.send("AT+CIPCLOSE=%d", id) + && _parser.recv("OK")) { + return true; + } + } + + return false; +} + +void ESP8266::setTimeout(uint32_t timeout_ms) +{ + _parser.setTimeout(timeout_ms); +} + +bool ESP8266::readable() +{ + return _serial.readable(); +} + +bool ESP8266::writeable() +{ + return _serial.writeable(); +} + +void ESP8266::attach(Callback<void()> func) +{ + _serial.attach(func); +} + +bool ESP8266::recv_ap(nsapi_wifi_ap_t *ap) +{ + int sec; + bool ret = _parser.recv("+CWLAP:(%d,\"%32[^\"]\",%hhd,\"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\",%d", &sec, ap->ssid, + &ap->rssi, &ap->bssid[0], &ap->bssid[1], &ap->bssid[2], &ap->bssid[3], &ap->bssid[4], + &ap->bssid[5], &ap->channel); + + ap->security = sec < 5 ? (nsapi_security_t)sec : NSAPI_SECURITY_UNKNOWN; + + return ret; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266/ESP8266.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,213 @@ +/* ESP8266Interface Example + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ + +#ifndef ESP8266_H +#define ESP8266_H + +#include "ATParser.h" + +/** ESP8266Interface class. + This is an interface to a ESP8266 radio. + */ +class ESP8266 +{ +public: + ESP8266(PinName tx, PinName rx, bool debug=false); + + /** + * Startup the ESP8266 + * + * @param mode mode of WIFI 1-client, 2-host, 3-both + * @return true only if ESP8266 was setup correctly + */ + bool startup(int mode); + + /** + * Reset ESP8266 + * + * @return true only if ESP8266 resets successfully + */ + bool reset(void); + + /** + * Enable/Disable DHCP + * + * @param enabled DHCP enabled when true + * @param mode mode of DHCP 0-softAP, 1-station, 2-both + * @return true only if ESP8266 enables/disables DHCP successfully + */ + bool dhcp(bool enabled, int mode); + + /** + * Connect ESP8266 to AP + * + * @param ap the name of the AP + * @param passPhrase the password of AP + * @return true only if ESP8266 is connected successfully + */ + bool connect(const char *ap, const char *passPhrase); + + /** + * Disconnect ESP8266 from AP + * + * @return true only if ESP8266 is disconnected successfully + */ + bool disconnect(void); + + /** + * Get the IP address of ESP8266 + * + * @return null-teriminated IP address or null if no IP address is assigned + */ + const char *getIPAddress(void); + + /** + * Get the MAC address of ESP8266 + * + * @return null-terminated MAC address or null if no MAC address is assigned + */ + const char *getMACAddress(void); + + /** Get the local gateway + * + * @return Null-terminated representation of the local gateway + * or null if no network mask has been recieved + */ + const char *getGateway(); + + /** Get the local network mask + * + * @return Null-terminated representation of the local network mask + * or null if no network mask has been recieved + */ + const char *getNetmask(); + + /* Return RSSI for active connection + * + * @return Measured RSSI + */ + int8_t getRSSI(); + + /** + * Check if ESP8266 is conenected + * + * @return true only if the chip has an IP address + */ + bool isConnected(void); + + /** Scan for available networks + * + * @param ap Pointer to allocated array to store discovered AP + * @param limit Size of allocated @a res array, or 0 to only count available AP + * @return Number of entries in @a res, or if @a count was 0 number of available networks, negative on error + * see @a nsapi_error + */ + int scan(WiFiAccessPoint *res, unsigned limit); + + /** + * Open a socketed connection + * + * @param type the type of socket to open "UDP" or "TCP" + * @param id id to give the new socket, valid 0-4 + * @param port port to open connection with + * @param addr the IP address of the destination + * @return true only if socket opened successfully + */ + bool open(const char *type, int id, const char* addr, int port); + + /** + * Sends data to an open socket + * + * @param id id of socket to send to + * @param data data to be sent + * @param amount amount of data to be sent - max 1024 + * @return true only if data sent successfully + */ + bool send(int id, const void *data, uint32_t amount); + + /** + * Receives data from an open socket + * + * @param id id to receive from + * @param data placeholder for returned information + * @param amount number of bytes to be received + * @return the number of bytes received + */ + int32_t recv(int id, void *data, uint32_t amount); + + /** + * Closes a socket + * + * @param id id of socket to close, valid only 0-4 + * @return true only if socket is closed successfully + */ + bool close(int id); + + /** + * Allows timeout to be changed between commands + * + * @param timeout_ms timeout of the connection + */ + void setTimeout(uint32_t timeout_ms); + + /** + * Checks if data is available + */ + bool readable(); + + /** + * Checks if data can be written + */ + bool writeable(); + + /** + * Attach a function to call whenever network state has changed + * + * @param func A pointer to a void function, or 0 to set as none + */ + void attach(Callback<void()> func); + + /** + * Attach a function to call whenever network state has changed + * + * @param obj pointer to the object to call the member function on + * @param method pointer to the member function to call + */ + template <typename T, typename M> + void attach(T *obj, M method) { + attach(Callback<void()>(obj, method)); + } + +private: + BufferedSerial _serial; + ATParser _parser; + + struct packet { + struct packet *next; + int id; + uint32_t len; + // data follows + } *_packets, **_packets_end; + void _packet_handler(); + bool recv_ap(nsapi_wifi_ap_t *ap); + + char _ip_buffer[16]; + char _gateway_buffer[16]; + char _netmask_buffer[16]; + char _mac_buffer[18]; +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266Interface.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,282 @@ +/* ESP8266 implementation of NetworkInterfaceAPI + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ + +#include <string.h> +#include "ESP8266Interface.h" + +// Various timeouts for different ESP8266 operations +#define ESP8266_CONNECT_TIMEOUT 15000 +#define ESP8266_SEND_TIMEOUT 500 +#define ESP8266_RECV_TIMEOUT 0 +#define ESP8266_MISC_TIMEOUT 500 + +// ESP8266Interface implementation +ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug) + : _esp(tx, rx, debug) +{ + memset(_ids, 0, sizeof(_ids)); + memset(_cbs, 0, sizeof(_cbs)); + + _esp.attach(this, &ESP8266Interface::event); +} + +int ESP8266Interface::connect(const char *ssid, const char *pass, nsapi_security_t security, + uint8_t channel) +{ + if (channel != 0) { + return NSAPI_ERROR_UNSUPPORTED; + } + + set_credentials(ssid, pass, security); + return connect(); +} + +int ESP8266Interface::connect() +{ + _esp.setTimeout(ESP8266_CONNECT_TIMEOUT); + + if (!_esp.startup(3)) { + return NSAPI_ERROR_DEVICE_ERROR; + } + + if (!_esp.dhcp(true, 1)) { + return NSAPI_ERROR_DHCP_FAILURE; + } + + if (!_esp.connect(ap_ssid, ap_pass)) { + return NSAPI_ERROR_NO_CONNECTION; + } + + if (!_esp.getIPAddress()) { + return NSAPI_ERROR_DHCP_FAILURE; + } + + return NSAPI_ERROR_OK; +} + +int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security) +{ + memset(ap_ssid, 0, sizeof(ap_ssid)); + strncpy(ap_ssid, ssid, sizeof(ap_ssid)); + + memset(ap_pass, 0, sizeof(ap_pass)); + strncpy(ap_pass, pass, sizeof(ap_pass)); + + ap_sec = security; + + return 0; +} + +int ESP8266Interface::set_channel(uint8_t channel) +{ + return NSAPI_ERROR_UNSUPPORTED; +} + + +int ESP8266Interface::disconnect() +{ + _esp.setTimeout(ESP8266_MISC_TIMEOUT); + + if (!_esp.disconnect()) { + return NSAPI_ERROR_DEVICE_ERROR; + } + + return NSAPI_ERROR_OK; +} + +const char *ESP8266Interface::get_ip_address() +{ + return _esp.getIPAddress(); +} + +const char *ESP8266Interface::get_mac_address() +{ + return _esp.getMACAddress(); +} + +const char *ESP8266Interface::get_gateway() +{ + return _esp.getGateway(); +} + +const char *ESP8266Interface::get_netmask() +{ + return _esp.getNetmask(); +} + +int8_t ESP8266Interface::get_rssi() +{ + return _esp.getRSSI(); +} + +int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count) +{ + return _esp.scan(res, count); +} + +struct esp8266_socket { + int id; + nsapi_protocol_t proto; + bool connected; + SocketAddress addr; +}; + +int ESP8266Interface::socket_open(void **handle, nsapi_protocol_t proto) +{ + // Look for an unused socket + int id = -1; + + for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) { + if (!_ids[i]) { + id = i; + _ids[i] = true; + break; + } + } + + if (id == -1) { + return NSAPI_ERROR_NO_SOCKET; + } + + struct esp8266_socket *socket = new struct esp8266_socket; + if (!socket) { + return NSAPI_ERROR_NO_SOCKET; + } + + socket->id = id; + socket->proto = proto; + socket->connected = false; + *handle = socket; + return 0; +} + +int ESP8266Interface::socket_close(void *handle) +{ + struct esp8266_socket *socket = (struct esp8266_socket *)handle; + int err = 0; + _esp.setTimeout(ESP8266_MISC_TIMEOUT); + + if (!_esp.close(socket->id)) { + err = NSAPI_ERROR_DEVICE_ERROR; + } + + _ids[socket->id] = false; + delete socket; + return err; +} + +int ESP8266Interface::socket_bind(void *handle, const SocketAddress &address) +{ + return NSAPI_ERROR_UNSUPPORTED; +} + +int ESP8266Interface::socket_listen(void *handle, int backlog) +{ + return NSAPI_ERROR_UNSUPPORTED; +} + +int ESP8266Interface::socket_connect(void *handle, const SocketAddress &addr) +{ + struct esp8266_socket *socket = (struct esp8266_socket *)handle; + _esp.setTimeout(ESP8266_MISC_TIMEOUT); + + const char *proto = (socket->proto == NSAPI_UDP) ? "UDP" : "TCP"; + if (!_esp.open(proto, socket->id, addr.get_ip_address(), addr.get_port())) { + return NSAPI_ERROR_DEVICE_ERROR; + } + + socket->connected = true; + return 0; +} + +int ESP8266Interface::socket_accept(void *server, void **socket, SocketAddress *addr) +{ + return NSAPI_ERROR_UNSUPPORTED; +} + +int ESP8266Interface::socket_send(void *handle, const void *data, unsigned size) +{ + struct esp8266_socket *socket = (struct esp8266_socket *)handle; + _esp.setTimeout(ESP8266_SEND_TIMEOUT); + + if (!_esp.send(socket->id, data, size)) { + return NSAPI_ERROR_DEVICE_ERROR; + } + + return size; +} + +int ESP8266Interface::socket_recv(void *handle, void *data, unsigned size) +{ + struct esp8266_socket *socket = (struct esp8266_socket *)handle; + _esp.setTimeout(ESP8266_RECV_TIMEOUT); + + int32_t recv = _esp.recv(socket->id, data, size); + if (recv < 0) { + return NSAPI_ERROR_WOULD_BLOCK; + } + + return recv; +} + +int ESP8266Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size) +{ + struct esp8266_socket *socket = (struct esp8266_socket *)handle; + + if (socket->connected && socket->addr != addr) { + _esp.setTimeout(ESP8266_MISC_TIMEOUT); + if (!_esp.close(socket->id)) { + return NSAPI_ERROR_DEVICE_ERROR; + } + socket->connected = false; + } + + if (!socket->connected) { + int err = socket_connect(socket, addr); + if (err < 0) { + return err; + } + socket->addr = addr; + } + + return socket_send(socket, data, size); +} + +int ESP8266Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size) +{ + struct esp8266_socket *socket = (struct esp8266_socket *)handle; + int ret = socket_recv(socket, data, size); + if (ret >= 0 && addr) { + *addr = socket->addr; + } + + return ret; +} + +void ESP8266Interface::socket_attach(void *handle, void (*callback)(void *), void *data) +{ + struct esp8266_socket *socket = (struct esp8266_socket *)handle; + _cbs[socket->id].callback = callback; + _cbs[socket->id].data = data; +} + +void ESP8266Interface::event() { + for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) { + if (_cbs[i].callback) { + _cbs[i].callback(_cbs[i].data); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/ESP8266Interface.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,275 @@ +/* ESP8266 implementation of NetworkInterfaceAPI + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ + +#ifndef ESP8266_INTERFACE_H +#define ESP8266_INTERFACE_H + +#include "mbed.h" +#include "ESP8266.h" + + +#define ESP8266_SOCKET_COUNT 5 + +/** ESP8266Interface class + * Implementation of the NetworkStack for the ESP8266 + */ +class ESP8266Interface : public NetworkStack, public WiFiInterface +{ +public: + /** ESP8266Interface lifetime + * @param tx TX pin + * @param rx RX pin + * @param debug Enable debugging + */ + ESP8266Interface(PinName tx, PinName rx, bool debug = false); + + /** Start the interface + * + * Attempts to connect to a WiFi network. Requires ssid and passphrase to be set. + * If passphrase is invalid, NSAPI_ERROR_AUTH_ERROR is returned. + * + * @return 0 on success, negative error code on failure + */ + virtual int connect(); + + /** Start the interface + * + * Attempts to connect to a WiFi network. + * + * @param ssid Name of the network to connect to + * @param pass Security passphrase to connect to the network + * @param security Type of encryption for connection (Default: NSAPI_SECURITY_NONE) + * @param channel This parameter is not supported, setting it to anything else than 0 will result in NSAPI_ERROR_UNSUPPORTED + * @return 0 on success, or error code on failure + */ + virtual int connect(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE, + uint8_t channel = 0); + + /** Set the WiFi network credentials + * + * @param ssid Name of the network to connect to + * @param pass Security passphrase to connect to the network + * @param security Type of encryption for connection + * (defaults to NSAPI_SECURITY_NONE) + * @return 0 on success, or error code on failure + */ + virtual int set_credentials(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE); + + /** Set the WiFi network channel - NOT SUPPORTED + * + * This function is not supported and will return NSAPI_ERROR_UNSUPPORTED + * + * @param channel Channel on which the connection is to be made, or 0 for any (Default: 0) + * @return Not supported, returns NSAPI_ERROR_UNSUPPORTED + */ + virtual int set_channel(uint8_t channel); + + /** Stop the interface + * @return 0 on success, negative on failure + */ + virtual int disconnect(); + + /** Get the internally stored IP address + * @return IP address of the interface or null if not yet connected + */ + virtual const char *get_ip_address(); + + /** Get the internally stored MAC address + * @return MAC address of the interface + */ + virtual const char *get_mac_address(); + + /** Get the local gateway + * + * @return Null-terminated representation of the local gateway + * or null if no network mask has been recieved + */ + virtual const char *get_gateway(); + + /** Get the local network mask + * + * @return Null-terminated representation of the local network mask + * or null if no network mask has been recieved + */ + virtual const char *get_netmask(); + + /** Gets the current radio signal strength for active connection + * + * @return Connection strength in dBm (negative value) + */ + virtual int8_t get_rssi(); + + /** Scan for available networks + * + * This function will block. + * + * @param ap Pointer to allocated array to store discovered AP + * @param count Size of allocated @a res array, or 0 to only count available AP + * @param timeout Timeout in milliseconds; 0 for no timeout (Default: 0) + * @return Number of entries in @a, or if @a count was 0 number of available networks, negative on error + * see @a nsapi_error + */ + virtual int scan(WiFiAccessPoint *res, unsigned count); + + /** Translates a hostname to an IP address with specific version + * + * The hostname may be either a domain name or an IP address. If the + * hostname is an IP address, no network transactions will be performed. + * + * If no stack-specific DNS resolution is provided, the hostname + * will be resolve using a UDP socket on the stack. + * + * @param address Destination for the host SocketAddress + * @param host Hostname to resolve + * @param version IP version of address to resolve, NSAPI_UNSPEC indicates + * version is chosen by the stack (defaults to NSAPI_UNSPEC) + * @return 0 on success, negative error code on failure + */ + using NetworkInterface::gethostbyname; + + /** Add a domain name server to list of servers to query + * + * @param addr Destination for the host address + * @return 0 on success, negative error code on failure + */ + using NetworkInterface::add_dns_server; + +protected: + /** Open a socket + * @param handle Handle in which to store new socket + * @param proto Type of socket to open, NSAPI_TCP or NSAPI_UDP + * @return 0 on success, negative on failure + */ + virtual int socket_open(void **handle, nsapi_protocol_t proto); + + /** Close the socket + * @param handle Socket handle + * @return 0 on success, negative on failure + * @note On failure, any memory associated with the socket must still + * be cleaned up + */ + virtual int socket_close(void *handle); + + /** Bind a server socket to a specific port + * @param handle Socket handle + * @param address Local address to listen for incoming connections on + * @return 0 on success, negative on failure. + */ + virtual int socket_bind(void *handle, const SocketAddress &address); + + /** Start listening for incoming connections + * @param handle Socket handle + * @param backlog Number of pending connections that can be queued up at any + * one time [Default: 1] + * @return 0 on success, negative on failure + */ + virtual int socket_listen(void *handle, int backlog); + + /** Connects this TCP socket to the server + * @param handle Socket handle + * @param address SocketAddress to connect to + * @return 0 on success, negative on failure + */ + virtual int socket_connect(void *handle, const SocketAddress &address); + + /** Accept a new connection. + * @param handle Handle in which to store new socket + * @param server Socket handle to server to accept from + * @return 0 on success, negative on failure + * @note This call is not-blocking, if this call would block, must + * immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_accept(void *handle, void **socket, SocketAddress *address); + + /** Send data to the remote host + * @param handle Socket handle + * @param data The buffer to send to the host + * @param size The length of the buffer to send + * @return Number of written bytes on success, negative on failure + * @note This call is not-blocking, if this call would block, must + * immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_send(void *handle, const void *data, unsigned size); + + /** Receive data from the remote host + * @param handle Socket handle + * @param data The buffer in which to store the data received from the host + * @param size The maximum length of the buffer + * @return Number of received bytes on success, negative on failure + * @note This call is not-blocking, if this call would block, must + * immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_recv(void *handle, void *data, unsigned size); + + /** Send a packet to a remote endpoint + * @param handle Socket handle + * @param address The remote SocketAddress + * @param data The packet to be sent + * @param size The length of the packet to be sent + * @return The number of written bytes on success, negative on failure + * @note This call is not-blocking, if this call would block, must + * immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size); + + /** Receive a packet from a remote endpoint + * @param handle Socket handle + * @param address Destination for the remote SocketAddress or null + * @param buffer The buffer for storing the incoming packet data + * If a packet is too long to fit in the supplied buffer, + * excess bytes are discarded + * @param size The length of the buffer + * @return The number of received bytes on success, negative on failure + * @note This call is not-blocking, if this call would block, must + * immediately return NSAPI_ERROR_WOULD_WAIT + */ + virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size); + + /** Register a callback on state change of the socket + * @param handle Socket handle + * @param callback Function to call on state change + * @param data Argument to pass to callback + * @note Callback may be called in an interrupt context. + */ + virtual void socket_attach(void *handle, void (*callback)(void *), void *data); + + /** Provide access to the NetworkStack object + * + * @return The underlying NetworkStack object + */ + virtual NetworkStack *get_stack() + { + return this; + } + +private: + ESP8266 _esp; + bool _ids[ESP8266_SOCKET_COUNT]; + + char ap_ssid[33]; /* 32 is what 802.11 defines as longest possible name; +1 for the \0 */ + nsapi_security_t ap_sec; + uint8_t ap_ch; + char ap_pass[64]; /* The longest allowed passphrase */ + + void event(); + + struct { + void (*callback)(void *); + void *data; + } _cbs[ESP8266_SOCKET_COUNT]; +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/esp8266-driver/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,5 @@ +# esp8266 mbed-os driver +The driver for the ESP8266 WiFi module + +## Firmware version +esp8266 modules come in different shapes and forms, but most important difference is which firmware version it is programmed with. To make sure that your module has mbed-os compatible firmware follow update guide: https://developer.mbed.org/teams/ESP8266/wiki/Firmware-Update
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mbed_lib.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,9 @@ +{ + "name": "easy-connect", + "target_overrides": { + "*": { + "target.features_add": ["COMMON_PAL"] + } + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mcr20a-rf-driver/#d8810e105d7d35315aa708ec51d821156cad45e9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +7e6b68340654c377be718c681750010c4541298d branch 'master' of https://github.com/ARMmbed/mcr20a-rf-driver +a28948345dfbd89719c60b765a9837ffbd434a2e not-for-merge branch 'fixing_mbed_path' of https://github.com/ARMmbed/mcr20a-rf-driver
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d8810e105d7d35315aa708ec51d821156cad45e9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/mcr20a-rf-driver/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file easy-connect/mcr20a-rf-driver/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 d8810e105d7d35315aa708ec51d821156cad45e9 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199006 +0000 clone: from https://github.com/ARMmbed/mcr20a-rf-driver/ +d8810e105d7d35315aa708ec51d821156cad45e9 d8810e105d7d35315aa708ec51d821156cad45e9 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199006 +0000 checkout: moving from master to d8810e105d7d35315aa708ec51d821156cad45e9 +d8810e105d7d35315aa708ec51d821156cad45e9 d8810e105d7d35315aa708ec51d821156cad45e9 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199007 +0000 checkout: moving from d8810e105d7d35315aa708ec51d821156cad45e9 to master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d8810e105d7d35315aa708ec51d821156cad45e9 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199006 +0000 clone: from https://github.com/ARMmbed/mcr20a-rf-driver/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d8810e105d7d35315aa708ec51d821156cad45e9 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487199006 +0000 clone: from https://github.com/ARMmbed/mcr20a-rf-driver/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/logs/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d8810e105d7d35315aa708ec51d821156cad45e9 7e6b68340654c377be718c681750010c4541298d www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787110 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/02/865db7ef99ebab8b7ed5e1b5c19180d7001e2f Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +x+)JMU027c040031Qðu22p)*ÓKfHâoÝñ÷þwÞNÃ9ê¯9®üu]UÃÍGb¦ÍÖ_ü©íH¸pØÆÈ KUù¥e¤ëe0x3) +k/øñ;fí¦Ysë{´öÈ"+JMªZs(jÀºVÿ"ç?çXWWî®U\V\©\PÀpøÓ©wdK|ßÅù9ì?¶Û=MYé°SÏN=øv÷÷ª+õÚ#ç5ËC¥eÝäQ ôí×[¿_jøß-ðïg¶}ñ¼¨SL« +<p½ \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/0a/8554f3274c0bd641370e7847051bacfdeb8a66 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/0c/1a2859120b36fac35ce950bd266d04e3ed8507 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/0e/4cf3ee99953ca19984fe31ffe0644f6ab37f04 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/0f/6c7f5c633b7e391d7cba2f201f3a8685a1b7d4 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/0f/a954a6c35d007da7c03f62ecc17f21f75652de has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/18/40de743f199fc7f402ff7bd3c56ccc58954c16 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/19/a06dee5ede2f7c27cce52cfb328e6006576c98 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x¥1jÄ0ESëÓ/i$[2,!°EúÜ`4{ +ÙÈÚäúQ#¤ùð^ñø¼ç¼5ÀÙ¼´*qÆ8Zbo-êÅ0êsÈ9Ínö4©ªc9ôÑY¦Ä x^Ðù<éqò#Û¨=Û}¯ð.{]ntTªO¸®¿<ð¿-ýÃÉô÷ü +Æ9¯½÷vFU·ýnÔäýSôâ±=zðjÙÊz¤Ï¥m|§²Ê9¨o¨p_± \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/20/8d0295c1411f67259867fd86272a9dfe43cc3d has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/22/04c03fb0924bc71c988a1ce9a52d5db7e803c9 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/2d/75557d97f1cae0d34baf502dcfcbd07ce45343 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xeQKÃ0 }Þ¯¸ôÙ¶«0dÓ1ñe>4¹Õ°47]Êþ»7íª¢o9¹'÷;9õåììs8Ù`r I£¨ÈdJuªÉtHÉyò!ï¢!È[AÙµ§Ézè=ÁÇÒ"<Þ®l (ïî?`"¿%¡Å %éÂÚßt`Ü3ÓOuOäÓ¯T¬Æe Û^ú¤rß¾yANxðTæ¼®ÇtBùæjø5 +]è[¸yZÂ4UVîY÷{5îÐitÊ`Ì;c¾ÎVªmjM:^Ù)·´éàúöÿ75êSçÌó~s}VÒ+¶Ë?1ãä4 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/2e/9215af72d17010b1fd609eadb351a035386cf9 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +x¥ÍjÃ@{öSèÖCÁìãµ!ôÐ[¥WVëb¯Y¯æí+ÚGèe`¾ÄÒ4¬S%3ÕÞµ¬MGJ#ùÞ:Ó; Ñ +MÀÞxT1ÚX-y.,»v§7'Rè&çtgìÎú]£tçÛØV¸KÊðÆ)G\2æ öï¯éÏ¿Dé°^¹¦4=nNé¾·Qª*uÿûPuP +,2MòËZW¯ãþÊ°ÍÛ*éçñãe8Kv¿ùmÛ 3C¹0Oòø%uBâu~,0§2Æ;lË"ðwQ Ãáø7\!3±ìºú¼azà \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/31/b76e128c01acb9372970af3c0d4da92ba0ff3f has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/36/f8c1dd8b26db2a204ee343bc9b1cca89cfe047 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/3d/16f39f0b355ed14d158a5ad2ef66c345fd2669 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/40/97116916be1b04358ba3e84569012380657836 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/42/6961ba19e931271a202d1a43173b19976a45c4 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/43/cb369dc7aa155af93995bb358bd259f891dda5 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/4b/0221132ba0f8fb5cadb2609a9d7f8c2abc1e51 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/4e/1413bd42d39b48bd0547d8814d9d70529dabad Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x¥Kj1³SôÞ`ZÑBH0$ûÜ@în9k5ñõ##dYGQ\×ué@zSq83atEÉbASHÒÙ&+1æhS¶ÜôÖÁ¤^TR LYq9[ê½Ç?ïý«6øÐÚ. +§¼µÜvx¾üòÿøµ;竹®/`æ9`Æy8 !Nc¹]ÿ-ÞDàZ°ÕÇ°Ý÷¶Ë >ßAÚòmúíOX] \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/51/0214274c3a49819284e615389d631ca912ce15 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/55/8982806e80b6ece3193ff27e41a449277f853c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,4 @@ +xQ +!EûvnÀPGí 1´ç{ÚfA»o 6ÐßáÀ¹\jµ®CZç£ç,9xx*T +g0D&` ûàJÔìc(îØómH +9âô#Ä AâXØ ð9Ö%QëËcç/ÒåKkGjuƹ L<i-öZÝîÿFþ¿8jÞT/ûúÚe¥n5ªÎ?)>¿|Ov \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/55/8ecca761792e7c80d03a5c0e99e47d49aadde3 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/55/ed7949e6509ddcfe671046dc8e6bc6453fb767 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/59/48bc25260f0f636066c51c7a270d468f0583ce has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/5d/6da427b48ef68de41fac9f2478d7a05675c3b0 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/62/0e5785b8fddff70d89319c3927eb08a1a9fad9 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/63/037691d31e5413017548618fabfc13ea00962e has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/65/e678ec229fe585dede1e6d6ceb2d29fcfc62f1 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/67/83dfd110a5b808c5e1a5c09af0ba4b4818a75d has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/6d/e6bd10f9796dc18d61fbb391321d9c407afbd3 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/70/ce9021485641775f9581928f71ef06450f418e has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/71/f0db96a14bcfad5c51286ba67aec53a3674224 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/72/e873f0923bc4e89240029f43e9cb23ab674010 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/72/f895683b49bce928fbfaddd7d64ab681122eec has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/74/71c50c837b4b85d8f283182a23459d31793416 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/75/db2c976f25deba71e83141e88207472f633cfd has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/76/f34a69bbb943fe6f7fa00a011d7030e3383bf3 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/79/a446a98e48485c9f91edf7bdb1d12167e3b7fc has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/7b/9a0ec7821de45f92ec0383eec2f02ea74932ff Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x¥ÍjÃ0{öSì=`ô/Ji¥âCK_@^ Yv_¿¢q ·ofÁ8Ï_¤ä%U£fè¤Ôàtp£p;á TºÛN*nä3Ý +ä¦Ó! nt'*EÂÔ?6*J5~-×áb¾|Ê>¯ðxùÕ-ÞõóX7,è'j1ÎOÀ²kf`¬©´Î-ô÷)Qãgÿr¿kåDMÄÞýéC°#l~ZiiÿÒ;=¿¿í³/xÝîùæ/iÍ \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/7b/caf35e20fdcb92e43d2aa23903f041411e958c has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/7d/21b00ba22d1b210caf0a937aab7749fb0a2e66 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/7e/6b68340654c377be718c681750010c4541298d Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +xuPMK1õ¼àð¢(Kö¦EÔ +¤/e6tC7%I-ö×;«Ð÷xïÍQÞ9 UW)ÔeÑ +ÑbYê¢-¡Ðl*ØJY7¦XÒlhH MQJaed+Mi¨ç(9YA¦W6Ê©ó^0$:ÀöéàOñ`aÑ2åã9î ËwPÔM]7²îE!DÆ,÷M`KãèáØ{XÄ åéýc¯Ømh@Gð¶@{§ ä¼Õð+P=ÆN6uà6ÜÞ4wYöA0éInÕ5·ÝM¢¼¼åz»ÚN=%@X¾~ucOÉú×Ùêy¼Îh{ +pLÇõß:¡#ÔÜO±Oä +9Ï¡ +NUÝ5ߣ·â_ÓõrsY+ÿÏ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/7f/132cca3f7b7f2feb48a71b032c0ef1839df1a7 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xu»NÄ0D©óW¢D,~ÛVh© ¡áQ#?®wMâàØ þDI9£9ç9Uàr¼¨WjÞXÊ©(ÍÁhtDÊÒ*ù°ÚK `%H:pÉ©´V^Ò`¥RyÄñ/¯Y4£T;1:#3ÑEBÇ°NJCômõ<ãºfx±g;eØo?jWÕÁyçó|TLA¤+ ºÛOU,pêCs°_rÁuú:S=5÷6<b9"¬m à{ÃÂ¥XòwO³Ãp¶á× {ÈN×5͹{]=u+@Í`?r +à¦ìÏi9BZúÒÖºí¾$Üs \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/83/6b17e4c8a131742067340ef87fe124255a65f3 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/84/fa8c082c87a2c4e4362605979e4e89c0e931c7 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/85/8335a2b2b1b7b003319143c879b6783c18e4cb has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/8e/cf5b680ac9e4c2e8720a48324efbf1b1bd86f3 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/90/b3c4025c969b2faa63f286c4571356b159a1a5 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/95/0e428af5013a721584e45d71b45421d40158bc has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/95/26bfc5c480d5eab26293f158095da3dcde9a0e Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x]AK1 =÷W{vÃîvED¬*zÙdVC³Il[Túßd[-Þòò^æ{Æúêzzñ=Èì0»¬ST2§6×dvHÙetùw1PBÃÆ Èlú£³\ÀðZO° d[ZçûeUÌ õÃãLJQÃÞZz.(ü£ñsïIƽ2ùÔ&"ÎZ±: Ë8öÊmÿá)9MhàÉï¤ +p=H1ÈÛöÔN(ßÝß±F¡iw/sçÊÊ-ë4WãF§Æ^qgÌwÒùÐKµÎiÒGDöjÌ[*N´ùúͧÐä<Ô5¨;lU&9T ôýü_Ãè0ú °X \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/97/2c8c3de8a2a362d1dcb91e345dd7c5522e9305 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/97/421f5031567f4fc597d9a56e029c23f00caa13 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/97/df0e645d35bdd2071ab3c147eff48d500dde44 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/a2/42e35bcea673ac39310b463fa06311bdca17de has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/a2/8948345dfbd89719c60b765a9837ffbd434a2e Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x½J1Fó·^Ù!ÿÈ¥ýMæÆ%Éoï å9|Øk-÷wsARRDãàÖhç°Ü¨Ê5j©Ð¶Än8¨MH)Ú$<*Ô)Dë´´ ÔèÑ#ß4§Äð}æ>à÷¥ÁkWxÈ¿´|tÁQØë#¬ÊxëWm%ÜsÉ9;ì9éwöÔÇ 8K{ n83¤#¦ÚÌØ ^þ*(;´þ ûW´Áì?ÓsßÏzYξ-P_ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/a4/ac803efe4c6b4adecb1c9b56c16be1f7802c66 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,4 @@ +x¥= +1FséI&?ÅÂÊÆd³ ¸Ñóô6¼W|¼Xæ97@R«Vì4bÈ%´{L_arZÇ4G¨¼4°Ö½tìåè8²VN +ÆH¼ÕQW» +'.õÊpê¶×/oâ÷©7<c¸ó&yÊGÚ¯`-QJÑmÏmü÷ÈKn9ÜáÍõË%ÁùxAy©æ.Å RW \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/a5/6963aed6bef9d940e8d5708e06be2d71d929c8 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/a7/7686f2a047b2da49d7328b30f053c73bc028e9 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/a8/6dff3733344fb6369a5aaba25773f56042ff18 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/aa/5667ef467392729cf49612b8da3e8ecbab9120 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/aa/927dde7777cbb59654ea4f643e2eafd9d24db3 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/ac/c25aa610ae854f7243fcce0205ab7b15be972d has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/af/b0b546ecdd51f44169a66d906c5b65c2039da1 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/b1/ddea7d63ddbdc6e2ca59af6316f71ee8f9e70d has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/b3/a7d6982e43c7ba5a1db261e467571b36215683 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/b5/90d12182647706581b143c94012c1462d619b8 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/b9/7c819a0e740b7f717b2981f75fe380827a1692 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/b9/b1382eb53ac73320f1c20b2986a440c49722a6 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/bc/5fe10fd97e239e5a26019580bf7c84e08cd97d has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/c3/0d737b6eb86ea642f9ff66603945d3ee045ebf has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/c3/f2caeea01d744dee5e4e7640bfcfcd8b47075e has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/c6/d6bc4cdb6628a5a9989fab8bc8e8cd9fd28168 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/c9/bad045a769d69d9709505db2db43c5c59da62d has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/ca/29a807256ea38445915c68d57eadff7c2f4331 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/ca/56cae6cae0f6ddd60baaa8a92e87599d32831f has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/cc/4b9cb12a800bdcf4b9f125230c28bbff6d32dd Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x+)JMU027c040031Qðu22p)*ÓKfHâoÝñ÷þwÞNÃ9ê¯9®üu]UÃÍGb¦ÍÖ_ü©íH¸pØÆÈ KUù¥e¤ëe0x3) +k/øñ;fí¦Ysë{´öÈ"+JMªZs(jÀºVÿ"ç?çXWWî®U\V\©\PÀpøÓ©wdK|ßÅù9ì?¶Û=MYé°SÏN=øv÷÷ª+õÚ#ç5ËC¥eÝäQ ôíú [ÝÞÜ üâ¹,wBNtê!æ¹ô¡o \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/cc/964c3d20a90fac64f7e640fbdcecc105fd5970 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/cc/f8ef134d4bd64a643af9f5d52802484df0caa9 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/cd/38b72090af7baac8c9ccfb76709ea8eacad749 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/d3/e76502e4bc7bcc0a7d1c77182353b54018b6f6 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x¥ÁjÃ0D{öW¹,[±¡4Zz(´i¹n¤Ubp¤T ùû*Í'ô8ÃÎÛaL8Ævèrd©¥^¶Äv¹g§îVõb`QiûÆj©ÍP)²Ï°F3;ån{AJ*ëÓ³TÜQ´¯hÎÇñÊ!:G3V?]»~v¥C24qmÂé M×õÔêñ(¤UqKÝÌÿU_ì-ͼç kc8%¼Ð8ÍHòÞ×Lt-?GòØî0&çñºÙÖ÷Jü3sÊlëê#;uJçoÛO?]áÊn×Þp]ý~_¶ \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/d5/04c2085fdd21e130930f01f2d9b393d88a8398 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/d5/806d6ebede85680f75302f3fdad97a0050fb73 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/d6/583d3fcffde81ccd638d1a801d564f90d59b89 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/d7/8395e8087d68381c9476391fae880c1c76300f has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/d8/810e105d7d35315aa708ec51d821156cad45e9 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/dc/169501b60ceb8f89ae8ddc1c6c261820f40c44 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x¥MKÃ@=çWÌQÂ~¥ÙP¬xÓ âÌìNÚ@ Û¶ÿÞü^y_g\Ç>®ìUÌ`+«u IªIe#v¶nhS[í¤eã¨1òÀ°4R7Êë%/*S{k¥ñ¯E¥¾À%C'ñÀ°Å9b\àîðK÷ºìpr8péÂxÒZnUn ¢ÈmÖMüoPñ8! 8y8æ×]?dðûÛײxü¹¾ØÁcBp!ÆeN}Àárbt¿àíüwìq¼ÀÇö½]!Ýê»=Réú¦,¾Ö!u
Binary file easy-connect/mcr20a-rf-driver/.git/objects/dc/321419e543344fd18d7facb378c2f3b82f63e8 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/dc/9eef5f8e370a525df1c7ed24d0125e3c2d75ab Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x¥KNÄ0DYû½GüËØ s4ív°ØǧÇÀXVªêQݶÜÁ(Ó3ÌJjeµ³dЯöOj6>ÄQAib5î- dr^«ÈvNA3Iã 3é$5£³Áèý½6xåÚ3î Ûw˯èO?¤Áp!\y¢ºÝ²ÖYå p+µb¸·ó¿Ä¹Fº÷¼å/ì¹Ë$^ò'G{^ÇŶË2ÇGð\¸-WxâÎÔ! ~z¸æ~Ä7¤hõ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/objects/de/d8678fad855d8ca6b669dd448e03404ca6fc9f Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x]AK1 =÷W{vCº]a«¥ +â¥E!Ìjh6)mJûÛì¶V¼eò^æ{yµ5euö=ȼj1»¬ÕTHS²¤ì<©|6ødBñpk0j²«î ,æ0¼&Ì YVáénQÈ)¢¼øJb|!JØZB1BGÊG'Ú?·LdÜÓOMOäÓT<el{íªu÷(zChá1lp5boc:¡C{=|ÇY>ö-Ü>Ï`k§Ö<÷{ ®ÐôÚbÊ:c¾W>ÄNéeîl6¼"±÷nI3GåòÁõëO¦7.âdjk4Î ÛKQ±Ê] SôÝì_Ýh7ú4 \ No newline at end of file
Binary file easy-connect/mcr20a-rf-driver/.git/objects/e1/e674c8b81f384254d415dcf6e42805a8eaad3a has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/eb/6f2c8e201c9f8228bcecd525415fb534129e1b has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/eb/99aed8db609de6df1874113d7ca16be82782d5 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/ee/8495c80d204ddf972bf5f61d4f6e8ecac88261 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/f3/2a5c3737a70dc828a90f140cf398ee9fbf176e has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/f4/32c6962076588227064fa4761bea534a62fbdf has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/f5/710629b84db1290f7d4f8417fa638e896e3ae4 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/f5/f8b5f7d280ff8b10fd0ef96b3f739e5aca02ab has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/f6/fbfc172fc798d2f1c15a49fadae84ed3f6b3c6 has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/fb/aec7f29a4a5fbc785378a235a9a866cc0d50ef has changed
Binary file easy-connect/mcr20a-rf-driver/.git/objects/fc/1e7ca40846577040c56df52889ba212e0c24ae has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +# pack-refs with: peeled +a28948345dfbd89719c60b765a9837ffbd434a2e refs/remotes/origin/fixing_mbed_path +d8810e105d7d35315aa708ec51d821156cad45e9 refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d8810e105d7d35315aa708ec51d821156cad45e9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.git/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7e6b68340654c377be718c681750010c4541298d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/.gitignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +*~ +*.swo +*.swp +build +yotta_modules +yotta_targets
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/LICENSE Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +Unless specifically indicated otherwise in a file, files are licensed +under the Apache 2.0 license, as can be found in: apache-2.0.txt \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +# Example RF driver for Freescale 802.15.4 transceivers # + +Support for: + * MCR20A + +This driver is used with 6LoWPAN stack. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/apache-2.0.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/mcr20a-rf-driver/NanostackRfPhyMcr20a.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef NANOSTACK_PHY_MCR20A_H_ +#define NANOSTACK_PHY_MCR20A_H_ + +#include "mbed.h" +#include "NanostackRfPhy.h" + +// Arduino pin defaults for convenience +#if !defined(MCR20A_SPI_MOSI) +#define MCR20A_SPI_MOSI D11 +#endif +#if !defined(MCR20A_SPI_MISO) +#define MCR20A_SPI_MISO D12 +#endif +#if !defined(MCR20A_SPI_SCLK) +#define MCR20A_SPI_SCLK D13 +#endif +#if !defined(MCR20A_SPI_CS) +#define MCR20A_SPI_CS D10 +#endif +#if !defined(MCR20A_SPI_RST) +#define MCR20A_SPI_RST D5 +#endif +#if !defined(MCR20A_SPI_IRQ) +#define MCR20A_SPI_IRQ D2 +#endif + +class NanostackRfPhyMcr20a : public NanostackRfPhy { +public: + NanostackRfPhyMcr20a(PinName spi_mosi, PinName spi_miso, + PinName spi_sclk, PinName spi_cs, PinName spi_rst, + PinName spi_irq); + ~NanostackRfPhyMcr20a(); + int8_t rf_register(); + void rf_unregister(); + void get_mac_address(uint8_t *mac); + void set_mac_address(uint8_t *mac); + +private: + SPI _spi; + DigitalOut _rf_cs; + DigitalOut _rf_rst; + InterruptIn _rf_irq; + DigitalIn _rf_irq_pin; + + void _pins_set(); + void _pins_clear(); +}; + +#endif /* NANOSTACK_PHY_MCR20A_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/module.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,18 @@ +{ + "name": "mcr20a-rf-driver", + "version": "0.0.1", + "description": "RF driver for Freescale MCR20A 2.4GHz 802.15.4 wireless transceiver", + "keywords": [ + "rf", + "driver", + "802.15.4" + ], + "author": "Andrei Kovacs <Andrei.Kovacs@freescale.com>", + "license": "BSD 3-clause", + "dependencies": { + "nanostack-libservice": "^3.0.0", + "sal-stack-nanostack": "^5.0.0", + "mbed-drivers": "^1.0.0" + }, + "targetDependencies": {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/source/MCR20Drv.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,675 @@ +/*! +* Copyright (c) 2015, Freescale Semiconductor, Inc. +* All rights reserved. +* +* \file MCR20Drv.c +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* o Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer. +* +* o 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. +* +* o Neither the name of Freescale Semiconductor, Inc. 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 HOLDER 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. +*/ + + +/***************************************************************************** +* INCLUDED HEADERS * +*---------------------------------------------------------------------------* +* Add to this section all the headers that this module needs to include. * +*---------------------------------------------------------------------------* +*****************************************************************************/ + +#include "platform/arm_hal_interrupt.h" +#include "MCR20Drv.h" +#include "MCR20Reg.h" +#include "XcvrSpi.h" + + +/***************************************************************************** +* PRIVATE VARIABLES * +*---------------------------------------------------------------------------* +* Add to this section all the variables and constants that have local * +* (file) scope. * +* Each of this declarations shall be preceded by the 'static' keyword. * +* These variables / constants cannot be accessed outside this module. * +*---------------------------------------------------------------------------* +*****************************************************************************/ +uint32_t mPhyIrqDisableCnt = 1; + +/***************************************************************************** +* PUBLIC VARIABLES * +*---------------------------------------------------------------------------* +* Add to this section all the variables and constants that have global * +* (project) scope. * +* These variables / constants can be accessed outside this module. * +* These variables / constants shall be preceded by the 'extern' keyword in * +* the interface header. * +*---------------------------------------------------------------------------* +*****************************************************************************/ + +/***************************************************************************** +* PRIVATE FUNCTIONS PROTOTYPES * +*---------------------------------------------------------------------------* +* Add to this section all the functions prototypes that have local (file) * +* scope. * +* These functions cannot be accessed outside this module. * +* These declarations shall be preceded by the 'static' keyword. * +*---------------------------------------------------------------------------* +*****************************************************************************/ + +/***************************************************************************** +* PRIVATE FUNCTIONS * +*---------------------------------------------------------------------------* +* Add to this section all the functions that have local (file) scope. * +* These functions cannot be accessed outside this module. * +* These definitions shall be preceded by the 'static' keyword. * +*---------------------------------------------------------------------------* +*****************************************************************************/ + + +/***************************************************************************** +* PUBLIC FUNCTIONS * +*---------------------------------------------------------------------------* +* Add to this section all the functions that have global (project) scope. * +* These functions can be accessed outside this module. * +* These functions shall have their declarations (prototypes) within the * +* interface header file and shall be preceded by the 'extern' keyword. * +*---------------------------------------------------------------------------* +*****************************************************************************/ + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_Init +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_Init +( +void +) +{ + xcvr_spi_init(gXcvrSpiInstance_c); + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 8000000); + + gXcvrDeassertCS_d(); + MCR20Drv_RST_B_Deassert(); + RF_IRQ_Init(); + RF_IRQ_Disable(); + mPhyIrqDisableCnt = 1; +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_DirectAccessSPIWrite +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_DirectAccessSPIWrite +( +uint8_t address, +uint8_t value +) +{ + uint16_t txData; + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 16000000); + + gXcvrAssertCS_d(); + + txData = (address & TransceiverSPI_DirectRegisterAddressMask); + txData |= value << 8; + + xcvr_spi_transfer(gXcvrSpiInstance_c, (uint8_t *)&txData, 0, sizeof(txData)); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_DirectAccessSPIMultiByteWrite +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_DirectAccessSPIMultiByteWrite +( +uint8_t startAddress, +uint8_t * byteArray, +uint8_t numOfBytes +) +{ + uint8_t txData; + + if( (numOfBytes == 0) || (byteArray == 0) ) + { + return; + } + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 16000000); + + gXcvrAssertCS_d(); + + txData = (startAddress & TransceiverSPI_DirectRegisterAddressMask); + + xcvr_spi_transfer(gXcvrSpiInstance_c, &txData, 0, sizeof(txData)); + xcvr_spi_transfer(gXcvrSpiInstance_c, byteArray, 0, numOfBytes); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_PB_SPIByteWrite +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_PB_SPIByteWrite +( +uint8_t address, +uint8_t value +) +{ + uint32_t txData; + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 16000000); + + gXcvrAssertCS_d(); + + txData = TransceiverSPI_WriteSelect | + TransceiverSPI_PacketBuffAccessSelect | + TransceiverSPI_PacketBuffByteModeSelect; + txData |= (address) << 8; + txData |= (value) << 16; + + xcvr_spi_transfer(gXcvrSpiInstance_c, (uint8_t*)&txData, 0, 3); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_PB_SPIBurstWrite +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_PB_SPIBurstWrite +( +uint8_t * byteArray, +uint8_t numOfBytes +) +{ + uint8_t txData; + + if( (numOfBytes == 0) || (byteArray == 0) ) + { + return; + } + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 16000000); + + gXcvrAssertCS_d(); + + txData = TransceiverSPI_WriteSelect | + TransceiverSPI_PacketBuffAccessSelect | + TransceiverSPI_PacketBuffBurstModeSelect; + + xcvr_spi_transfer(gXcvrSpiInstance_c, &txData, 0, 1); + xcvr_spi_transfer(gXcvrSpiInstance_c, byteArray, 0, numOfBytes); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_DirectAccessSPIRead +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ + +uint8_t MCR20Drv_DirectAccessSPIRead +( +uint8_t address +) +{ + uint8_t txData; + uint8_t rxData; + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 8000000); + + gXcvrAssertCS_d(); + + txData = (address & TransceiverSPI_DirectRegisterAddressMask) | + TransceiverSPI_ReadSelect; + + xcvr_spi_transfer(gXcvrSpiInstance_c, &txData, 0, sizeof(txData)); + xcvr_spi_transfer(gXcvrSpiInstance_c, 0, &rxData, sizeof(rxData)); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); + + return rxData; + +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_DirectAccessSPIMultyByteRead +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +uint8_t MCR20Drv_DirectAccessSPIMultiByteRead +( +uint8_t startAddress, +uint8_t * byteArray, +uint8_t numOfBytes +) +{ + uint8_t txData; + uint8_t phyIRQSTS1; + + if( (numOfBytes == 0) || (byteArray == 0) ) + { + return 0; + } + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 8000000); + + gXcvrAssertCS_d(); + + txData = (startAddress & TransceiverSPI_DirectRegisterAddressMask) | + TransceiverSPI_ReadSelect; + + xcvr_spi_transfer(gXcvrSpiInstance_c, &txData, &phyIRQSTS1, sizeof(txData)); + xcvr_spi_transfer(gXcvrSpiInstance_c, 0, byteArray, numOfBytes); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); + + return phyIRQSTS1; +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_PB_SPIBurstRead +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +uint8_t MCR20Drv_PB_SPIBurstRead +( +uint8_t * byteArray, +uint8_t numOfBytes +) +{ + uint8_t txData; + uint8_t phyIRQSTS1; + + if( (numOfBytes == 0) || (byteArray == 0) ) + { + return 0; + } + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 8000000); + + gXcvrAssertCS_d(); + + txData = TransceiverSPI_ReadSelect | + TransceiverSPI_PacketBuffAccessSelect | + TransceiverSPI_PacketBuffBurstModeSelect; + + xcvr_spi_transfer(gXcvrSpiInstance_c, &txData, &phyIRQSTS1, sizeof(txData)); + xcvr_spi_transfer(gXcvrSpiInstance_c, 0, byteArray, numOfBytes); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); + + return phyIRQSTS1; +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_IndirectAccessSPIWrite +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_IndirectAccessSPIWrite +( +uint8_t address, +uint8_t value +) +{ + uint32_t txData; + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 16000000); + + gXcvrAssertCS_d(); + + txData = TransceiverSPI_IARIndexReg; + txData |= (address) << 8; + txData |= (value) << 16; + + xcvr_spi_transfer(gXcvrSpiInstance_c, (uint8_t*)&txData, 0, 3); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_IndirectAccessSPIMultiByteWrite +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_IndirectAccessSPIMultiByteWrite +( +uint8_t startAddress, +uint8_t * byteArray, +uint8_t numOfBytes +) +{ + uint16_t txData; + + if( (numOfBytes == 0) || (byteArray == 0) ) + { + return; + } + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 16000000); + + gXcvrAssertCS_d(); + + txData = TransceiverSPI_IARIndexReg; + txData |= (startAddress) << 8; + + xcvr_spi_transfer(gXcvrSpiInstance_c, (uint8_t*)&txData, 0, sizeof(txData)); + xcvr_spi_transfer(gXcvrSpiInstance_c, (uint8_t*)byteArray, 0, numOfBytes); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_IndirectAccessSPIRead +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +uint8_t MCR20Drv_IndirectAccessSPIRead +( +uint8_t address +) +{ + uint16_t txData; + uint8_t rxData; + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 8000000); + + gXcvrAssertCS_d(); + + txData = TransceiverSPI_IARIndexReg | TransceiverSPI_ReadSelect; + txData |= (address) << 8; + + xcvr_spi_transfer(gXcvrSpiInstance_c, (uint8_t*)&txData, 0, sizeof(txData)); + xcvr_spi_transfer(gXcvrSpiInstance_c, 0, &rxData, sizeof(rxData)); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); + + return rxData; +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_IndirectAccessSPIMultiByteRead +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_IndirectAccessSPIMultiByteRead +( +uint8_t startAddress, +uint8_t * byteArray, +uint8_t numOfBytes +) +{ + uint16_t txData; + + if( (numOfBytes == 0) || (byteArray == 0) ) + { + return; + } + + ProtectFromMCR20Interrupt(); + + xcvr_spi_configure_speed(gXcvrSpiInstance_c, 8000000); + + gXcvrAssertCS_d(); + + txData = (TransceiverSPI_IARIndexReg | TransceiverSPI_ReadSelect); + txData |= (startAddress) << 8; + + xcvr_spi_transfer(gXcvrSpiInstance_c, (uint8_t*)&txData, 0, sizeof(txData)); + xcvr_spi_transfer(gXcvrSpiInstance_c, 0, byteArray, numOfBytes); + + gXcvrDeassertCS_d(); + UnprotectFromMCR20Interrupt(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_IsIrqPending +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +uint32_t MCR20Drv_IsIrqPending +( +void +) +{ + return RF_isIRQ_Pending(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_IRQ_Disable +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_IRQ_Disable +( +void +) +{ + platform_enter_critical(); + + if( mPhyIrqDisableCnt == 0 ) + { + RF_IRQ_Disable(); + } + + mPhyIrqDisableCnt++; + + platform_exit_critical(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_IRQ_Enable +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_IRQ_Enable +( +void +) +{ + platform_enter_critical(); + + if( mPhyIrqDisableCnt ) + { + mPhyIrqDisableCnt--; + + if( mPhyIrqDisableCnt == 0 ) + { + RF_IRQ_Enable(); + } + } + + platform_exit_critical(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_RST_Assert +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_RST_B_Assert +( +void +) +{ + RF_RST_Set(0); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_RST_Deassert +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_RST_B_Deassert +( +void +) +{ + RF_RST_Set(1); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_SoftRST_Assert +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_SoftRST_Assert +( +void +) +{ + MCR20Drv_IndirectAccessSPIWrite(SOFT_RESET, (0x80)); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_SoftRST_Deassert +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_SoftRST_Deassert +( +void +) +{ + MCR20Drv_IndirectAccessSPIWrite(SOFT_RESET, (0x00)); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_Soft_RESET +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_Soft_RESET +( +void +) +{ + //assert SOG_RST + MCR20Drv_IndirectAccessSPIWrite(SOFT_RESET, (0x80)); + + //deassert SOG_RST + MCR20Drv_IndirectAccessSPIWrite(SOFT_RESET, (0x00)); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_RESET +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_RESET +( +void +) +{ + volatile uint32_t delay = 1000; + //assert RST_B + MCR20Drv_RST_B_Assert(); + + while(delay--); + + //deassert RST_B + MCR20Drv_RST_B_Deassert(); +} + +/*--------------------------------------------------------------------------- +* Name: MCR20Drv_Set_CLK_OUT_Freq +* Description: - +* Parameters: - +* Return: - +*---------------------------------------------------------------------------*/ +void MCR20Drv_Set_CLK_OUT_Freq +( +uint8_t freqDiv +) +{ + uint8_t clkOutCtrlReg = (freqDiv & cCLK_OUT_DIV_Mask) | cCLK_OUT_EN | cCLK_OUT_EXTEND; + + if(freqDiv == gCLK_OUT_FREQ_DISABLE) + { + clkOutCtrlReg = (cCLK_OUT_EXTEND | gCLK_OUT_FREQ_4_MHz); //reset value with clock out disabled + } + + MCR20Drv_DirectAccessSPIWrite((uint8_t) CLK_OUT_CTRL, clkOutCtrlReg); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/source/MCR20Drv.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,372 @@ +/*! +* Copyright (c) 2015, Freescale Semiconductor, Inc. +* All rights reserved. +* +* \file MCR20Drv.h +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* o Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer. +* +* o 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. +* +* o Neither the name of Freescale Semiconductor, Inc. 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 HOLDER 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. +*/ + +#ifndef __MCR20_DRV_H__ +#define __MCR20_DRV_H__ + + +/***************************************************************************** + * INCLUDED HEADERS * + *---------------------------------------------------------------------------* + * Add to this section all the headers that this module needs to include. * + * Note that it is not a good practice to include header files into header * + * files, so use this section only if there is no other better solution. * + *---------------------------------------------------------------------------* + *****************************************************************************/ + +/***************************************************************************** + * PRIVATE MACROS * + *---------------------------------------------------------------------------* + * Add to this section all the access macros, registers mappings, bit access * + * macros, masks, flags etc ... + *---------------------------------------------------------------------------* + *****************************************************************************/ + +/* Disable XCVR clock output by default, to reduce power consumption */ +#ifndef gMCR20_ClkOutFreq_d +#define gMCR20_ClkOutFreq_d gCLK_OUT_FREQ_DISABLE +#endif + +/***************************************************************************** + * PUBLIC FUNCTIONS * + *---------------------------------------------------------------------------* + * Add to this section all the global functions prototype preceded (as a * + * good practice) by the keyword 'extern' * + *---------------------------------------------------------------------------* + *****************************************************************************/ + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_Init + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +extern void MCR20Drv_Init +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_SPI_DMA_Init + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_SPI_DMA_Init +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_Start_PB_DMA_SPI_Write + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_Start_PB_DMA_SPI_Write +( + uint8_t * srcAddress, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_Start_PB_DMA_SPI_Read + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_Start_PB_DMA_SPI_Read +( + uint8_t * dstAddress, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_DirectAccessSPIWrite + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_DirectAccessSPIWrite +( + uint8_t address, + uint8_t value +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_DirectAccessSPIMultiByteWrite + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_DirectAccessSPIMultiByteWrite +( + uint8_t startAddress, + uint8_t * byteArray, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_PB_SPIBurstWrite + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_PB_SPIBurstWrite +( + uint8_t * byteArray, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_DirectAccessSPIRead + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +uint8_t MCR20Drv_DirectAccessSPIRead +( + uint8_t address +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_DirectAccessSPIMultyByteRead + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ + +uint8_t MCR20Drv_DirectAccessSPIMultiByteRead +( + uint8_t startAddress, + uint8_t * byteArray, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_PB_SPIByteWrite + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_PB_SPIByteWrite +( + uint8_t address, + uint8_t value +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_PB_SPIBurstRead + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +uint8_t MCR20Drv_PB_SPIBurstRead +( + uint8_t * byteArray, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_IndirectAccessSPIWrite + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_IndirectAccessSPIWrite +( + uint8_t address, + uint8_t value +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_IndirectAccessSPIMultiByteWrite + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_IndirectAccessSPIMultiByteWrite +( + uint8_t startAddress, + uint8_t * byteArray, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_IndirectAccessSPIRead + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +uint8_t MCR20Drv_IndirectAccessSPIRead +( + uint8_t address +); +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_IndirectAccessSPIMultiByteRead + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_IndirectAccessSPIMultiByteRead +( + uint8_t startAddress, + uint8_t * byteArray, + uint8_t numOfBytes +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_IsIrqPending + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +uint32_t MCR20Drv_IsIrqPending +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_IRQ_Disable + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_IRQ_Disable +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_IRQ_Enable + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_IRQ_Enable +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_RST_PortConfig + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_RST_B_PortConfig +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_RST_Assert + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_RST_B_Assert +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_RST_Deassert + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_RST_B_Deassert +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_SoftRST_Assert + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_SoftRST_Assert +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_SoftRST_Deassert + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_SoftRST_Deassert +( + void +); + + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_RESET + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_RESET +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_Soft_RESET + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_Soft_RESET +( + void +); + +/*--------------------------------------------------------------------------- + * Name: MCR20Drv_Set_CLK_OUT_Freq + * Description: - + * Parameters: - + * Return: - + *---------------------------------------------------------------------------*/ +void MCR20Drv_Set_CLK_OUT_Freq +( + uint8_t freqDiv +); + +#define ProtectFromMCR20Interrupt() MCR20Drv_IRQ_Disable() +#define UnprotectFromMCR20Interrupt() MCR20Drv_IRQ_Enable() + +#endif /* __MCR20_DRV_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/source/MCR20Overwrites.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,309 @@ +/*! +* Copyright (c) 2015, Freescale Semiconductor, Inc. +* All rights reserved. +* +* \file MCR20Overwrites.h +* Description: Overwrites header file for MCR20 Register values +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* o Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer. +* +* o 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. +* +* o Neither the name of Freescale Semiconductor, Inc. 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 HOLDER 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. +*/ + +#ifndef OVERWRITES_H_ +#define OVERWRITES_H_ + +typedef struct overwrites_tag { + char address; + char data; +}overwrites_t; + + +/*****************************************************************************************************************/ +// This file is created exclusively for use with the transceiver 2.0 silicon +// and is provided for the world to use. It contains a list of all +// known overwrite values. Overwrite values are non-default register +// values that configure the transceiver device to a more optimally performing +// posture. It is expected that low level software (i.e. PHY) will +// consume this file as a #include, and transfer the contents to the +// the indicated addresses in the transceiver's memory space. This file has +// at least one required entry, that being its own version current version +// number, to be stored at transceiver's location 0x3B the +// OVERWRITES_VERSION_NUMBER register. The RAM register is provided in +// the transceiver address space to assist in future debug efforts. The +// analyst may read this location (once device has been booted with +// mysterious software) and have a good indication of what register +// overwrites were performed (with all versions of the overwrites.h file +// being archived forever at the Compass location shown above. +// +// The transceiver has an indirect register (IAR) space. Write access to this space +// requires 3 or more writes: +// 1st) the first write is an index value to the indirect (write Bit7=0, register access Bit 6=0) + 0x3E +// 2nd) IAR Register #0x00 - 0xFF. +// 3rd) The data to write +// nth) Burst mode additional data if required. +// +// Write access to direct space requires only a single address, data pair. + +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x0C}, //version 0C: new value for ACKDELAY targeting 198us (23 May, 2013, Larry Roshak) +{0x23, 0x17} //PA_PWR new default Power Step is "23" +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1 override VCOALC_REF_TX to 3 +{0x92, 0x07}, //VCO_CTRL2 override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71}, //PA_TUNING override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +{0x79, 0x2F}, //CHF_IBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7A, 0x2F}, //CHF_QBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7B, 0x24}, //CHF_IRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7C, 0x24}, //CHF_QRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7D, 0x24}, //CHF_IL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7E, 0x24}, //CHF_QL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7F, 0x32}, //CHF_CC1 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x80, 0x1D}, //CHF_CCL Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x81, 0x2D}, //CHF_CC2 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x82, 0x24}, //CHF_IROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x83, 0x24}, //CHF_QROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x64, 0x28}, //PA_CAL_DIS=1 Disabled PA calibration +{0x52, 0x55}, //AGC_THR1 RSSI tune up +{0x53, 0x2D}, //AGC_THR2 RSSI tune up +{0x66, 0x5F}, //ATT_RSSI1 tune up +{0x67, 0x8F}, //ATT_RSSI2 tune up +{0x68, 0x61}, //RSSI_OFFSET +{0x78, 0x03}, //CHF_PMAGAIN +{0x22, 0x50}, //CCA1_THRESH +{0x4D, 0x13}, //CORR_NVAL moved from 0x14 to 0x13 for 0.5 dB improved Rx Sensitivity +{0x39, 0x3D} //ACKDELAY new value targeting a delay of 198us (23 May, 2013, Larry Roshak) +}; + + +/* begin of deprecated versions + +==VERSION 1== +(version 1 is empty) + +==VERSION 2== +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02} //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +}; + +==VERSION 3== +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1: override VCOALC_REF_TX to 3 +{0x92, 0x07} //VCO_CTRL2: override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +}; + +==VERSION 4== +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x04} //version 04 is the current version: update PA_COILTUNING default +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1: override VCOALC_REF_TX to 3 +{0x92, 0x07} //VCO_CTRL2: override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71} //PA_TUNING: override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +}; + +==VERSION 5== +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x05} //version 05: updates Channel Filter Register set (21 Dec 2012, on behalf of S. Soca) +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1 override VCOALC_REF_TX to 3 +{0x92, 0x07} //VCO_CTRL2 override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71} //PA_TUNING override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +{0x79, 0x2F} //CHF_IBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7A, 0x2F} //CHF_QBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7B, 0x24} //CHF_IRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7C, 0x24} //CHF_QRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7D, 0x24} //CHF_IL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7E, 0x24} //CHF_QL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x82, 0x24} //CHF_IROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x83, 0x24} //CHF_QROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7F, 0x32} //CHF_CC1 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x80, 0x1D} //CHF_CCL Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x81, 0x2D} //CHF_CC2 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +}; + +==VERSION 6== +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x06} //version 06: disable PA calibration +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1 override VCOALC_REF_TX to 3 +{0x92, 0x07} //VCO_CTRL2 override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71} //PA_TUNING override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +{0x79, 0x2F} //CHF_IBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7A, 0x2F} //CHF_QBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7B, 0x24} //CHF_IRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7C, 0x24} //CHF_QRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7D, 0x24} //CHF_IL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7E, 0x24} //CHF_QL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x82, 0x24} //CHF_IROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x83, 0x24} //CHF_QROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7F, 0x32} //CHF_CC1 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x80, 0x1D} //CHF_CCL Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x81, 0x2D} //CHF_CC2 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x64, 0x28} //PA_CAL_DIS=1 Disabled PA calibration +}; + +==VERSION 7== +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x07} //version 07: updated registers for ED/RSSI +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1 override VCOALC_REF_TX to 3 +{0x92, 0x07}, //VCO_CTRL2 override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71}, //PA_TUNING override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +{0x79, 0x2F}, //CHF_IBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7A, 0x2F}, //CHF_QBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7B, 0x24}, //CHF_IRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7C, 0x24}, //CHF_QRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7D, 0x24}, //CHF_IL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7E, 0x24}, //CHF_QL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x82, 0x24}, //CHF_IROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x83, 0x24}, //CHF_QROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7F, 0x32}, //CHF_CC1 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x80, 0x1D}, //CHF_CCL Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x81, 0x2D}, //CHF_CC2 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x64, 0x28}, //PA_CAL_DIS=1 Disabled PA calibration +{0x52, 0x73}, //AGC_THR1 RSSI tune up +{0x53, 0x2D}, //AGC_THR2 RSSI tune up +{0x66, 0x5F}, //ATT_RSSI1 tune up +{0x67, 0x8F}, //ATT_RSSI2 tune up +{0x68, 0x60}, //RSSI_OFFSET +{0x69, 0x65} //RSSI_SLOPE +}; + + +==VERSION 8== +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x08} //version 08: updated registers for ED/RSSI +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1 override VCOALC_REF_TX to 3 +{0x92, 0x07}, //VCO_CTRL2 override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71}, //PA_TUNING override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +{0x79, 0x2F}, //CHF_IBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7A, 0x2F}, //CHF_QBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7B, 0x24}, //CHF_IRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7C, 0x24}, //CHF_QRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7D, 0x24}, //CHF_IL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7E, 0x24}, //CHF_QL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x82, 0x24}, //CHF_IROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x83, 0x24}, //CHF_QROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7F, 0x32}, //CHF_CC1 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x80, 0x1D}, //CHF_CCL Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x81, 0x2D}, //CHF_CC2 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x64, 0x28}, //PA_CAL_DIS=1 Disabled PA calibration +{0x52, 0x73}, //AGC_THR1 RSSI tune up +{0x53, 0x2D}, //AGC_THR2 RSSI tune up +{0x66, 0x5F}, //ATT_RSSI1 tune up +{0x67, 0x8F}, //ATT_RSSI2 tune up +{0x69, 0x65} //RSSI_SLOPE +{0x68, 0x61}, //RSSI_OFFSET +{0x78, 0x03} //CHF_PMAGAIN +}; + + +==VERSION 9== +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x09} //version 09: updated registers for ED/RSSI and PowerStep +{0x23, 0x17} //PA_PWR new default value +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1 override VCOALC_REF_TX to 3 +{0x92, 0x07}, //VCO_CTRL2 override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71}, //PA_TUNING override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +{0x79, 0x2F}, //CHF_IBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7A, 0x2F}, //CHF_QBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7B, 0x24}, //CHF_IRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7C, 0x24}, //CHF_QRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7D, 0x24}, //CHF_IL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7E, 0x24}, //CHF_QL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7F, 0x32}, //CHF_CC1 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x80, 0x1D}, //CHF_CCL Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x81, 0x2D}, //CHF_CC2 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x82, 0x24}, //CHF_IROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x83, 0x24}, //CHF_QROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x64, 0x28}, //PA_CAL_DIS=1 Disabled PA calibration +{0x52, 0x55}, //AGC_THR1 RSSI tune up +{0x53, 0x2D}, //AGC_THR2 RSSI tune up +{0x66, 0x5F}, //ATT_RSSI1 tune up +{0x67, 0x8F}, //ATT_RSSI2 tune up +{0x68, 0x61}, //RSSI_OFFSET +{0x78, 0x03} //CHF_PMAGAIN +}; + +==VERSION A== +overwrites_t const overwrites_direct[] ={ +{0x3B, 0x0A} //version 0A: updated registers for CCA +{0x23, 0x17} //PA_PWR new default Power Step is "23" +}; + +overwrites_t const overwrites_indirect[] ={ +{0x31, 0x02}, //clear MISO_HIZ_EN (for single SPI master/slave pair) and SPI_PUL_EN (minimize HIB currents) +{0x91, 0xB3}, //VCO_CTRL1 override VCOALC_REF_TX to 3 +{0x92, 0x07}, //VCO_CTRL2 override VCOALC_REF_RX to 3, keep VCO_BUF_BOOST = 1 +{0x8A, 0x71}, //PA_TUNING override PA_COILTUNING to 001 (27 Nov 2012, D. Brown, on behalf of S. Eid) +{0x79, 0x2F}, //CHF_IBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7A, 0x2F}, //CHF_QBUF Adjust the gm-C filter gain (+/- 6dB) (21 Dec, 2012, on behalf of S. Soca) +{0x7B, 0x24}, //CHF_IRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7C, 0x24}, //CHF_QRIN Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7D, 0x24}, //CHF_IL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7E, 0x24}, //CHF_QL Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x7F, 0x32}, //CHF_CC1 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x80, 0x1D}, //CHF_CCL Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x81, 0x2D}, //CHF_CC2 Adjust the filter center frequency (+/- 1MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x82, 0x24}, //CHF_IROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x83, 0x24}, //CHF_QROUT Adjust the filter bandwidth (+/- 0.5MHz) (21 Dec, 2012, on behalf of S. Soca) +{0x64, 0x28}, //PA_CAL_DIS=1 Disabled PA calibration +{0x52, 0x55}, //AGC_THR1 RSSI tune up +{0x53, 0x2D}, //AGC_THR2 RSSI tune up +{0x66, 0x5F}, //ATT_RSSI1 tune up +{0x67, 0x8F}, //ATT_RSSI2 tune up +{0x68, 0x61}, //RSSI_OFFSET +{0x78, 0x03} //CHF_PMAGAIN +{0x22, 0x50} //CCA1_THRESH +}; + +end of deprecated versions */ + + +#endif //OVERWRITES_H_ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/source/MCR20Reg.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,730 @@ +/*! +* Copyright (c) 2015, Freescale Semiconductor, Inc. +* All rights reserved. +* +* \file MCR20reg.h +* MCR20 Registers +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* o Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer. +* +* o 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. +* +* o Neither the name of Freescale Semiconductor, Inc. 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 HOLDER 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. +*/ + +#ifndef __MCR20_REG_H__ +#define __MCR20_REG_H__ +/***************************************************************************** + * INCLUDED HEADERS * + *---------------------------------------------------------------------------* + * Add to this section all the headers that this module needs to include. * + * Note that it is not a good practice to include header files into header * + * files, so use this section only if there is no other better solution. * + *---------------------------------------------------------------------------* + *****************************************************************************/ + +/****************************************************************************/ +/* Transceiver SPI Registers */ +/****************************************************************************/ + +#define TransceiverSPI_IARIndexReg (0x3E) + +#define TransceiverSPI_ReadSelect (1<<7) +#define TransceiverSPI_WriteSelect (0<<7) +#define TransceiverSPI_RegisterAccessSelect (0<<6) +#define TransceiverSPI_PacketBuffAccessSelect (1<<6) +#define TransceiverSPI_PacketBuffBurstModeSelect (0<<5) +#define TransceiverSPI_PacketBuffByteModeSelect (1<<5) + +#define TransceiverSPI_DirectRegisterAddressMask (0x3F) + +#define IRQSTS1 0x00 +#define IRQSTS2 0x01 +#define IRQSTS3 0x02 +#define PHY_CTRL1 0x03 +#define PHY_CTRL2 0x04 +#define PHY_CTRL3 0x05 +#define RX_FRM_LEN 0x06 +#define PHY_CTRL4 0x07 +#define SRC_CTRL 0x08 +#define SRC_ADDRS_SUM_LSB 0x09 +#define SRC_ADDRS_SUM_MSB 0x0A +#define CCA1_ED_FNL 0x0B +#define EVENT_TMR_LSB 0x0C +#define EVENT_TMR_MSB 0x0D +#define EVENT_TMR_USB 0x0E +#define TIMESTAMP_LSB 0x0F +#define TIMESTAMP_MSB 0x10 +#define TIMESTAMP_USB 0x11 +#define T3CMP_LSB 0x12 +#define T3CMP_MSB 0x13 +#define T3CMP_USB 0x14 +#define T2PRIMECMP_LSB 0x15 +#define T2PRIMECMP_MSB 0x16 +#define T1CMP_LSB 0x17 +#define T1CMP_MSB 0x18 +#define T1CMP_USB 0x19 +#define T2CMP_LSB 0x1A +#define T2CMP_MSB 0x1B +#define T2CMP_USB 0x1C +#define T4CMP_LSB 0x1D +#define T4CMP_MSB 0x1E +#define T4CMP_USB 0x1F +#define PLL_INT0 0x20 +#define PLL_FRAC0_LSB 0x21 +#define PLL_FRAC0_MSB 0x22 +#define PA_PWR 0x23 +#define SEQ_STATE 0x24 +#define LQI_VALUE 0x25 +#define RSSI_CCA_CONT 0x26 +//-------------- 0x27 +#define ASM_CTRL1 0x28 +#define ASM_CTRL2 0x29 +#define ASM_DATA_0 0x2A +#define ASM_DATA_1 0x2B +#define ASM_DATA_2 0x2C +#define ASM_DATA_3 0x2D +#define ASM_DATA_4 0x2E +#define ASM_DATA_5 0x2F +#define ASM_DATA_6 0x30 +#define ASM_DATA_7 0x31 +#define ASM_DATA_8 0x32 +#define ASM_DATA_9 0x33 +#define ASM_DATA_A 0x34 +#define ASM_DATA_B 0x35 +#define ASM_DATA_C 0x36 +#define ASM_DATA_D 0x37 +#define ASM_DATA_E 0x38 +#define ASM_DATA_F 0x39 +//------------------- 0x3A +#define OVERWRITE_VER 0x3B +#define CLK_OUT_CTRL 0x3C +#define PWR_MODES 0x3D +#define IAR_INDEX 0x3E +#define IAR_DATA 0x3F + + +#define PART_ID 0x00 +#define XTAL_TRIM 0x01 +#define PMC_LP_TRIM 0x02 +#define MACPANID0_LSB 0x03 +#define MACPANID0_MSB 0x04 +#define MACSHORTADDRS0_LSB 0x05 +#define MACSHORTADDRS0_MSB 0x06 +#define MACLONGADDRS0_0 0x07 +#define MACLONGADDRS0_8 0x08 +#define MACLONGADDRS0_16 0x09 +#define MACLONGADDRS0_24 0x0A +#define MACLONGADDRS0_32 0x0B +#define MACLONGADDRS0_40 0x0C +#define MACLONGADDRS0_48 0x0D +#define MACLONGADDRS0_56 0x0E +#define RX_FRAME_FILTER 0x0F +#define PLL_INT1 0x10 +#define PLL_FRAC1_LSB 0x11 +#define PLL_FRAC1_MSB 0x12 +#define MACPANID1_LSB 0x13 +#define MACPANID1_MSB 0x14 +#define MACSHORTADDRS1_LSB 0x15 +#define MACSHORTADDRS1_MSB 0x16 +#define MACLONGADDRS1_0 0x17 +#define MACLONGADDRS1_8 0x18 +#define MACLONGADDRS1_16 0x19 +#define MACLONGADDRS1_24 0x1A +#define MACLONGADDRS1_32 0x1B +#define MACLONGADDRS1_40 0x1C +#define MACLONGADDRS1_48 0x1D +#define MACLONGADDRS1_56 0x1E +#define DUAL_PAN_CTRL 0x1F +#define DUAL_PAN_DWELL 0x20 +#define DUAL_PAN_STS 0x21 +#define CCA1_THRESH 0x22 +#define CCA1_ED_OFFSET_COMP 0x23 +#define LQI_OFFSET_COMP 0x24 +#define CCA_CTRL 0x25 +#define CCA2_CORR_PEAKS 0x26 +#define CCA2_CORR_THRESH 0x27 +#define TMR_PRESCALE 0x28 +//---------------- 0x29 +#define GPIO_DATA 0x2A +#define GPIO_DIR 0x2B +#define GPIO_PUL_EN 0x2C +#define GPIO_PUL_SEL 0x2D +#define GPIO_DS 0x2E +//-------------- 0x2F +#define ANT_PAD_CTRL 0x30 +#define MISC_PAD_CTRL 0x31 +#define BSM_CTRL 0x32 +//--------------- 0x33 +#define _RNG 0x34 +#define RX_BYTE_COUNT 0x35 +#define RX_WTR_MARK 0x36 +#define SOFT_RESET 0x37 +#define TXDELAY 0x38 +#define ACKDELAY 0x39 +#define SEQ_MGR_CTRL 0x3A +#define SEQ_MGR_STS 0x3B +#define SEQ_T_STS 0x3C +#define ABORT_STS 0x3D +#define CCCA_BUSY_CNT 0x3E +#define SRC_ADDR_CHECKSUM1 0x3F +#define SRC_ADDR_CHECKSUM2 0x40 +#define SRC_TBL_VALID1 0x41 +#define SRC_TBL_VALID2 0x42 +#define FILTERFAIL_CODE1 0x43 +#define FILTERFAIL_CODE2 0x44 +#define SLOT_PRELOAD 0x45 +//---------------- 0x46 +#define CORR_VT 0x47 +#define SYNC_CTRL 0x48 +#define PN_LSB_0 0x49 +#define PN_LSB_1 0x4A +#define PN_MSB_0 0x4B +#define PN_MSB_1 0x4C +#define CORR_NVAL 0x4D +#define TX_MODE_CTRL 0x4E +#define SNF_THR 0x4F +#define FAD_THR 0x50 +#define ANT_AGC_CTRL 0x51 +#define AGC_THR1 0x52 +#define AGC_THR2 0x53 +#define AGC_HYS 0x54 +#define AFC 0x55 +//--------------- 0x56 +//--------------- 0x57 +#define PHY_STS 0x58 +#define RX_MAX_CORR 0x59 +#define RX_MAX_PREAMBLE 0x5A +#define RSSI 0x5B +//--------------- 0x5C +//--------------- 0x5D +#define PLL_DIG_CTRL 0x5E +#define VCO_CAL 0x5F +#define VCO_BEST_DIFF 0x60 +#define VCO_BIAS 0x61 +#define KMOD_CTRL 0x62 +#define KMOD_CAL 0x63 +#define PA_CAL 0x64 +#define PA_PWRCAL 0x65 +#define ATT_RSSI1 0x66 +#define ATT_RSSI2 0x67 +#define RSSI_OFFSET 0x68 +#define RSSI_SLOPE 0x69 +#define RSSI_CAL1 0x6A +#define RSSI_CAL2 0x6B +//--------------- 0x6C +//--------------- 0x6D +#define XTAL_CTRL 0x6E +#define XTAL_COMP_MIN 0x6F +#define XTAL_COMP_MAX 0x70 +#define XTAL_GM 0x71 +//--------------- 0x72 +//--------------- 0x73 +#define LNA_TUNE 0x74 +#define LNA_AGCGAIN 0x75 +//--------------- 0x76 +//--------------- 0x77 +#define CHF_PMA_GAIN 0x78 +#define CHF_IBUF 0x79 +#define CHF_QBUF 0x7A +#define CHF_IRIN 0x7B +#define CHF_QRIN 0x7C +#define CHF_IL 0x7D +#define CHF_QL 0x7E +#define CHF_CC1 0x7F +#define CHF_CCL 0x80 +#define CHF_CC2 0x81 +#define CHF_IROUT 0x82 +#define CHF_QROUT 0x83 +//--------------- 0x84 +//--------------- 0x85 +#define RSSI_CTRL 0x86 +//--------------- 0x87 +//--------------- 0x88 +#define PA_BIAS 0x89 +#define PA_TUNING 0x8A +//--------------- 0x8B +//--------------- 0x8C +#define PMC_HP_TRIM 0x8D +#define VREGA_TRIM 0x8E +//--------------- 0x8F +//--------------- 0x90 +#define VCO_CTRL1 0x91 +#define VCO_CTRL2 0x92 +//--------------- 0x93 +//--------------- 0x94 +#define ANA_SPARE_OUT1 0x95 +#define ANA_SPARE_OUT2 0x96 +#define ANA_SPARE_IN 0x97 +#define MISCELLANEOUS 0x98 +//--------------- 0x99 +#define SEQ_MGR_OVRD0 0x9A +#define SEQ_MGR_OVRD1 0x9B +#define SEQ_MGR_OVRD2 0x9C +#define SEQ_MGR_OVRD3 0x9D +#define SEQ_MGR_OVRD4 0x9E +#define SEQ_MGR_OVRD5 0x9F +#define SEQ_MGR_OVRD6 0xA0 +#define SEQ_MGR_OVRD7 0xA1 +//--------------- 0xA2 +#define TESTMODE_CTRL 0xA3 +#define DTM_CTRL1 0xA4 +#define DTM_CTRL2 0xA5 +#define ATM_CTRL1 0xA6 +#define ATM_CTRL2 0xA7 +#define ATM_CTRL3 0xA8 +//--------------- 0xA9 +#define LIM_FE_TEST_CTRL 0xAA +#define CHF_TEST_CTRL 0xAB +#define VCO_TEST_CTRL 0xAC +#define PLL_TEST_CTRL 0xAD +#define PA_TEST_CTRL 0xAE +#define PMC_TEST_CTRL 0xAF +#define SCAN_DTM_PROTECT_1 0xFE +#define SCAN_DTM_PROTECT_0 0xFF + +// IRQSTS1 bits +#define cIRQSTS1_RX_FRM_PEND (1<<7) +#define cIRQSTS1_PLL_UNLOCK_IRQ (1<<6) +#define cIRQSTS1_FILTERFAIL_IRQ (1<<5) +#define cIRQSTS1_RXWTRMRKIRQ (1<<4) +#define cIRQSTS1_CCAIRQ (1<<3) +#define cIRQSTS1_RXIRQ (1<<2) +#define cIRQSTS1_TXIRQ (1<<1) +#define cIRQSTS1_SEQIRQ (1<<0) + +typedef union regIRQSTS1_tag{ + uint8_t byte; + struct{ + uint8_t SEQIRQ:1; + uint8_t TXIRQ:1; + uint8_t RXIRQ:1; + uint8_t CCAIRQ:1; + uint8_t RXWTRMRKIRQ:1; + uint8_t FILTERFAIL_IRQ:1; + uint8_t PLL_UNLOCK_IRQ:1; + uint8_t RX_FRM_PEND:1; + }bit; +} regIRQSTS1_t; + +// IRQSTS2 bits +#define cIRQSTS2_CRCVALID (1<<7) +#define cIRQSTS2_CCA (1<<6) +#define cIRQSTS2_SRCADDR (1<<5) +#define cIRQSTS2_PI (1<<4) +#define cIRQSTS2_TMRSTATUS (1<<3) +#define cIRQSTS2_ASM_IRQ (1<<2) +#define cIRQSTS2_PB_ERR_IRQ (1<<1) +#define cIRQSTS2_WAKE_IRQ (1<<0) + +typedef union regIRQSTS2_tag{ + uint8_t byte; + struct{ + uint8_t WAKE_IRQ:1; + uint8_t PB_ERR_IRQ:1; + uint8_t ASM_IRQ:1; + uint8_t TMRSTATUS:1; + uint8_t PI:1; + uint8_t SRCADDR:1; + uint8_t CCA:1; + uint8_t CRCVALID:1; + }bit; +} regIRQSTS2_t; + +// IRQSTS3 bits +#define cIRQSTS3_TMR4MSK (1<<7) +#define cIRQSTS3_TMR3MSK (1<<6) +#define cIRQSTS3_TMR2MSK (1<<5) +#define cIRQSTS3_TMR1MSK (1<<4) +#define cIRQSTS3_TMR4IRQ (1<<3) +#define cIRQSTS3_TMR3IRQ (1<<2) +#define cIRQSTS3_TMR2IRQ (1<<1) +#define cIRQSTS3_TMR1IRQ (1<<0) + +typedef union regIRQSTS3_tag{ + uint8_t byte; + struct{ + uint8_t TMR1IRQ:1; + uint8_t TMR2IRQ:1; + uint8_t TMR3IRQ:1; + uint8_t TMR4IRQ:1; + uint8_t TMR1MSK:1; + uint8_t TMR2MSK:1; + uint8_t TMR3MSK:1; + uint8_t TMR4MSK:1; + }bit; +} regIRQSTS3_t; + +// PHY_CTRL1 bits +#define cPHY_CTRL1_TMRTRIGEN (1<<7) +#define cPHY_CTRL1_SLOTTED (1<<6) +#define cPHY_CTRL1_CCABFRTX (1<<5) +#define cPHY_CTRL1_RXACKRQD (1<<4) +#define cPHY_CTRL1_AUTOACK (1<<3) +#define cPHY_CTRL1_XCVSEQ (7<<0) + +typedef union regPHY_CTRL1_tag{ + uint8_t byte; + struct{ + uint8_t XCVSEQ:3; + uint8_t AUTOACK:1; + uint8_t RXACKRQD:1; + uint8_t CCABFRTX:1; + uint8_t SLOTTED:1; + uint8_t TMRTRIGEN:1; + }bit; +} regPHY_CTRL1_t; + +// PHY_CTRL2 bits +#define cPHY_CTRL2_CRC_MSK (1<<7) +#define cPHY_CTRL2_PLL_UNLOCK_MSK (1<<6) +#define cPHY_CTRL2_FILTERFAIL_MSK (1<<5) +#define cPHY_CTRL2_RX_WMRK_MSK (1<<4) +#define cPHY_CTRL2_CCAMSK (1<<3) +#define cPHY_CTRL2_RXMSK (1<<2) +#define cPHY_CTRL2_TXMSK (1<<1) +#define cPHY_CTRL2_SEQMSK (1<<0) + +typedef union regPHY_CTRL2_tag{ + uint8_t byte; + struct{ + uint8_t SEQMSK:1; + uint8_t TXMSK:1; + uint8_t RXMSK:1; + uint8_t CCAMSK:1; + uint8_t RX_WMRK_MSK:1; + uint8_t FILTERFAIL_MSK:1; + uint8_t PLL_UNLOCK_MSK:1; + uint8_t CRC_MSK:1; + }bit; +} regPHY_CTRL2_t; + +// PHY_CTRL3 bits +#define cPHY_CTRL3_TMR4CMP_EN (1<<7) +#define cPHY_CTRL3_TMR3CMP_EN (1<<6) +#define cPHY_CTRL3_TMR2CMP_EN (1<<5) +#define cPHY_CTRL3_TMR1CMP_EN (1<<4) +#define cPHY_CTRL3_ASM_MSK (1<<2) +#define cPHY_CTRL3_PB_ERR_MSK (1<<1) +#define cPHY_CTRL3_WAKE_MSK (1<<0) + +typedef union regPHY_CTRL3_tag{ + uint8_t byte; + struct{ + uint8_t WAKE_MSK:1; + uint8_t PB_ERR_MSK:1; + uint8_t ASM_MSK:1; + uint8_t RESERVED:1; + uint8_t TMR1CMP_EN:1; + uint8_t TMR2CMP_EN:1; + uint8_t TMR3CMP_EN:1; + uint8_t TMR4CMP_EN:1; + }bit; +} regPHY_CTRL3_t; + +// RX_FRM_LEN bits +#define cRX_FRAME_LENGTH (0x7F) + +// PHY_CTRL4 bits +#define cPHY_CTRL4_TRCV_MSK (1<<7) +#define cPHY_CTRL4_TC3TMOUT (1<<6) +#define cPHY_CTRL4_PANCORDNTR0 (1<<5) +#define cPHY_CTRL4_CCATYPE (3<<0) +#define cPHY_CTRL4_CCATYPE_Shift_c (3) +#define cPHY_CTRL4_TMRLOAD (1<<2) +#define cPHY_CTRL4_PROMISCUOUS (1<<1) +#define cPHY_CTRL4_TC2PRIME_EN (1<<0) + +typedef union regPHY_CTRL4_tag{ + uint8_t byte; + struct{ + uint8_t TC2PRIME_EN:1; + uint8_t PROMISCUOUS:1; + uint8_t TMRLOAD:1; + uint8_t CCATYPE:2; + uint8_t PANCORDNTR0:1; + uint8_t TC3TMOUT:1; + uint8_t TRCV_MSK:1; + }bit; +} regPHY_CTRL4_t; + +// SRC_CTRL bits +#define cSRC_CTRL_INDEX (0x0F) +#define cSRC_CTRL_INDEX_Shift_c (4) +#define cSRC_CTRL_ACK_FRM_PND (1<<3) +#define cSRC_CTRL_SRCADDR_EN (1<<2) +#define cSRC_CTRL_INDEX_EN (1<<1) +#define cSRC_CTRL_INDEX_DISABLE (1<<0) + +typedef union regSRC_CTRL_tag{ + uint8_t byte; + struct{ + uint8_t INDEX_DISABLE:1; + uint8_t INDEX_EN:1; + uint8_t SRCADDR_EN:1; + uint8_t ACK_FRM_PND:1; + uint8_t INDEX:4; + }bit; +} regSRC_CTRL_t; + +// ASM_CTRL1 bits +#define cASM_CTRL1_CLEAR (1<<7) +#define cASM_CTRL1_START (1<<6) +#define cASM_CTRL1_SELFTST (1<<5) +#define cASM_CTRL1_CTR (1<<4) +#define cASM_CTRL1_CBC (1<<3) +#define cASM_CTRL1_AES (1<<2) +#define cASM_CTRL1_LOAD_MAC (1<<1) + +// ASM_CTRL2 bits +#define cASM_CTRL2_DATA_REG_TYPE_SEL (7) +#define cASM_CTRL2_DATA_REG_TYPE_SEL_Shift_c (5) +#define cASM_CTRL2_TSTPAS (1<<1) + +// CLK_OUT_CTRL bits +#define cCLK_OUT_CTRL_EXTEND (1<<7) +#define cCLK_OUT_CTRL_HIZ (1<<6) +#define cCLK_OUT_CTRL_SR (1<<5) +#define cCLK_OUT_CTRL_DS (1<<4) +#define cCLK_OUT_CTRL_EN (1<<3) +#define cCLK_OUT_CTRL_DIV (7) + +// PWR_MODES bits +#define cPWR_MODES_XTAL_READY (1<<5) +#define cPWR_MODES_XTALEN (1<<4) +#define cPWR_MODES_ASM_CLK_EN (1<<3) +#define cPWR_MODES_AUTODOZE (1<<1) +#define cPWR_MODES_PMC_MODE (1<<0) + +// RX_FRAME_FILTER bits +#define cRX_FRAME_FLT_FRM_VER (0xC0) +#define cRX_FRAME_FLT_FRM_VER_Shift_c (6) +#define cRX_FRAME_FLT_ACTIVE_PROMISCUOUS (1<<5) +#define cRX_FRAME_FLT_NS_FT (1<<4) +#define cRX_FRAME_FLT_CMD_FT (1<<3) +#define cRX_FRAME_FLT_ACK_FT (1<<2) +#define cRX_FRAME_FLT_DATA_FT (1<<1) +#define cRX_FRAME_FLT_BEACON_FT (1<<0) + +typedef union regRX_FRAME_FILTER_tag{ + uint8_t byte; + struct{ + uint8_t FRAME_FLT_BEACON_FT:1; + uint8_t FRAME_FLT_DATA_FT:1; + uint8_t FRAME_FLT_ACK_FT:1; + uint8_t FRAME_FLT_CMD_FT:1; + uint8_t FRAME_FLT_NS_FT:1; + uint8_t FRAME_FLT_ACTIVE_PROMISCUOUS:1; + uint8_t FRAME_FLT_FRM_VER:2; + }bit; +} regRX_FRAME_FILTER_t; + +// DUAL_PAN_CTRL bits +#define cDUAL_PAN_CTRL_DUAL_PAN_SAM_LVL_MSK (0xF0) +#define cDUAL_PAN_CTRL_DUAL_PAN_SAM_LVL_Shift_c (4) +#define cDUAL_PAN_CTRL_CURRENT_NETWORK (1<<3) +#define cDUAL_PAN_CTRL_PANCORDNTR1 (1<<2) +#define cDUAL_PAN_CTRL_DUAL_PAN_AUTO (1<<1) +#define cDUAL_PAN_CTRL_ACTIVE_NETWORK (1<<0) + +// DUAL_PAN_STS bits +#define cDUAL_PAN_STS_RECD_ON_PAN1 (1<<7) +#define cDUAL_PAN_STS_RECD_ON_PAN0 (1<<6) +#define cDUAL_PAN_STS_DUAL_PAN_REMAIN (0x3F) + +// CCA_CTRL bits +#define cCCA_CTRL_AGC_FRZ_EN (1<<6) +#define cCCA_CTRL_CONT_RSSI_EN (1<<5) +#define cCCA_CTRL_LQI_RSSI_NOT_CORR (1<<4) +#define cCCA_CTRL_CCA3_AND_NOT_OR (1<<3) +#define cCCA_CTRL_POWER_COMP_EN_LQI (1<<2) +#define cCCA_CTRL_POWER_COMP_EN_ED (1<<1) +#define cCCA_CTRL_POWER_COMP_EN_CCA1 (1<<0) + +// GPIO_DATA bits +#define cGPIO_DATA_7 (1<<7) +#define cGPIO_DATA_6 (1<<6) +#define cGPIO_DATA_5 (1<<5) +#define cGPIO_DATA_4 (1<<4) +#define cGPIO_DATA_3 (1<<3) +#define cGPIO_DATA_2 (1<<2) +#define cGPIO_DATA_1 (1<<1) +#define cGPIO_DATA_0 (1<<0) + +// GPIO_DIR bits +#define cGPIO_DIR_7 (1<<7) +#define cGPIO_DIR_6 (1<<6) +#define cGPIO_DIR_5 (1<<5) +#define cGPIO_DIR_4 (1<<4) +#define cGPIO_DIR_3 (1<<3) +#define cGPIO_DIR_2 (1<<2) +#define cGPIO_DIR_1 (1<<1) +#define cGPIO_DIR_0 (1<<0) + +// GPIO_PUL_EN bits +#define cGPIO_PUL_EN_7 (1<<7) +#define cGPIO_PUL_EN_6 (1<<6) +#define cGPIO_PUL_EN_5 (1<<5) +#define cGPIO_PUL_EN_4 (1<<4) +#define cGPIO_PUL_EN_3 (1<<3) +#define cGPIO_PUL_EN_2 (1<<2) +#define cGPIO_PUL_EN_1 (1<<1) +#define cGPIO_PUL_EN_0 (1<<0) + +// GPIO_PUL_SEL bits +#define cGPIO_PUL_SEL_7 (1<<7) +#define cGPIO_PUL_SEL_6 (1<<6) +#define cGPIO_PUL_SEL_5 (1<<5) +#define cGPIO_PUL_SEL_4 (1<<4) +#define cGPIO_PUL_SEL_3 (1<<3) +#define cGPIO_PUL_SEL_2 (1<<2) +#define cGPIO_PUL_SEL_1 (1<<1) +#define cGPIO_PUL_SEL_0 (1<<0) + +// GPIO_DS bits +#define cGPIO_DS_7 (1<<7) +#define cGPIO_DS_6 (1<<6) +#define cGPIO_DS_5 (1<<5) +#define cGPIO_DS_4 (1<<4) +#define cGPIO_DS_3 (1<<3) +#define cGPIO_DS_2 (1<<2) +#define cGPIO_DS_1 (1<<1) +#define cGPIO_DS_0 (1<<0) + +// SPI_CTRL bits +//#define cSPI_CTRL_MISO_HIZ_EN (1<<1) +//#define cSPI_CTRL_PB_PROTECT (1<<0) + +// ANT_PAD_CTRL bits +#define cANT_PAD_CTRL_ANTX_POL (0x0F) +#define cANT_PAD_CTRL_ANTX_POL_Shift_c (4) +#define cANT_PAD_CTRL_ANTX_CTRLMODE (1<<3) +#define cANT_PAD_CTRL_ANTX_HZ (1<<2) +#define cANT_PAD_CTRL_ANTX_EN (3) + +// MISC_PAD_CTRL bits +#define cMISC_PAD_CTRL_MISO_HIZ_EN (1<<3) +#define cMISC_PAD_CTRL_IRQ_B_OD (1<<2) +#define cMISC_PAD_CTRL_NON_GPIO_DS (1<<1) +#define cMISC_PAD_CTRL_ANTX_CURR (1<<0) + +// ANT_AGC_CTRL bits +#define cANT_AGC_CTRL_FAD_EN_Shift_c (0) +#define cANT_AGC_CTRL_FAD_EN_Mask_c (1<<cANT_AGC_CTRL_FAD_EN_Shift_c) +#define cANT_AGC_CTRL_ANTX_Shift_c (1) +#define cANT_AGC_CTRL_ANTX_Mask_c (1<<cANT_AGC_CTRL_ANTX_Shift_c) + +// BSM_CTRL bits +#define cBSM_CTRL_BSM_EN (1<<0) + +// SOFT_RESET bits +#define cSOFT_RESET_SOG_RST (1<<7) +#define cSOFT_RESET_REGS_RST (1<<4) +#define cSOFT_RESET_PLL_RST (1<<3) +#define cSOFT_RESET_TX_RST (1<<2) +#define cSOFT_RESET_RX_RST (1<<1) +#define cSOFT_RESET_SEQ_MGR_RST (1<<0) + +// SEQ_MGR_CTRL bits +#define cSEQ_MGR_CTRL_SEQ_STATE_CTRL (3) +#define cSEQ_MGR_CTRL_SEQ_STATE_CTRL_Shift_c (6) +#define cSEQ_MGR_CTRL_NO_RX_RECYCLE (1<<5) +#define cSEQ_MGR_CTRL_LATCH_PREAMBLE (1<<4) +#define cSEQ_MGR_CTRL_EVENT_TMR_DO_NOT_LATCH (1<<3) +#define cSEQ_MGR_CTRL_CLR_NEW_SEQ_INHIBIT (1<<2) +#define cSEQ_MGR_CTRL_PSM_LOCK_DIS (1<<1) +#define cSEQ_MGR_CTRL_PLL_ABORT_OVRD (1<<0) + +// SEQ_MGR_STS bits +#define cSEQ_MGR_STS_TMR2_SEQ_TRIG_ARMED (1<<7) +#define cSEQ_MGR_STS_RX_MODE (1<<6) +#define cSEQ_MGR_STS_RX_TIMEOUT_PENDING (1<<5) +#define cSEQ_MGR_STS_NEW_SEQ_INHIBIT (1<<4) +#define cSEQ_MGR_STS_SEQ_IDLE (1<<3) +#define cSEQ_MGR_STS_XCVSEQ_ACTUAL (7) + +// ABORT_STS bits +#define cABORT_STS_PLL_ABORTED (1<<2) +#define cABORT_STS_TC3_ABORTED (1<<1) +#define cABORT_STS_SW_ABORTED (1<<0) + +// FILTERFAIL_CODE2 bits +#define cFILTERFAIL_CODE2_PAN_SEL (1<<7) +#define cFILTERFAIL_CODE2_9_8 (3) + +// PHY_STS bits +#define cPHY_STS_PLL_UNLOCK (1<<7) +#define cPHY_STS_PLL_LOCK_ERR (1<<6) +#define cPHY_STS_PLL_LOCK (1<<5) +#define cPHY_STS_CRCVALID (1<<3) +#define cPHY_STS_FILTERFAIL_FLAG_SEL (1<<2) +#define cPHY_STS_SFD_DET (1<<1) +#define cPHY_STS_PREAMBLE_DET (1<<0) + +// TESTMODE_CTRL bits +#define cTEST_MODE_CTRL_HOT_ANT (1<<4) +#define cTEST_MODE_CTRL_IDEAL_RSSI_EN (1<<3) +#define cTEST_MODE_CTRL_IDEAL_PFC_EN (1<<2) +#define cTEST_MODE_CTRL_CONTINUOUS_EN (1<<1) +#define cTEST_MODE_CTRL_FPGA_EN (1<<0) + +// DTM_CTRL1 bits +#define cDTM_CTRL1_ATM_LOCKED (1<<7) +#define cDTM_CTRL1_DTM_EN (1<<6) +#define cDTM_CTRL1_PAGE5 (1<<5) +#define cDTM_CTRL1_PAGE4 (1<<4) +#define cDTM_CTRL1_PAGE3 (1<<3) +#define cDTM_CTRL1_PAGE2 (1<<2) +#define cDTM_CTRL1_PAGE1 (1<<1) +#define cDTM_CTRL1_PAGE0 (1<<0) + +// TX_MODE_CTRL +#define cTX_MODE_CTRL_TX_INV (1<<4) +#define cTX_MODE_CTRL_BT_EN (1<<3) +#define cTX_MODE_CTRL_DTS2 (1<<2) +#define cTX_MODE_CTRL_DTS1 (1<<1) +#define cTX_MODE_CTRL_DTS0 (1<<0) + +#define cTX_MODE_CTRL_DTS_MASK (7) + +// CLK_OUT_CTRL bits +#define cCLK_OUT_EXTEND (1<<7) +#define cCLK_OUT_HIZ (1<<6) +#define cCLK_OUT_SR (1<<5) +#define cCLK_OUT_DS (1<<4) +#define cCLK_OUT_EN (1<<3) +#define cCLK_OUT_DIV_Mask (7<<0) + +#define gCLK_OUT_FREQ_32_MHz (0) +#define gCLK_OUT_FREQ_16_MHz (1) +#define gCLK_OUT_FREQ_8_MHz (2) +#define gCLK_OUT_FREQ_4_MHz (3) +#define gCLK_OUT_FREQ_1_MHz (4) +#define gCLK_OUT_FREQ_250_KHz (5) +#define gCLK_OUT_FREQ_62_5_KHz (6) +#define gCLK_OUT_FREQ_32_78_KHz (7) +#define gCLK_OUT_FREQ_DISABLE (8) + + + + +#endif /* __MCR20_REG_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/source/NanostackRfPhyMcr20a.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1782 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "NanostackRfPhyMcr20a.h" +#include "ns_types.h" +#include "platform/arm_hal_interrupt.h" +#include "nanostack/platform/arm_hal_phy.h" +#include "toolchain.h" +#include <string.h> + +/* Freescale headers which are for C files */ +extern "C" { +#include "MCR20Drv.h" +#include "MCR20Reg.h" +#include "MCR20Overwrites.h" +} + + +#define RF_BUFFER_SIZE 128 + +/*Radio RX and TX state definitions*/ +#define RFF_ON 0x01 +#define RFF_RX 0x02 +#define RFF_TX 0x04 +#define RFF_CCA 0x08 + +#define RF_MODE_NORMAL 0 +#define RF_MODE_SNIFFER 1 + +#define RF_CCA_THRESHOLD 75 /* -75 dBm */ + +#define RF_TX_POWER_MAX 0 + +/* PHY constants in symbols */ +#define gPhyWarmUpTime_c 9 +#define gPhySHRDuration_c 10 +#define gPhySymbolsPerOctet_c 2 +#define gPhyAckWaitDuration_c 54 + +#define gCcaED_c 0 +#define gCcaCCA_MODE1_c 1 + +#define gXcvrRunState_d gXcvrPwrAutodoze_c +#define gXcvrLowPowerState_d gXcvrPwrHibernate_c + + +/* MCR20A XCVR states */ +typedef enum xcvrState_tag{ + gIdle_c, + gRX_c, + gTX_c, + gCCA_c, + gTR_c, + gCCCA_c, +}xcvrState_t; + +/* MCR20A XCVR low power states */ +typedef enum xcvrPwrMode_tag{ + gXcvrPwrIdle_c, + gXcvrPwrAutodoze_c, + gXcvrPwrDoze_c, + gXcvrPwrHibernate_c +}xcvrPwrMode_t; + + +/*RF Part Type*/ +typedef enum +{ + FREESCALE_UNKNOW_DEV = 0, + FREESCALE_MCR20A +}rf_trx_part_e; + +/*Atmel RF states*/ +typedef enum +{ + NOP = 0x00, + BUSY_RX = 0x01, + RF_TX_START = 0x02, + FORCE_TRX_OFF = 0x03, + FORCE_PLL_ON = 0x04, + RX_ON = 0x06, + TRX_OFF = 0x08, + PLL_ON = 0x09, + BUSY_RX_AACK = 0x11, + SLEEP = 0x0F, + RX_AACK_ON = 0x16, + TX_ARET_ON = 0x19 +}rf_trx_states_t; + +/*RF receive buffer*/ +static uint8_t rf_buffer[RF_BUFFER_SIZE]; + +/* TX info */ +static uint8_t radio_tx_power = 0x17; /* 0 dBm */ +static uint8_t mac_tx_handle = 0; +static uint8_t need_ack = 0; +static uint16_t tx_len = 0; + +/* RF driver data */ +static xcvrState_t mPhySeqState; +static xcvrPwrMode_t mPwrState; +static phy_device_driver_s device_driver; +static uint8_t mStatusAndControlRegs[8]; +static uint8_t rf_rnd = 0; +static int8_t rf_radio_driver_id = -1; +static uint8_t MAC_address[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + +/* Driver instance handle and hardware */ +static NanostackRfPhyMcr20a *rf = NULL; +static SPI *spi = NULL; +static DigitalOut *cs = NULL; +static DigitalOut *rst = NULL; +static InterruptIn *irq = NULL; +static DigitalIn *irq_pin = NULL; + +/* Channel info */ /* 2405 2410 2415 2420 2425 2430 2435 2440 2445 2450 2455 2460 2465 2470 2475 2480 */ +static const uint8_t pll_int[16] = {0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D}; +static const uint16_t pll_frac[16] = {0x2800, 0x5000, 0x7800, 0xA000, 0xC800, 0xF000, 0x1800, 0x4000, 0x6800, 0x9000, 0xB800, 0xE000, 0x0800, 0x3000, 0x5800, 0x8000}; +static uint8_t rf_phy_channel = 0; + +/* Channel configurations for 2.4 */ +static const phy_rf_channel_configuration_s phy_24ghz = {2405000000U, 5000000U, 250000U, 16U, M_OQPSK}; + +static const phy_device_channel_page_s phy_channel_pages[] = { + { CHANNEL_PAGE_0, &phy_24ghz}, + { CHANNEL_PAGE_0, NULL} +}; + + +static rf_trx_part_e rf_radio_type_read(void); + +MBED_UNUSED static void rf_ack_wait_timer_start(uint16_t slots); +MBED_UNUSED static void rf_ack_wait_timer_stop(void); +MBED_UNUSED static void rf_handle_cca_ed_done(void); +MBED_UNUSED static void rf_handle_tx_end(void); +MBED_UNUSED static void rf_handle_rx_end(void); +MBED_UNUSED static void rf_on(void); +MBED_UNUSED static void rf_receive(void); +MBED_UNUSED static void rf_poll_trx_state_change(rf_trx_states_t trx_state); +MBED_UNUSED static void rf_init(void); +MBED_UNUSED static void rf_set_mac_address(const uint8_t *ptr); +MBED_UNUSED static int8_t rf_device_register(void); +MBED_UNUSED static void rf_device_unregister(void); +MBED_UNUSED static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol ); +MBED_UNUSED static void rf_cca_abort(void); +MBED_UNUSED static void rf_read_mac_address(uint8_t *ptr); +MBED_UNUSED static int8_t rf_read_random(void); +MBED_UNUSED static void rf_calibration_cb(void); +MBED_UNUSED static void rf_init_phy_mode(void); +MBED_UNUSED static void rf_ack_wait_timer_interrupt(void); +MBED_UNUSED static void rf_calibration_timer_interrupt(void); +MBED_UNUSED static void rf_calibration_timer_start(uint32_t slots); +MBED_UNUSED static void rf_cca_timer_interrupt(void); +MBED_UNUSED static void rf_cca_timer_start(uint32_t slots); +MBED_UNUSED static uint16_t rf_get_phy_mtu_size(void); +MBED_UNUSED static uint8_t rf_scale_lqi(int8_t rssi); + +/** + * RF output power write + * + * \brief TX power has to be set before network start. + * + * \param power + * See datasheet for TX power settings + * + * \return 0, Supported Value + * \return -1, Not Supported Value + */ +MBED_UNUSED static int8_t rf_tx_power_set(uint8_t power); +MBED_UNUSED static uint8_t rf_tx_power_get(void); +MBED_UNUSED static int8_t rf_enable_antenna_diversity(void); + +/* Private functions */ +MBED_UNUSED static void rf_abort(void); +MBED_UNUSED static void rf_promiscuous(uint8_t mode); +MBED_UNUSED static void rf_get_timestamp(uint32_t *pRetClk); +MBED_UNUSED static void rf_set_timeout(uint32_t *pEndTime); +MBED_UNUSED static void rf_set_power_state(xcvrPwrMode_t newState); +MBED_UNUSED static uint8_t rf_if_read_rnd(void); +MBED_UNUSED static uint8_t rf_convert_LQI(uint8_t hwLqi); +MBED_UNUSED static uint8_t rf_get_channel_energy(void); +MBED_UNUSED static uint8_t rf_convert_energy_level(uint8_t energyLevel); +MBED_UNUSED static int8_t rf_convert_LQI_to_RSSI(uint8_t lqi); +MBED_UNUSED static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel); +MBED_UNUSED static int8_t rf_extension(phy_extension_type_e extension_type,uint8_t *data_ptr); +MBED_UNUSED static int8_t rf_address_write(phy_address_type_e address_type,uint8_t *address_ptr); +MBED_UNUSED static void rf_mac64_read(uint8_t *address); + + + +/* + * \brief Read connected radio part. + * + * This function only return valid information when rf_init() is called + * + * \return + */ +static rf_trx_part_e rf_radio_type_read(void) +{ + return FREESCALE_MCR20A; +} + +/* + * \brief Function initialises and registers the RF driver. + * + * \param none + * + * \return rf_radio_driver_id Driver ID given by NET library + */ +static int8_t rf_device_register(void) +{ + rf_trx_part_e radio_type; + + rf_init(); + + + + radio_type = rf_radio_type_read(); + if(radio_type == FREESCALE_MCR20A) + { + /*Set pointer to MAC address*/ + device_driver.PHY_MAC = MAC_address; + device_driver.driver_description = (char*)"FREESCALE_MAC"; + + //Create setup Used Radio chips + /*Type of RF PHY is SubGHz*/ + device_driver.link_type = PHY_LINK_15_4_2_4GHZ_TYPE; + + device_driver.phy_channel_pages = phy_channel_pages; + /*Maximum size of payload is 127*/ + device_driver.phy_MTU = 127; + /*No header in PHY*/ + device_driver.phy_header_length = 0; + /*No tail in PHY*/ + device_driver.phy_tail_length = 0; + /*Set address write function*/ + device_driver.address_write = &rf_address_write; + /*Set RF extension function*/ + device_driver.extension = &rf_extension; + /*Set RF state control function*/ + device_driver.state_control = &rf_interface_state_control; + /*Set transmit function*/ + device_driver.tx = &rf_start_cca; + /*Upper layer callbacks init to NULL*/ + device_driver.phy_rx_cb = NULL; + device_driver.phy_tx_done_cb = NULL; + /*Virtual upper data callback init to NULL*/ + device_driver.arm_net_virtual_rx_cb = NULL; + device_driver.arm_net_virtual_tx_cb = NULL; + + /*Register device driver*/ + rf_radio_driver_id = arm_net_phy_register(&device_driver); + } + + return rf_radio_driver_id; +} + +/* + * \brief Function unregisters the RF driver. + * + * \param none + * + * \return none + */ +static void rf_device_unregister(void) +{ + arm_net_phy_unregister(rf_radio_driver_id); +} + +/* + * \brief Function returns the generated 8-bit random value for seeding Pseudo-random generator. + * + * \param none + * + * \return random value + */ +static int8_t rf_read_random(void) +{ + return rf_rnd; +} + +/* + * \brief Function is a call back for ACK wait timeout. + * + * \param none + * + * \return none + */ +static void rf_ack_wait_timer_interrupt(void) +{ + /* The packet was transmitted successfully, but no ACK was received */ + if (device_driver.phy_tx_done_cb) { + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_SUCCESS, 1, 1); + } + rf_receive(); +} + +/* + * \brief Function is a call back for calibration interval timer. + * + * \param none + * + * \return none + */ +static void rf_calibration_timer_interrupt(void) +{ +} + +/* + * \brief Function is a call back for cca interval timer. + * + * \param none + * + * \return none + */ +static void rf_cca_timer_interrupt(void) +{ + /* CCA time-out handled by Hardware */ +} + + +/* + * \brief Function starts the ACK wait time-out. + * + * \param slots The ACK wait time-out in [symbols] + * + * \return none + */ +static void rf_ack_wait_timer_start(uint16_t time) +{ + uint32_t timeout; + + rf_get_timestamp(&timeout); + timeout += time; + rf_set_timeout(&timeout); +} + +/* + * \brief Function starts the calibration interval. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_calibration_timer_start(uint32_t slots) +{ + (void)slots; +} + +/* + * \brief Function starts the CCA timout. + * + * \param slots Given slots, resolution 50us + * + * \return none + */ +static void rf_cca_timer_start(uint32_t slots) +{ + (void)slots; +} + +/* + * \brief Function stops the ACK wait timeout. + * + * \param none + * + * \return none + */ +static void rf_ack_wait_timer_stop(void) +{ +} + +/* + * \brief Function reads the MAC address array. + * + * \param ptr Pointer to read array + * + * \return none + */ +static void rf_read_mac_address(uint8_t *ptr) +{ + memcpy(ptr, MAC_address, 8); +} + +/* + * \brief Function sets the MAC address array. + * + * \param ptr Pointer to given MAC address array + * + * \return none + */ +static void rf_set_mac_address(const uint8_t *ptr) +{ + memcpy(MAC_address, ptr, 8); +} + +static uint16_t rf_get_phy_mtu_size(void) +{ + return device_driver.phy_MTU; +} + +/* + * \brief Function writes 16-bit address in RF address filter. + * + * \param short_address Given short address + * + * \return none + */ +static void rf_set_short_adr(uint8_t * short_address) +{ + /* Write one register at a time to be accessible from hibernate mode */ + MCR20Drv_IndirectAccessSPIWrite(MACSHORTADDRS0_MSB, short_address[0]); + MCR20Drv_IndirectAccessSPIWrite(MACSHORTADDRS0_LSB, short_address[1]); +} + +/* + * \brief Function writes PAN Id in RF PAN Id filter. + * + * \param pan_id Given PAN Id + * + * \return none + */ +static void rf_set_pan_id(uint8_t *pan_id) +{ + /* Write one register at a time to be accessible from hibernate mode */ + MCR20Drv_IndirectAccessSPIWrite(MACPANID0_MSB, pan_id[0]); + MCR20Drv_IndirectAccessSPIWrite(MACPANID0_LSB, pan_id[1]); +} + +/* + * \brief Function writes 64-bit address in RF address filter. + * + * \param address Given 64-bit address + * + * \return none + */ +static void rf_set_address(uint8_t *address) +{ + /* Write one register at a time to be accessible from hibernate mode */ + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_0, address[7]); + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_8, address[6]); + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_16, address[5]); + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_24, address[4]); + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_32, address[3]); + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_40, address[2]); + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_48, address[1]); + MCR20Drv_IndirectAccessSPIWrite(MACLONGADDRS0_56, address[0]); +} + +/* + * \brief Function sets the RF channel. + * + * \param ch New channel + * + * \return none + */ +static void rf_channel_set(uint8_t channel) +{ + rf_phy_channel = channel; + MCR20Drv_DirectAccessSPIWrite(PLL_INT0, pll_int[channel - 11]); + MCR20Drv_DirectAccessSPIMultiByteWrite(PLL_FRAC0_LSB, (uint8_t *) &pll_frac[channel - 11], 2); +} + + +/* + * \brief Function initialises the radio driver and resets the radio. + * + * \param none + * + * \return none + */ +static void rf_init(void) +{ + uint32_t index; + mPhySeqState = gIdle_c; + mPwrState = gXcvrPwrIdle_c; + /*Reset RF module*/ + MCR20Drv_RESET(); + /* Initialize the transceiver SPI driver */ + MCR20Drv_Init(); + /* Disable Tristate on MISO for SPI reads */ + MCR20Drv_IndirectAccessSPIWrite(MISC_PAD_CTRL, 0x02); + /* Set XCVR clock output settings */ + MCR20Drv_Set_CLK_OUT_Freq(gMCR20_ClkOutFreq_d); + /* Set default XCVR power state */ + rf_set_power_state(gXcvrRunState_d); + + /* PHY_CTRL1 default HW settings + AUTOACK enabled */ + mStatusAndControlRegs[PHY_CTRL1] = cPHY_CTRL1_AUTOACK; + /* PHY_CTRL2 : mask all PP interrupts */ + mStatusAndControlRegs[PHY_CTRL2] = cPHY_CTRL2_CRC_MSK | \ + cPHY_CTRL2_PLL_UNLOCK_MSK | \ + /*cPHY_CTRL2_FILTERFAIL_MSK | */ \ + cPHY_CTRL2_RX_WMRK_MSK | \ + cPHY_CTRL2_CCAMSK | \ + cPHY_CTRL2_RXMSK | \ + cPHY_CTRL2_TXMSK | \ + cPHY_CTRL2_SEQMSK; + /* PHY_CTRL3 : enable timer 3 and disable remaining interrupts */ + mStatusAndControlRegs[PHY_CTRL3] = cPHY_CTRL3_ASM_MSK | \ + cPHY_CTRL3_PB_ERR_MSK | \ + cPHY_CTRL3_WAKE_MSK | \ + cPHY_CTRL3_TMR3CMP_EN; + /* PHY_CTRL4 unmask global TRX interrupts, enable 16 bit mode for TC2 - TC2 prime EN */ + mStatusAndControlRegs[PHY_CTRL4] = cPHY_CTRL4_TC2PRIME_EN | (gCcaCCA_MODE1_c << cPHY_CTRL4_CCATYPE_Shift_c); + /* Clear all PP IRQ bits to avoid unexpected interrupts immediately after initialization */ + mStatusAndControlRegs[IRQSTS1] = cIRQSTS1_PLL_UNLOCK_IRQ | \ + cIRQSTS1_FILTERFAIL_IRQ | \ + cIRQSTS1_RXWTRMRKIRQ | \ + cIRQSTS1_CCAIRQ | \ + cIRQSTS1_RXIRQ | \ + cIRQSTS1_TXIRQ | \ + cIRQSTS1_SEQIRQ; + + mStatusAndControlRegs[IRQSTS2] = cIRQSTS2_ASM_IRQ | cIRQSTS2_PB_ERR_IRQ | cIRQSTS2_WAKE_IRQ; + /* Mask and clear all TMR IRQs */ + mStatusAndControlRegs[IRQSTS3] = cIRQSTS3_TMR4MSK | cIRQSTS3_TMR3MSK | cIRQSTS3_TMR2MSK | cIRQSTS3_TMR1MSK | \ + cIRQSTS3_TMR4IRQ | cIRQSTS3_TMR3IRQ | cIRQSTS3_TMR2IRQ | cIRQSTS3_TMR1IRQ; + /* Write settings to XCVR */ + MCR20Drv_DirectAccessSPIMultiByteWrite(PHY_CTRL1, &mStatusAndControlRegs[PHY_CTRL1], 5); + /* Clear all interrupts */ + MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, &mStatusAndControlRegs[IRQSTS1], 3); + + /* RX_FRAME_FILTER. Accept FrameVersion 0 and 1 packets, reject all others */ + MCR20Drv_IndirectAccessSPIWrite(RX_FRAME_FILTER, (cRX_FRAME_FLT_FRM_VER | \ + cRX_FRAME_FLT_BEACON_FT | \ + cRX_FRAME_FLT_DATA_FT | \ + cRX_FRAME_FLT_CMD_FT )); + /* Direct register overwrites */ + for (index = 0; index < sizeof(overwrites_direct)/sizeof(overwrites_t); index++) + MCR20Drv_DirectAccessSPIWrite(overwrites_direct[index].address, overwrites_direct[index].data); + /* Indirect register overwrites */ + for (index = 0; index < sizeof(overwrites_indirect)/sizeof(overwrites_t); index++) + MCR20Drv_IndirectAccessSPIWrite(overwrites_indirect[index].address, overwrites_indirect[index].data); + + /* Set the CCA energy threshold value */ + MCR20Drv_IndirectAccessSPIWrite(CCA1_THRESH, RF_CCA_THRESHOLD); + /* Set prescaller to obtain 1 symbol (16us) timebase */ + MCR20Drv_IndirectAccessSPIWrite(TMR_PRESCALE, 0x05); + + MCR20Drv_IRQ_Enable(); + + /*Read random variable. This will be used when seeding pseudo-random generator*/ + rf_rnd = rf_if_read_rnd(); + /*Read eui64*/ + rf_mac64_read(MAC_address); + /*set default channel to 11*/ + rf_channel_set(11); + /*Start receiver*/ + rf_receive(); +} + +/** + * \brief Function gets called when MAC is setting radio off. + * + * \param none + * + * \return none + */ +static void rf_off(void) +{ + /* Abort any ongoing sequences */ + rf_abort(); + /* Set XCVR in a low power state */ + rf_set_power_state(gXcvrLowPowerState_d); +} + +/* + * \brief Function polls the RF state until it has changed to desired state. + * + * \param trx_state RF state + * + * \return none + */ +static void rf_poll_trx_state_change(rf_trx_states_t trx_state) +{ + (void)trx_state; +} + +/* + * \brief Function starts the CCA process before starting data transmission and copies the data to RF TX FIFO. + * + * \param data_ptr Pointer to TX data + * \param data_length Length of the TX data + * \param tx_handle Handle to transmission + * \return 0 Success + * \return -1 Busy + */ +static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol ) +{ + uint8_t ccaMode; + + /* Parameter validation */ + if( !data_ptr || (data_length > 125) || (PHY_LAYER_PAYLOAD != data_protocol) ) + { + return -1; + } + + if( mPhySeqState == gRX_c ) + { + uint8_t phyReg = MCR20Drv_DirectAccessSPIRead(SEQ_STATE) & 0x1F; + /* Check for an Rx in progress. */ + if((phyReg <= 0x06) || (phyReg == 0x15) || (phyReg == 0x16)) + { + if (device_driver.phy_tx_done_cb) { + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 1, 1); + } + return -1; + } + rf_abort(); + } + + /*Check if transmitter is busy*/ + if( mPhySeqState != gIdle_c ) + { + /*Return busy*/ + return -1; + } + + /*Store TX handle*/ + mac_tx_handle = tx_handle; + /*Check if transmitted data needs to be acked*/ + need_ack = (*data_ptr & 0x20) == 0x20; + + /* Set XCVR power state in run mode */ + rf_set_power_state(gXcvrRunState_d); + /* Load data into XCVR */ + tx_len = data_length + 2; + MCR20Drv_PB_SPIBurstWrite(data_ptr - 1, data_length + 1); + MCR20Drv_PB_SPIByteWrite(0,tx_len); + + /* Set CCA mode 1 */ + ccaMode = (mStatusAndControlRegs[PHY_CTRL4] >> cPHY_CTRL4_CCATYPE_Shift_c) & cPHY_CTRL4_CCATYPE; + if( ccaMode != gCcaCCA_MODE1_c ) + { + mStatusAndControlRegs[PHY_CTRL4] &= ~(cPHY_CTRL4_CCATYPE << cPHY_CTRL4_CCATYPE_Shift_c); + mStatusAndControlRegs[PHY_CTRL4] |= gCcaCCA_MODE1_c << cPHY_CTRL4_CCATYPE_Shift_c; + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL4, mStatusAndControlRegs[PHY_CTRL4]); + } + + /* Read XCVR registers */ + mStatusAndControlRegs[0] = MCR20Drv_DirectAccessSPIMultiByteRead(IRQSTS2, &mStatusAndControlRegs[1], 4); + mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ); + mStatusAndControlRegs[PHY_CTRL1] |= gCCA_c; + mPhySeqState = gCCA_c; + + /* Ensure that no spurious interrupts are raised */ + mStatusAndControlRegs[IRQSTS3] &= 0xF0; /* do not change other IRQ status */ + mStatusAndControlRegs[IRQSTS3] |= (cIRQSTS3_TMR3MSK | cIRQSTS3_TMR3IRQ); + MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, mStatusAndControlRegs, 3); + + /* Write XCVR settings */ + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]); + + /* Unmask SEQ interrupt */ + mStatusAndControlRegs[PHY_CTRL2] &= ~(cPHY_CTRL2_SEQMSK); + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL2, mStatusAndControlRegs[PHY_CTRL2]); + + /*Return success*/ + return 0; +} + +/* + * \brief Function aborts CCA process. + * + * \param none + * + * \return none + */ +static void rf_cca_abort(void) +{ + rf_abort(); +} + +/* + * \brief Function starts the transmission of the frame. Called from ISR context! + * + * \param none + * + * \return none + */ +static void rf_start_tx(void) +{ + /* Perform TxRxAck sequence if required by phyTxMode */ + if( need_ack ) + { + mStatusAndControlRegs[PHY_CTRL1] |= cPHY_CTRL1_RXACKRQD; + mPhySeqState = gTR_c; + } + else + { + mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_RXACKRQD); + mPhySeqState = gTX_c; + } + + mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ); + mStatusAndControlRegs[PHY_CTRL1] |= mPhySeqState; + + /* Unmask SEQ interrupt */ + mStatusAndControlRegs[PHY_CTRL2] &= ~(cPHY_CTRL2_SEQMSK); + + /* Start the sequence immediately */ + MCR20Drv_DirectAccessSPIMultiByteWrite(PHY_CTRL1, &mStatusAndControlRegs[PHY_CTRL1], 2); + + if( need_ack ) + { + rf_ack_wait_timer_start(gPhyWarmUpTime_c + gPhySHRDuration_c + tx_len * gPhySymbolsPerOctet_c + gPhyAckWaitDuration_c); + } +} + +/* + * \brief Function sets the RF in RX state. Called from ISR context! + * + * \param none + * + * \return none + */ +static void rf_receive(void) +{ + uint8_t phyRegs[5]; + + /* RX can start only from Idle state */ + if( mPhySeqState != gIdle_c ) + { + return; + } + + /* Set XCVR power state in run mode */ + rf_set_power_state(gXcvrRunState_d); + /* read XVCR settings */ + phyRegs[IRQSTS1] = MCR20Drv_DirectAccessSPIMultiByteRead(IRQSTS2, &phyRegs[IRQSTS2], 4); + /* unmask SEQ interrupt */ + phyRegs[PHY_CTRL2] &= ~(cPHY_CTRL2_SEQMSK); + /* set XcvrSeq to RX */ + phyRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ); + phyRegs[PHY_CTRL1] |= gRX_c; + mPhySeqState = gRX_c; + /* Ensure that no spurious interrupts are raised */ + phyRegs[IRQSTS3] &= 0xF0; /* do not change other IRQ status */ + phyRegs[IRQSTS3] |= cIRQSTS3_TMR3MSK | cIRQSTS3_TMR3IRQ; + /* sync settings with XCVR */ + MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, phyRegs, 5); +} + +/* + * \brief Function calibrates the radio. + * + * \param none + * + * \return none + */ +static void rf_calibration_cb(void) +{ +} + +/* + * \brief Function sets RF_ON flag when radio is powered. + * + * \param none + * + * \return none + */ +static void rf_on(void) +{ +} + +/* + * \brief Function is a call back for RX end interrupt. + * + * \param none + * + * \return none + */ +static void rf_handle_rx_end(void) +{ + uint8_t rf_lqi = MCR20Drv_DirectAccessSPIRead(LQI_VALUE); + int8_t rf_rssi = 0; + uint8_t len = mStatusAndControlRegs[RX_FRM_LEN] - 2; + + + /*Start receiver*/ + rf_receive(); + + /*Check the length is valid*/ + if(len > 1 && len < RF_BUFFER_SIZE) + { + rf_lqi = rf_convert_LQI(rf_lqi); + rf_rssi = rf_convert_LQI_to_RSSI(rf_lqi); + /*gcararu: Scale LQI using received RSSI, to match the LQI reported by the ATMEL radio */ + rf_lqi = rf_scale_lqi(rf_rssi); + + /*Read received packet*/ + MCR20Drv_PB_SPIBurstRead(rf_buffer, len); + if (device_driver.phy_rx_cb) { + device_driver.phy_rx_cb(rf_buffer, len, rf_lqi, rf_rssi, rf_radio_driver_id); + } + } +} + +/* + * \brief Function is called when MAC is shutting down the radio. + * + * \param none + * + * \return none + */ +static void rf_shutdown(void) +{ + /*Call RF OFF*/ + rf_off(); +} + +/* + * \brief Function is a call back for TX end interrupt. + * + * \param none + * + * \return none + */ +static void rf_handle_tx_end(void) +{ + uint8_t rx_frame_pending = mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_RX_FRM_PEND; + + /*Start receiver*/ + rf_receive(); + + if (!device_driver.phy_tx_done_cb) { + return; + } + + /*Call PHY TX Done API*/ + if( need_ack ) + { + if( rx_frame_pending ) + { + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_DONE_PENDING, 1, 1); + } + else + { + // arm_net_phy_tx_done(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_SUCCESS, 1, 1); + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_DONE, 1, 1); + } + } + else + { + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_TX_SUCCESS, 1, 1); + } +} + +/* + * \brief Function is a call back for CCA ED done interrupt. + * + * \param none + * + * \return none + */ +static void rf_handle_cca_ed_done(void) +{ + /*Check the result of CCA process*/ + if( !(mStatusAndControlRegs[IRQSTS2] & cIRQSTS2_CCA) ) + { + rf_start_tx(); + } + else if (device_driver.phy_tx_done_cb) + { + /*Send CCA fail notification*/ + device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 1, 1); + } +} + +/* + * \brief Function sets the TX power variable. + * + * \param power TX power setting + * + * \return 0 Success + * \return -1 Fail + */ +static int8_t rf_tx_power_set(uint8_t power) +{ + /* gcapraru: Map MCR20A Tx power levels over ATMEL values */ + static uint8_t pwrLevelMapping[16] = {25,25,25,24,24,24,23,23,22,22,21,20,19,18,17,14}; + + if( power > 15 ) + { + return -1; + } + + radio_tx_power = power; + MCR20Drv_DirectAccessSPIWrite(PA_PWR, pwrLevelMapping[power]); + return 0; +} + +/* + * \brief Function returns the TX power variable. + * + * \param none + * + * \return radio_tx_power TX power variable + */ +static uint8_t rf_tx_power_get(void) +{ + return radio_tx_power; +} + +/* + * \brief Function enables the usage of Antenna diversity. + * + * \param none + * + * \return 0 Success + */ +static int8_t rf_enable_antenna_diversity(void) +{ + uint8_t phyReg; + + phyReg = MCR20Drv_IndirectAccessSPIRead(ANT_AGC_CTRL); + phyReg |= cANT_AGC_CTRL_FAD_EN_Mask_c; + MCR20Drv_IndirectAccessSPIWrite(ANT_AGC_CTRL, phyReg); + + phyReg = MCR20Drv_IndirectAccessSPIRead(ANT_PAD_CTRL); + phyReg |= 0x02; + MCR20Drv_IndirectAccessSPIWrite(ANT_PAD_CTRL, phyReg); + + return 0; +} + +/* + * \brief Function gives the control of RF states to MAC. + * + * \param new_state RF state + * \param rf_channel RF channel + * + * \return 0 Success + */ +static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel) +{ + int8_t ret_val = 0; + switch (new_state) + { + /*Reset PHY driver and set to idle*/ + case PHY_INTERFACE_RESET: + break; + /*Disable PHY Interface driver*/ + case PHY_INTERFACE_DOWN: + rf_shutdown(); + break; + /*Enable PHY Interface driver*/ + case PHY_INTERFACE_UP: + rf_channel_set(rf_channel); + rf_receive(); + break; + /*Enable wireless interface ED scan mode*/ + case PHY_INTERFACE_RX_ENERGY_STATE: + rf_abort(); + rf_channel_set(rf_channel); + break; + case PHY_INTERFACE_SNIFFER_STATE: /**< Enable Sniffer state */ + rf_promiscuous(1); + rf_channel_set(rf_channel); + rf_receive(); + break; + } + return ret_val; +} + +/* + * \brief Function controls the ACK pending, channel setting and energy detection. + * + * \param extension_type Type of control + * \param data_ptr Data from NET library + * + * \return 0 Success + */ +static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_ptr) +{ + switch (extension_type) + { + /*Control MAC pending bit for Indirect data transmission*/ + case PHY_EXTENSION_CTRL_PENDING_BIT: + { + uint8_t reg = MCR20Drv_DirectAccessSPIRead(SRC_CTRL); + + if(*data_ptr) + { + reg |= cSRC_CTRL_ACK_FRM_PND; + } + else + { + reg &= ~cSRC_CTRL_ACK_FRM_PND; + } + + MCR20Drv_DirectAccessSPIWrite(SRC_CTRL, reg); + break; + + } + /*Return frame pending status*/ + case PHY_EXTENSION_READ_LAST_ACK_PENDING_STATUS: + *data_ptr = MCR20Drv_DirectAccessSPIRead(IRQSTS1 & cIRQSTS1_RX_FRM_PEND); + break; + /*Set channel*/ + case PHY_EXTENSION_SET_CHANNEL: + break; + /*Read energy on the channel*/ + case PHY_EXTENSION_READ_CHANNEL_ENERGY: + *data_ptr = rf_get_channel_energy(); + break; + /*Read status of the link*/ + case PHY_EXTENSION_READ_LINK_STATUS: + break; + case PHY_EXTENSION_CONVERT_SIGNAL_INFO: + break; + } + return 0; +} + +/* + * \brief Function sets the addresses to RF address filters. + * + * \param address_type Type of address + * \param address_ptr Pointer to given address + * + * \return 0 Success + */ +static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address_ptr) +{ + int8_t ret_val = 0; + switch (address_type) + { + /*Set 48-bit address*/ + case PHY_MAC_48BIT: + break; + /*Set 64-bit address*/ + case PHY_MAC_64BIT: + rf_set_address(address_ptr); + break; + /*Set 16-bit address*/ + case PHY_MAC_16BIT: + rf_set_short_adr(address_ptr); + break; + /*Set PAN Id*/ + case PHY_MAC_PANID: + rf_set_pan_id(address_ptr); + break; + } + return ret_val; +} + +static void rf_mac64_read(uint8_t *address) +{ + /* Write one register at a time to be accessible from hibernate mode */ + address[7] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_0); + address[6] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_8); + address[5] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_16); + address[4] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_24); + address[3] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_32); + address[2] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_40); + address[1] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_48); + address[0] = MCR20Drv_DirectAccessSPIRead(MACLONGADDRS0_56); + +} + +/* + * \brief Function initialises the ACK wait time and returns the used PHY mode. + * + * \param none + * + * \return tmp Used PHY mode + */ +static void rf_init_phy_mode(void) +{ +} + +/* + * \brief Function is a RF interrupt vector. End of frame in RX and TX are handled here as well as CCA process interrupt. + * + * \param none + * + * \return none + */ +static void PHY_InterruptHandler(void) +{ + uint8_t xcvseqCopy; + + /* Disable and clear transceiver(IRQ_B) interrupt */ + MCR20Drv_IRQ_Disable(); + //MCR20Drv_IRQ_Clear(); + + /* Read transceiver interrupt status and control registers */ + mStatusAndControlRegs[IRQSTS1] = + MCR20Drv_DirectAccessSPIMultiByteRead(IRQSTS2, &mStatusAndControlRegs[IRQSTS2], 7); + + xcvseqCopy = mStatusAndControlRegs[PHY_CTRL1] & cPHY_CTRL1_XCVSEQ; + + /* Flter Fail IRQ */ + if( (mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_FILTERFAIL_IRQ) && + !(mStatusAndControlRegs[PHY_CTRL2] & cPHY_CTRL2_FILTERFAIL_MSK) ) + { + if( xcvseqCopy == gRX_c ) + { + /* Abort current SEQ */ + mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ); + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]); + /* Wait for Sequence Idle */ + while ((MCR20Drv_DirectAccessSPIRead(SEQ_STATE) & 0x1F) != 0); + /* Clear IRQ flags: */ + MCR20Drv_DirectAccessSPIWrite(IRQSTS1, cIRQSTS1_SEQIRQ); + /* Restart Rx asap */ + mStatusAndControlRegs[PHY_CTRL1] |= gRX_c; + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]); + } + } + + /* TMR3 IRQ: ACK wait time-out */ + if( (mStatusAndControlRegs[IRQSTS3] & cIRQSTS3_TMR3IRQ) && + !(mStatusAndControlRegs[IRQSTS3] & cIRQSTS3_TMR3MSK) ) + { + /* Disable TMR3 IRQ */ + mStatusAndControlRegs[IRQSTS3] |= cIRQSTS3_TMR3MSK; + + if( xcvseqCopy == gTR_c ) + { + /* Set XCVR to Idle */ + mPhySeqState = gIdle_c; + mStatusAndControlRegs[PHY_CTRL1] &= ~( cPHY_CTRL1_XCVSEQ ); + /* Mask interrupts */ + mStatusAndControlRegs[PHY_CTRL2] |= cPHY_CTRL2_CCAMSK | cPHY_CTRL2_RXMSK | cPHY_CTRL2_TXMSK | cPHY_CTRL2_SEQMSK; + /* Sync settings with XCVR */ + MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, mStatusAndControlRegs, 5); + + rf_ack_wait_timer_interrupt(); + MCR20Drv_IRQ_Enable(); + return; + } + } + + /* Sequencer interrupt, the autosequence has completed */ + if( (mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_SEQIRQ) && + !(mStatusAndControlRegs[PHY_CTRL2] & cPHY_CTRL2_SEQMSK) ) + { + /* Set XCVR to Idle */ + mPhySeqState = gIdle_c; + mStatusAndControlRegs[PHY_CTRL1] &= ~( cPHY_CTRL1_XCVSEQ ); + /* Mask interrupts */ + mStatusAndControlRegs[PHY_CTRL2] |= cPHY_CTRL2_CCAMSK | cPHY_CTRL2_RXMSK | cPHY_CTRL2_TXMSK | cPHY_CTRL2_SEQMSK; + /* Sync settings with XCVR */ + MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, mStatusAndControlRegs, 5); + + /* PLL unlock, the autosequence has been aborted due to PLL unlock */ + if( mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_PLL_UNLOCK_IRQ ) + { + if(xcvseqCopy == gRX_c) + { + rf_receive(); + } + MCR20Drv_IRQ_Enable(); + return; + } + + switch(xcvseqCopy) + { + case gTX_c: + case gTR_c: + rf_handle_tx_end(); + break; + + case gRX_c: + rf_handle_rx_end(); + break; + + case gCCA_c: + rf_handle_cca_ed_done(); + break; + + default: + break; + } + + MCR20Drv_IRQ_Enable(); + return; + } + /* Other IRQ. Clear XCVR interrupt flags */ + MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, mStatusAndControlRegs, 3); + MCR20Drv_IRQ_Enable(); +} + +/* + * \brief Function forces the XCVR to Idle state. + * + * \param none + * + * \return none + */ +static void rf_abort(void) +{ + /* Mask XCVR irq */ + MCR20Drv_IRQ_Disable(); + + mPhySeqState = gIdle_c; + + mStatusAndControlRegs[IRQSTS1] = MCR20Drv_DirectAccessSPIMultiByteRead(IRQSTS2, &mStatusAndControlRegs[IRQSTS2], 5); + + /* Mask SEQ interrupt */ + mStatusAndControlRegs[PHY_CTRL2] |= cPHY_CTRL2_SEQMSK; + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL2, mStatusAndControlRegs[PHY_CTRL2]); + + if( (mStatusAndControlRegs[PHY_CTRL1] & cPHY_CTRL1_XCVSEQ) != gIdle_c ) + { + /* Abort current SEQ */ + mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ); + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]); + + /* Wait for Sequence Idle (if not already) */ + while ((MCR20Drv_DirectAccessSPIRead(SEQ_STATE) & 0x1F) != 0); + //while ( !(MCR20Drv_DirectAccessSPIRead(IRQSTS1) & cIRQSTS1_SEQIRQ)); + mStatusAndControlRegs[IRQSTS1] |= cIRQSTS1_SEQIRQ; + } + + /* Clear all PP IRQ bits to avoid unexpected interrupts and mask TMR3 interrupt. + Do not change TMR IRQ status. */ + mStatusAndControlRegs[IRQSTS3] &= 0xF0; + mStatusAndControlRegs[IRQSTS3] |= (cIRQSTS3_TMR3MSK | cIRQSTS3_TMR3IRQ); + MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, mStatusAndControlRegs, 3); + + /* Unmask XCVR irq */ + MCR20Drv_IRQ_Enable(); +} + +/* + * \brief Function reads a time-stamp value from XCVR [symbols] + * + * \param pEndTime pointer to location where time-stamp will be stored + * + * \return none + */ +static void rf_get_timestamp(uint32_t *pRetClk) +{ + if(NULL == pRetClk) + { + return; + } + + platform_enter_critical(); + + *pRetClk = 0; + MCR20Drv_DirectAccessSPIMultiByteRead(EVENT_TMR_LSB, (uint8_t *) pRetClk, 3); + + platform_exit_critical(); +} + +/* + * \brief Function set a time-out to an XCVR sequence. + * + * \param pEndTime pointer to the sequence time-out value [symbols] + * + * \return none + */ +static void rf_set_timeout(uint32_t *pEndTime) +{ + uint8_t phyReg; + + if(NULL == pEndTime) + { + return; + } + + platform_enter_critical(); + + phyReg = MCR20Drv_DirectAccessSPIRead(IRQSTS3); + phyReg &= 0xF0; /* do not change IRQ status */ + phyReg |= (cIRQSTS3_TMR3MSK); /* mask TMR3 interrupt */ + MCR20Drv_DirectAccessSPIWrite(IRQSTS3, phyReg); + + MCR20Drv_DirectAccessSPIMultiByteWrite(T3CMP_LSB, (uint8_t *) pEndTime, 3); + + phyReg &= ~(cIRQSTS3_TMR3MSK); /* unmask TMR3 interrupt */ + phyReg |= (cIRQSTS3_TMR3IRQ); /* aknowledge TMR3 IRQ */ + MCR20Drv_DirectAccessSPIWrite(IRQSTS3, phyReg); + + platform_exit_critical(); +} + +/* + * \brief Function reads a random number from RF. + * + * \param none + * + * \return 8-bit random number + */ +static uint8_t rf_if_read_rnd(void) +{ + uint8_t phyReg; + + MCR20Drv_IRQ_Disable(); + /* Check if XCVR is idle */ + phyReg = MCR20Drv_DirectAccessSPIRead(PHY_CTRL1); + + if( (phyReg & cPHY_CTRL1_XCVSEQ) == gIdle_c ) + { + /* Program a new sequence */ + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, phyReg | gCCA_c); + /* Wait for sequence to finish */ + while( !(MCR20Drv_DirectAccessSPIRead(IRQSTS1) & cIRQSTS1_SEQIRQ) ); + /* Clear interrupt flag */ + MCR20Drv_DirectAccessSPIWrite(IRQSTS1, cIRQSTS1_SEQIRQ); + } + + MCR20Drv_IRQ_Enable(); + + return MCR20Drv_IndirectAccessSPIRead(_RNG); +} + +/* + * \brief Function converts LQI into RSSI. + * + * \param LQI + * + * \return RSSI + */ +static int8_t rf_convert_LQI_to_RSSI(uint8_t lqi) +{ + int32_t rssi = (50*lqi - 16820) / 163; + return (int8_t)rssi; +} + +/* + * \brief Function scale the LQI value reported by RF into a 0-255 value. + * + * \param hwLqi - the LQI value reported by RF + * + * \return scaled LQI + */ +static uint8_t rf_convert_LQI(uint8_t hwLqi) +{ + uint32_t tmpLQI; + + /* LQI Saturation Level */ + if (hwLqi >= 230) + { + return 0xFF; + } + else if (hwLqi <= 9) + { + return 0; + } + else + { + /* Rescale the LQI values from min to saturation to the 0x00 - 0xFF range */ + /* The LQI value mst be multiplied by ~1.1087 */ + /* tmpLQI = hwLqi * 7123 ~= hwLqi * 65536 * 0.1087 = hwLqi * 2^16 * 0.1087*/ + tmpLQI = ((uint32_t)hwLqi * (uint32_t)7123 ); + /* tmpLQI = (tmpLQI / 2^16) + hwLqi */ + tmpLQI = (uint32_t)(tmpLQI >> 16) + (uint32_t)hwLqi; + + return (uint8_t)tmpLQI; + } +} + +/* + * \brief Function enables/disables Rx promiscuous mode. + * + * \param state of XCVR promiscuous mode + * + * \return none + */ +static void rf_promiscuous(uint8_t state) +{ + uint8_t rxFrameFltReg, phyCtrl4Reg; + + rxFrameFltReg = MCR20Drv_IndirectAccessSPIRead(RX_FRAME_FILTER); + phyCtrl4Reg = MCR20Drv_DirectAccessSPIRead(PHY_CTRL4); + + if( state ) + { + /* FRM_VER[1:0] = b00. 00: Any FrameVersion accepted (0,1,2 & 3) */ + /* All frame types accepted*/ + phyCtrl4Reg |= cPHY_CTRL4_PROMISCUOUS; + rxFrameFltReg &= ~(cRX_FRAME_FLT_FRM_VER); + rxFrameFltReg |= (cRX_FRAME_FLT_ACK_FT | cRX_FRAME_FLT_NS_FT); + } + else + { + phyCtrl4Reg &= ~cPHY_CTRL4_PROMISCUOUS; + /* FRM_VER[1:0] = b11. Accept FrameVersion 0 and 1 packets, reject all others */ + /* Beacon, Data and MAC command frame types accepted */ + rxFrameFltReg &= ~(cRX_FRAME_FLT_FRM_VER); + rxFrameFltReg |= (0x03 << cRX_FRAME_FLT_FRM_VER_Shift_c); + rxFrameFltReg &= ~(cRX_FRAME_FLT_ACK_FT | cRX_FRAME_FLT_NS_FT); + } + + MCR20Drv_IndirectAccessSPIWrite(RX_FRAME_FILTER, rxFrameFltReg); + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL4, phyCtrl4Reg); +} + +/* + * \brief Function used to switch XCVR power state. + * + * \param state The XCVR power mode + * + * \return none + */ +static void rf_set_power_state(xcvrPwrMode_t newState) +{ + uint8_t pwrMode; + uint8_t xtalState; + + if( mPwrState == newState ) + { + return; + } + + /* Read power settings from RF */ + pwrMode = MCR20Drv_DirectAccessSPIRead(PWR_MODES); + xtalState = pwrMode & cPWR_MODES_XTALEN; + + switch( newState ) + { + case gXcvrPwrIdle_c: + pwrMode &= ~(cPWR_MODES_AUTODOZE); + pwrMode |= (cPWR_MODES_XTALEN | cPWR_MODES_PMC_MODE); + break; + case gXcvrPwrAutodoze_c: + pwrMode |= (cPWR_MODES_XTALEN | cPWR_MODES_AUTODOZE | cPWR_MODES_PMC_MODE); + break; + case gXcvrPwrDoze_c: + pwrMode &= ~(cPWR_MODES_AUTODOZE | cPWR_MODES_PMC_MODE); + pwrMode |= cPWR_MODES_XTALEN; + break; + case gXcvrPwrHibernate_c: + pwrMode &= ~(cPWR_MODES_XTALEN | cPWR_MODES_AUTODOZE | cPWR_MODES_PMC_MODE); + break; + default: + return; + } + + mPwrState = newState; + MCR20Drv_DirectAccessSPIWrite(PWR_MODES, pwrMode); + + if( !xtalState && (pwrMode & cPWR_MODES_XTALEN)) + { + /* wait for crystal oscillator to complet its warmup */ + while( ( MCR20Drv_DirectAccessSPIRead(PWR_MODES) & cPWR_MODES_XTAL_READY ) != cPWR_MODES_XTAL_READY); + /* wait for radio wakeup from hibernate interrupt */ + while( ( MCR20Drv_DirectAccessSPIRead(IRQSTS2) & (cIRQSTS2_WAKE_IRQ | cIRQSTS2_TMRSTATUS) ) != (cIRQSTS2_WAKE_IRQ | cIRQSTS2_TMRSTATUS) ); + + MCR20Drv_DirectAccessSPIWrite(IRQSTS2, cIRQSTS2_WAKE_IRQ); + } +} + +/* + * \brief Function reads the energy level on the preselected channel. + * + * \return energy level + */ +static uint8_t rf_get_channel_energy(void) +{ + uint8_t ccaMode; + + MCR20Drv_IRQ_Disable(); + /* RX can start only from Idle state */ + if( mPhySeqState != gIdle_c ) + { + MCR20Drv_IRQ_Enable(); + return 0; + } + + /* Set XCVR power state in run mode */ + rf_set_power_state(gXcvrRunState_d); + + /* Switch to ED mode */ + ccaMode = (mStatusAndControlRegs[PHY_CTRL4] >> cPHY_CTRL4_CCATYPE_Shift_c) & cPHY_CTRL4_CCATYPE; + if( ccaMode != gCcaED_c ) + { + mStatusAndControlRegs[PHY_CTRL4] &= ~(cPHY_CTRL4_CCATYPE << cPHY_CTRL4_CCATYPE_Shift_c); + mStatusAndControlRegs[PHY_CTRL4] |= gCcaED_c << cPHY_CTRL4_CCATYPE_Shift_c; + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL4, mStatusAndControlRegs[PHY_CTRL4]); + } + + /* Start ED sequence */ + mStatusAndControlRegs[PHY_CTRL1] |= gCCA_c; + MCR20Drv_DirectAccessSPIWrite(IRQSTS1, cIRQSTS1_CCAIRQ | cIRQSTS1_SEQIRQ); + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]); + /* Wait for sequence to finish */ + while ( !(MCR20Drv_DirectAccessSPIRead(IRQSTS1) & cIRQSTS1_SEQIRQ)); + /* Set XCVR to Idle */ + mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ); + MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]); + MCR20Drv_DirectAccessSPIWrite(IRQSTS1, cIRQSTS1_CCAIRQ | cIRQSTS1_SEQIRQ); + + MCR20Drv_IRQ_Enable(); + + return rf_convert_energy_level(MCR20Drv_DirectAccessSPIRead(CCA1_ED_FNL)); +} + +/* + * \brief Function converts the energy level from dBm to a 0-255 value. + * + * \param energyLevel in dBm + * + * \return energy level (0-255) + */ +static uint8_t rf_convert_energy_level(uint8_t energyLevel) +{ + if(energyLevel >= 90) + { + /* ED value is below minimum. Return 0x00. */ + energyLevel = 0x00; + } + else if(energyLevel <= 26) + { + /* ED value is above maximum. Return 0xFF. */ + energyLevel = 0xFF; + } + else + { + /* Energy level (-90 dBm to -26 dBm ) --> varies form 0 to 64 */ + energyLevel = (90 - energyLevel); + /* Rescale the energy level values to the 0x00-0xff range (0 to 64 translates in 0 to 255) */ + /* energyLevel * 3.9844 ~= 4 */ + /* Multiply with 4=2^2 by shifting left. + The multiplication will not overflow beacause energyLevel has values between 0 and 63 */ + energyLevel <<= 2; + } + + return energyLevel; +} + +static uint8_t rf_scale_lqi(int8_t rssi) +{ + uint8_t scaled_lqi; + /*Worst case sensitivity*/ + const int8_t rf_sensitivity = -98; + + /*rssi < RF sensitivity*/ + if(rssi < rf_sensitivity) + scaled_lqi=0; + /*-91 dBm < rssi < -81 dBm (AT86RF233 XPro)*/ + /*-90 dBm < rssi < -80 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 10)) + scaled_lqi=31; + /*-81 dBm < rssi < -71 dBm (AT86RF233 XPro)*/ + /*-80 dBm < rssi < -70 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 20)) + scaled_lqi=207; + /*-71 dBm < rssi < -61 dBm (AT86RF233 XPro)*/ + /*-70 dBm < rssi < -60 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 30)) + scaled_lqi=255; + /*-61 dBm < rssi < -51 dBm (AT86RF233 XPro)*/ + /*-60 dBm < rssi < -50 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 40)) + scaled_lqi=255; + /*-51 dBm < rssi < -41 dBm (AT86RF233 XPro)*/ + /*-50 dBm < rssi < -40 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 50)) + scaled_lqi=255; + /*-41 dBm < rssi < -31 dBm (AT86RF233 XPro)*/ + /*-40 dBm < rssi < -30 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 60)) + scaled_lqi=255; + /*-31 dBm < rssi < -21 dBm (AT86RF233 XPro)*/ + /*-30 dBm < rssi < -20 dBm (AT86RF212B XPro)*/ + else if(rssi < (rf_sensitivity + 70)) + scaled_lqi=255; + /*rssi > RF saturation*/ + else if(rssi > (rf_sensitivity + 80)) + scaled_lqi=111; + /*-21 dBm < rssi < -11 dBm (AT86RF233 XPro)*/ + /*-20 dBm < rssi < -10 dBm (AT86RF212B XPro)*/ + else + scaled_lqi=255; + + return scaled_lqi; +} + + +/*****************************************************************************/ +/* Layer porting to the Freescale driver */ +/*****************************************************************************/ +extern "C" void xcvr_spi_init(uint32_t instance) +{ + (void)instance; +} + +extern "C" void RF_IRQ_Init(void) { + MBED_ASSERT(irq != NULL); + irq->mode(PullUp); + irq->fall(&PHY_InterruptHandler); +} + +extern "C" void RF_IRQ_Enable(void) { + MBED_ASSERT(irq != NULL); + irq->enable_irq(); +} + +extern "C" void RF_IRQ_Disable(void) { + MBED_ASSERT(irq != NULL); + irq->disable_irq(); +} + +extern "C" uint8_t RF_isIRQ_Pending(void) { + MBED_ASSERT(rf != NULL); + return !irq_pin->read(); +} + +extern "C" void RF_RST_Set(int state) { + MBED_ASSERT(rst != NULL); + *rst = state; +} + +extern "C" void gXcvrAssertCS_d(void) +{ + MBED_ASSERT(cs != NULL); + *cs = 0; +} + +extern "C" void gXcvrDeassertCS_d(void) +{ + MBED_ASSERT(cs != NULL); + *cs = 1; +} + +extern "C" void xcvr_spi_configure_speed(uint32_t instance, uint32_t freq) +{ + MBED_ASSERT(spi != NULL); + (void)instance; + spi->frequency(freq); +} + +extern "C" void xcvr_spi_transfer(uint32_t instance, + uint8_t * sendBuffer, + uint8_t * receiveBuffer, + size_t transferByteCount) +{ + MBED_ASSERT(spi != NULL); + (void)instance; + volatile uint8_t dummy; + + if( !transferByteCount ) + return; + + if( !sendBuffer && !receiveBuffer ) + return; + + while( transferByteCount-- ) + { + if( sendBuffer ) + { + dummy = *sendBuffer; + sendBuffer++; + } + else + { + dummy = 0xFF; + } + + dummy = spi->write(dummy); + + if( receiveBuffer ) + { + *receiveBuffer = dummy; + receiveBuffer++; + } + } +} + +/*****************************************************************************/ +/*****************************************************************************/ + +static void rf_if_lock(void) +{ + platform_enter_critical(); +} + +static void rf_if_unlock(void) +{ + platform_exit_critical(); +} + +NanostackRfPhyMcr20a::NanostackRfPhyMcr20a(PinName spi_mosi, PinName spi_miso, + PinName spi_sclk, PinName spi_cs, PinName spi_rst, PinName spi_irq) + : _spi(spi_mosi, spi_miso, spi_sclk), _rf_cs(spi_cs), _rf_rst(spi_rst), + _rf_irq(spi_irq), _rf_irq_pin(spi_irq) +{ + // Do nothing +} + +NanostackRfPhyMcr20a::~NanostackRfPhyMcr20a() +{ + // Do nothing +} + +int8_t NanostackRfPhyMcr20a::rf_register() +{ + + rf_if_lock(); + + if (rf != NULL) { + rf_if_unlock(); + error("Multiple registrations of NanostackRfPhyMcr20a not supported"); + return -1; + } + + _pins_set(); + int8_t radio_id = rf_device_register(); + if (radio_id < 0) { + _pins_clear(); + rf = NULL; + } + + rf_if_unlock(); + return radio_id; +} + +void NanostackRfPhyMcr20a::rf_unregister() +{ + rf_if_lock(); + + if (rf != this) { + rf_if_unlock(); + return; + } + + rf_device_unregister(); + rf = NULL; + _pins_clear(); + + rf_if_unlock(); +} + +void NanostackRfPhyMcr20a::get_mac_address(uint8_t *mac) +{ + rf_if_lock(); + + memcpy((void*)mac, (void*)MAC_address, sizeof(MAC_address)); + + rf_if_unlock(); +} + +void NanostackRfPhyMcr20a::set_mac_address(uint8_t *mac) +{ + rf_if_lock(); + + if (NULL != rf) { + error("NanostackRfPhyAtmel cannot change mac address when running"); + rf_if_unlock(); + return; + } + memcpy((void*)MAC_address, (void*)mac, sizeof(MAC_address)); + + rf_if_unlock(); +} + +void NanostackRfPhyMcr20a::_pins_set() +{ + spi = &_spi; + cs = &_rf_cs; + rst = &_rf_rst; + irq = &_rf_irq; + irq_pin = &_rf_irq_pin; +} + +void NanostackRfPhyMcr20a::_pins_clear() +{ + spi = NULL; + cs = NULL; + rst = NULL; + irq = NULL; + irq_pin = NULL; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect/mcr20a-rf-driver/source/XcvrSpi.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/*! +* Copyright (c) 2015, Freescale Semiconductor, Inc. +* All rights reserved. +* +* \file XcvrSpi.h +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* o Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer. +* +* o 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. +* +* o Neither the name of Freescale Semiconductor, Inc. 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 HOLDER 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. +*/ + +#ifndef __XCVR_SPI_H__ +#define __XCVR_SPI_H__ + + +/***************************************************************************** + * INCLUDED HEADERS * + *---------------------------------------------------------------------------* + * Add to this section all the headers that this module needs to include. * + * Note that it is not a good practice to include header files into header * + * files, so use this section only if there is no other better solution. * + *---------------------------------------------------------------------------* + *****************************************************************************/ + + +/***************************************************************************** + * PUBLIC MACROS * + *---------------------------------------------------------------------------* + * Add to this section all the access macros, registers mappings, bit access * + * macros, masks, flags etc ... + *---------------------------------------------------------------------------* + *****************************************************************************/ +#define gXcvrSpiInstance_c 0 + +/***************************************************************************** + * PUBLIC FUNCTIONS * + *---------------------------------------------------------------------------* + * Add to this section all the global functions prototype preceded (as a * + * good practice) by the keyword 'extern' * + *---------------------------------------------------------------------------* + *****************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +void RF_RST_Set(int state); +void RF_CS_Set(int state); +void RF_IRQ_Init(void); +void RF_IRQ_Disable(void); +void RF_IRQ_Enable(void); +uint8_t RF_isIRQ_Pending(void); + +void gXcvrAssertCS_d(void); +void gXcvrDeassertCS_d(void); + +void xcvr_spi_init(uint32_t instance); +void xcvr_spi_configure_speed(uint32_t instance, uint32_t freq); +void xcvr_spi_transfer(uint32_t instance, + uint8_t * sendBuffer, + uint8_t * receiveBuffer, + uint32_t transferByteCount); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* __XCVR_SPI_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frdm_client.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,73 @@ +#include "frdm_client.hpp" + +#include "mbed-client/m2mdevice.h" +#include "security.h" + +M2MDevice* frdm_client::make_device() +{ + M2MDevice* device = M2MInterfaceFactory::create_device(); + if (!device) + return NULL; + + device->create_resource(M2MDevice::Manufacturer, "Freescale"); + device->create_resource(M2MDevice::DeviceType, "FRDM"); + device->create_resource(M2MDevice::ModelNumber, "K64F"); + + return device; +} + +frdm_client::frdm_client(const String& server_address, void* handler) +: m_address(server_address), m_state(state::initialized) +{ + String endpoint_type = ""; + String context_addr = ""; + + int32_t lifetime = 100; + uint16_t port = 0; + + m_interface = M2MInterfaceFactory::create_interface + ( + *this, + MBED_ENDPOINT_NAME, endpoint_type, + lifetime, + port, MBED_DOMAIN, socket_mode, stack_type, context_addr + ); + + if (!m_interface) + { + m_state = state::error; + return; + } + + m_security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); + if (!m_security) + { + m_state = state::error; + return; + } + + m_security->set_resource_value(M2MSecurity::M2MServerUri, m_address); + m_security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate); + m_security->set_resource_value(M2MSecurity::ServerPublicKey, SERVER_CERT, sizeof(SERVER_CERT)-1); + m_security->set_resource_value(M2MSecurity::PublicKey, CERT, sizeof(CERT)-1); + m_security->set_resource_value(M2MSecurity::Secretkey, KEY, sizeof(KEY)-1); + + m_interface->set_platform_network_handler(handler); +} + +frdm_client::~frdm_client() +{ + delete m_interface; + delete m_security; +} + +void frdm_client::connect(const M2MObjectList& objects) +{ + m_interface->register_object(m_security, objects); +} + +void frdm_client::disconnect() +{ + m_interface->unregister_object(NULL); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frdm_client.hpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,54 @@ +#pragma once + +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2minterface.h" + +class frdm_client : public M2MInterfaceObserver +{ +public: + struct state + { + enum + { + initialized, + boostrapped, + registered, + unregistered, + error + }; + }; + +public: + static M2MDevice* make_device(); + +public: + static const M2MInterface::NetworkStack stack_type = M2MInterface::LwIP_IPv4; + static const M2MInterface::BindingMode socket_mode = M2MInterface::TCP; + +public: + frdm_client(const String& server_address, void* handler = NULL); + ~frdm_client(); + +public: + void connect(const M2MObjectList& objects); + void disconnect(); + + virtual void bootstrap_done(M2MSecurity* security) { if (security) m_state = state::boostrapped; } + virtual void object_registered(M2MSecurity*, const M2MServer&) { m_state = state::registered; } + virtual void object_unregistered(M2MSecurity*) { m_state = state::unregistered; } + virtual void registration_updated(M2MSecurity*, const M2MServer&) {} + virtual void value_updated(M2MBase*, M2MBase::BaseType) {} + virtual void error(M2MInterface::Error error) { m_state = state::error; } + + int get_state() const { return m_state; } + M2MSecurity* get_security() const { return m_security; } + +private: + String m_address; + volatile int m_state; + + M2MInterface* m_interface; + M2MSecurity* m_security; +}; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,357 @@ +#include "mbed.h" +#include "utils.hpp" +#include "stdio.h" + +#include "EthernetInterface.h" +#include "frdm_client.hpp" + +#include "metronome.hpp" + + + +#define IOT_ENABLED + +namespace active_low +{ + const bool on = false; + const bool off = true; +} + +RawSerial pc(USBTX, USBRX); + +DigitalOut g_led_red(LED1); +DigitalOut g_led_green(LED2); +DigitalOut g_led_blue(LED3); + +InterruptIn g_button_mode(SW3); +InterruptIn g_button_tap(SW2); + +size_t prev_bpm =0,max_bpm=0, min_bpm=INT_MAX; +bool min_changed = 0, max_changed =0, bpm_changed =0; +uint8_t* buffIn = NULL; +uint32_t sizeIn; + +Semaphore updates(0); + +Ticker status_ticker; +void blinky(){ + + g_led_green = !g_led_green; + + } +metronome metronome_object; + + +void metronome::start_timing(){ + m_timing = true; + m_beat_count = 0; + m_timer.start(); + + } + +void metronome::stop_timing(){ + + m_timing = false; + m_timer.stop(); + size_t curr_bpm=0; + curr_bpm = metronome_object.get_bpm(); + pc.printf("BPM:- %d",curr_bpm); + bpm_changed = 1; + if(curr_bpm < min_bpm){ + min_bpm = curr_bpm; + min_changed =1; + } + if(curr_bpm > max_bpm){ + max_bpm = curr_bpm; + max_changed = 1; + } + if (curr_bpm == 0){ + g_led_green = active_low::off; + }else{ + //pc.printf("Blinky Call"); + size_t tempo = 60/curr_bpm; + status_ticker.attach(blinky,tempo); + } +} +void metronome::tap(){ + + m_beats[m_beat_count++] = m_timer.read_us(); + pc.printf("%d\n",m_timer.read_us()); + + +} +size_t metronome::get_bpm() const { + int i=0; + size_t bpm=0; + if(m_beat_count < 4){ + return prev_bpm; + }else{ + for(i=0;i<m_beat_count-1;i++){ + bpm = bpm + m_beats[i+1]-m_beats[i]; + } + bpm = (size_t) bpm/(m_beat_count-1); + prev_bpm = (bpm * 0.00006); + pc.printf("BPM Calc:- %d",prev_bpm); + return prev_bpm; + } +} + +void on_mode() +{ + + if(metronome_object.is_timing()){ + //Go to play mode + //printf("playmode"); + g_led_red = active_low::off; + g_led_green = active_low::on; + metronome_object.stop_timing(); + +}else{ + //Go to learn mode + // printf("learnmode"); + g_led_green = active_low::off; + g_led_red = active_low::on; + status_ticker.detach(); + metronome_object.start_timing(); + + } +} + +void on_tap() +{ + // Receive a tempo tap + if(metronome_object.is_timing()){ + metronome_object.tap(); + } +} + + +/*Frequency Class and related resources*/ +class FreqResource { +public: + FreqResource() { + +// M2MObject* freq_object; + freq_object = M2MInterfaceFactory::create_object("3318"); + M2MObjectInstance* freq_inst = freq_object->create_object_instance(); + + +// Why is it blinking only 4 time? - Ram + // there's not really an execute LWM2M ID that matches... hmm... + M2MResource* setValue_res = freq_inst->create_dynamic_resource("5900", "Set Value", + M2MResourceInstance::FLOAT, true); + // we allow executing a function here... + setValue_res->set_operation(M2MBase::GET_PUT_ALLOWED); + //setValue_res->set_value_updated_function(value_updated_callback2(this, &FreqResource::handle_put_bpm)); + setValue_res->set_execute_function(execute_callback(this, &FreqResource::handle_put_bpm)); + // Completion of execute function can take a time, that's why delayed response is used + setValue_res->set_delayed_response(true); + + //Max BPM + M2MResource* maxBPM_res = freq_inst->create_dynamic_resource("5602", "Max BPM", + M2MResourceInstance::FLOAT, true); + + // we allow executing a function here... + maxBPM_res->set_operation(M2MBase::GET_ALLOWED); + + // Completion of execute function can take a time, that's why delayed response is used + // maxBPM_res->set_delayed_response(true); + + //Min BPM + M2MResource* minBPM_res = freq_inst->create_dynamic_resource("5601", "Min BPM", + M2MResourceInstance::FLOAT, true); + // we allow executing a function here... + minBPM_res->set_operation(M2MBase::GET_ALLOWED); + + // Completion of execute function can take a time, that's why delayed response is used + //minBPM_res->set_delayed_response(true); + + //Reset Min/Max + M2MResource* resetBPM_res = freq_inst->create_dynamic_resource("5605", "Reset Min/Max BPM", + M2MResourceInstance::STRING, true); + // we allow executing a function here... + resetBPM_res->set_operation(M2MBase::POST_ALLOWED); + resetBPM_res->set_execute_function(execute_callback(this, &FreqResource::handle_reset_minMax_bpm)); + // Completion of execute function can take a time, that's why delayed response is used + resetBPM_res->set_delayed_response(true); + + //Units + M2MResource* unitsBPM_res = freq_inst->create_dynamic_resource("5701", "Units", + M2MResourceInstance::STRING, true); + // we allow executing a function here... + unitsBPM_res->set_operation(M2MBase::GET_ALLOWED); + // Completion of execute function can take a time, that's why delayed response is used + //unitsBPM_res->set_delayed_response(true); + unitsBPM_res->set_value((uint8_t*)"BPM",3); + } + + + ~FreqResource() { + + } + + void handle_put_bpm(void *argument){ + + status_ticker.detach(); + M2MObjectInstance* inst = freq_object->object_instance(); + M2MResource* setValue_res = inst->resource("5900"); + + // values in mbed Client are all buffers, and we need a vector of int's + setValue_res->get_value(buffIn, sizeIn); + + int temp=0; + for(int i=0;i<sizeIn;i++){ + temp=temp*10+(int)buffIn[i]-48; + } + prev_bpm=temp; + + if(prev_bpm < min_bpm) + { + min_bpm = prev_bpm; + min_changed =1; + } + if(prev_bpm > max_bpm) + { + max_bpm = prev_bpm; + max_changed = 1; + } + size_t tempo = 60/prev_bpm; + status_ticker.attach(blinky,tempo); + + bpm_changed = 1; + } + + void handle_set_bpm(){ + + M2MObjectInstance* inst = freq_object->object_instance(); + M2MResource* setValue_res = inst->resource("5900"); + + char buffer[20]; + int size = sprintf(buffer,"%d",prev_bpm); + setValue_res->set_value((uint8_t*)buffer, size); + + } + + void handle_set_min_bpm(){ + //Send a notification + M2MObjectInstance* inst = freq_object->object_instance(); + M2MResource* minBPM_res = inst->resource("5601"); + pc.printf("%d",min_bpm); + char buffer[20]; + int size = sprintf(buffer,"%d",min_bpm); + minBPM_res->set_value((uint8_t*)buffer, size); + + + } + void handle_set_max_bpm(){ + //Send a notification + M2MObjectInstance* inst = freq_object->object_instance(); + M2MResource* maxBPM_res = inst->resource("5602"); + + char buffer[20]; + int size = sprintf(buffer,"%d",max_bpm); + maxBPM_res->set_value((uint8_t*)buffer, size); + + + } + + void handle_reset_minMax_bpm(void *argument){ + //Handle request to reset the min_max values to zero and 1000000 each + + M2MObjectInstance* inst = freq_object->object_instance(); + M2MResource* minBPM_res = inst->resource("5601"); + M2MResource* maxBPM_res = inst->resource("5602"); + + minBPM_res->set_value(0); + maxBPM_res->set_value(0); + } + + M2MObject* get_object() { + return freq_object; + } + +private: + M2MObject* freq_object; +}; + +int main() +{ + // Seed the RNG for networking purposes + unsigned seed = utils::entropy_seed(); + srand(seed); + + // LEDs are active LOW - true/1 means off, false/0 means on + // Use the constants for easier reading + g_led_red = active_low::off; + g_led_green = active_low::off; + g_led_blue = active_low::off; + + + // Button falling edge is on push (rising is on release) + g_button_mode.fall(&on_mode); + g_button_tap.fall(&on_tap); + +#ifdef IOT_ENABLED + // Turn on the blue LED until connected to the network + // g_led_blue = active_low::off; + + + // Need to be connected with Ethernet cable for success + EthernetInterface ethernet; + if (ethernet.connect() != 0) + return 1; + + // Pair with the device connector + frdm_client client("coap://api.connector.mbed.com:5684", ðernet); + if (client.get_state() == frdm_client::state::error) + return 1; + + // The REST endpoints for this device + // Add your own M2MObjects to this list with push_back before client.connect() + M2MObjectList objects; + + //Frequency device definition and instance definition + FreqResource freq_resource; + + M2MDevice* device = frdm_client::make_device(); + objects.push_back(device); + objects.push_back(freq_resource.get_object()); + + // Publish the RESTful endpoints + client.connect(objects); + + // Connect complete; turn off blue LED forever + //g_led_blue = active_low::on; + +#endif + + while (true) + { + //updates.wait(25000); +#ifdef IOT_ENABLED + if (client.get_state() == frdm_client::state::error) + break; +#endif + + // Insert any code that must be run continuously here + if(bpm_changed){ + bpm_changed = 0; + freq_resource.handle_set_bpm(); + } + + if(min_changed) { + min_changed = 0; + freq_resource.handle_set_min_bpm(); + } + if(max_changed) { + max_changed = 0; + freq_resource.handle_set_max_bpm(); + } + + } + +#ifdef IOT_ENABLED + client.disconnect(); +#endif + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-client/#d41459d8b514d72d525e761fb4e34031e09f76e7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,110 @@ +2269b33a792389d2017e79b021517289b54d740e not-for-merge branch 'Black_Duck' of https://github.com/ARMmbed/mbed-client +4262f3f7025817b8297f183b8045a4d4e571bed0 not-for-merge branch 'Execute_operation' of https://github.com/ARMmbed/mbed-client +df97066d4bf1ed862f3c8851102aa4f6a562f973 not-for-merge branch 'Fix_deserializer' of https://github.com/ARMmbed/mbed-client +dc2d3d9269170e43f4374a69fb652d9f6604e3e7 not-for-merge branch 'Flag_MBED_CLIENT_SUPPORT_INTERFACE_DESCRIPTION_PTR' of https://github.com/ARMmbed/mbed-client +1f845a27ec6e6e6a03064d498ebf24b01cdc2156 not-for-merge branch 'IOTCLT-961' of https://github.com/ARMmbed/mbed-client +d24e70e8034ab90c0cd4ba343bbc3f1bc81b3b09 not-for-merge branch 'IOTSVS-683' of https://github.com/ARMmbed/mbed-client +e0623df87096c1ff3d6bb4f0724b482d0f4c2cc3 not-for-merge branch 'LinuxPort' of https://github.com/ARMmbed/mbed-client +2f92b42c05a82b765f71eeaa4bad221bf505b18f not-for-merge branch 'LinuxPort2' of https://github.com/ARMmbed/mbed-client +8b04e3c7c95e456861ab238d68a061589f8f1d22 not-for-merge branch 'TESTING-drop-bs-finish-ack' of https://github.com/ARMmbed/mbed-client +940339e3d1d0646c37b4ec413453b7f0177f06c8 not-for-merge branch 'TLV_binary_integer' of https://github.com/ARMmbed/mbed-client +d7056d55bfcdb28c575b1fb82e132ce0de756237 not-for-merge branch 'TLV_binary_integers_from_master' of https://github.com/ARMmbed/mbed-client +6de69813accef1f8ece1ae8f51fce3d4fd7cde39 not-for-merge branch 'TVL_deserializer_fix_offset' of https://github.com/ARMmbed/mbed-client +7b0b9db295d4dface6fb375eca895da467aff780 not-for-merge branch 'alpha2-release' of https://github.com/ARMmbed/mbed-client +fc80ee7d7c16cd6829ae26256296ce3083c6b602 not-for-merge branch 'anttiylitokola-patch-1' of https://github.com/ARMmbed/mbed-client +c0389db5f8123dbcc2a92e7f32fa0b027e38da13 not-for-merge branch 'api-enhancement' of https://github.com/ARMmbed/mbed-client +141edae8a22ba36ac9b5210250eccdbf7b1117a9 not-for-merge branch 'api_extension' of https://github.com/ARMmbed/mbed-client +1303a61b91709f3d8cf27eb98d4ad616ddc9a453 not-for-merge branch 'api_refactor' of https://github.com/ARMmbed/mbed-client +d49be9ca676b09058ba35394fd9a04d37b684317 not-for-merge branch 'base_memory_opt' of https://github.com/ARMmbed/mbed-client +41f8fc41816ffe09c4a1f43831f3cd357e4a0c38 not-for-merge branch 'blocks_to_flash' of https://github.com/ARMmbed/mbed-client +56d08cb8080b68610e5e7dac8a146a4080f31252 not-for-merge branch 'bootstrap' of https://github.com/ARMmbed/mbed-client +0b12158e1e53a141cc39e29adae5cce9b5c9ae91 not-for-merge branch 'bootstrap_fix' of https://github.com/ARMmbed/mbed-client +707bf8e0744aa596d896890e57b0c7bbdf90833d not-for-merge branch 'bootstrap_support' of https://github.com/ARMmbed/mbed-client +e33986707ddf6e2ac12dd4950c081fb8974ce942 not-for-merge branch 'build-ignore' of https://github.com/ARMmbed/mbed-client +99c2fd025825cc9cd441825f5e70b4a5ca17cfc9 not-for-merge branch 'build-warning' of https://github.com/ARMmbed/mbed-client +5e396e2cb29981456ae7e4d7a4bcc03d4b168714 not-for-merge branch 'callback_memory_optimizations' of https://github.com/ARMmbed/mbed-client +9424b064e9c629fff6ac99a6e57d1dc97be12508 not-for-merge branch 'classic_unit_test_fix' of https://github.com/ARMmbed/mbed-client +cdaa07d6fc6a416feb8b1b448c6d2bcc6c12433f not-for-merge branch 'cloud_rel1.2' of https://github.com/ARMmbed/mbed-client +2bbf9a858b0088cc3fbb8fe9b5e92c46202dca98 not-for-merge branch 'coap-option-tidy' of https://github.com/ARMmbed/mbed-client +481514bcc8582cebf605a85ea2b605782bd3bdba not-for-merge branch 'coap_separation' of https://github.com/ARMmbed/mbed-client +ea2ea45f20b97647df98aba9fc78b294c4bab05e not-for-merge branch 'compiler_warning_fixes' of https://github.com/ARMmbed/mbed-client +75bbebf4374f320f4c2246ffa526b2ca624a68d9 not-for-merge branch 'config-mechanism' of https://github.com/ARMmbed/mbed-client +94719c136eb34571129e7d5af3cb9163f6ea8d0d not-for-merge branch 'config-parameters' of https://github.com/ARMmbed/mbed-client +79fca5837b5bcd0e054ef4f3f2bdc762d69f08aa not-for-merge branch 'data_api_constifying' of https://github.com/ARMmbed/mbed-client +5eca39b9689636770c5702a5bca260c81af786e9 not-for-merge branch 'debugging' of https://github.com/ARMmbed/mbed-client +fe77efc2424911dd110aab5d9c9723ba35d7b324 not-for-merge branch 'device_object' of https://github.com/ARMmbed/mbed-client +3ae8e51a9751b71cfa96039ca387d8998fc2e374 not-for-merge branch 'doc-update-api' of https://github.com/ARMmbed/mbed-client +4ac8a398a0e69f2167d375cc72abab8a7fd13f5d not-for-merge branch 'dynamic_memory_options' of https://github.com/ARMmbed/mbed-client +d45cc02b51b28875f2d416e2af68585823c6ac35 not-for-merge branch 'error-description-api' of https://github.com/ARMmbed/mbed-client +b417281f224c2d648249dab73c036ccc9275a259 not-for-merge branch 'fix_unittests_ip6tos' of https://github.com/ARMmbed/mbed-client +4a222583c9ad3e68c421328bd20d1db2505a6b1d not-for-merge branch 'fixes_for_observation_cases' of https://github.com/ARMmbed/mbed-client +f49f8ce6055898084aa3fb36abc96d8bc7ced00d not-for-merge branch 'hide_string_setters' of https://github.com/ARMmbed/mbed-client +b274bb23b86c433ba0bebd1ff5fab95fd7b90abb not-for-merge branch 'iar_debug_hacks' of https://github.com/ARMmbed/mbed-client +f0706ffc64df7ec8e01e0437acc7a268bfa64bd7 not-for-merge branch 'ignore-duplicate' of https://github.com/ARMmbed/mbed-client +ac323a053046adce4f445b487a725309887a3009 not-for-merge branch 'init_path_member_by_real_data' of https://github.com/ARMmbed/mbed-client +5d2bb9674d800d2d1fd1fd1e83706b85ea246001 not-for-merge branch 'iotclt-1318' of https://github.com/ARMmbed/mbed-client +a3e218517381669dab3976507787d2b7e104b8f8 not-for-merge branch 'makefile_compilation' of https://github.com/ARMmbed/mbed-client +97e522ba470f5374f933d304fcb05386702c9fa0 not-for-merge branch 'master' of https://github.com/ARMmbed/mbed-client +ef569afbf3a77e44557ed82164ebd7cbe7ee340b not-for-merge branch 'mbed-client-mbed-tls-update' of https://github.com/ARMmbed/mbed-client +4e39566e3e1cf05cd36afe4266acae4bf018130b not-for-merge branch 'mbed-client_ram_opt' of https://github.com/ARMmbed/mbed-client +5d479fd3cde7f92ddf0b3fd8e0d3fbac2f7e6835 not-for-merge branch 'mbed-cloud-client-rel1.2' of https://github.com/ARMmbed/mbed-client +09d27d881b797d8299461bf11071feb2299e5768 not-for-merge branch 'mbed-cloud-client-rel1.2-int' of https://github.com/ARMmbed/mbed-client +85ef66c4282eef70fdfe1a4a7cd3dcd7291a2b01 not-for-merge branch 'mbed_os_5_4_rc' of https://github.com/ARMmbed/mbed-client +5f0a5b8005619f346c1ce45113b655ae687bfb75 not-for-merge branch 'mem_opt_phase_2' of https://github.com/ARMmbed/mbed-client +c9479fdd56ce4b0250cd33f492abf3436fc33fd0 not-for-merge branch 'mem_opt_phase_3' of https://github.com/ARMmbed/mbed-client +01190b59e18bbea165bcaa99f5ad93aeddd23d7f not-for-merge branch 'memopt_heap_allocated_connection_security' of https://github.com/ARMmbed/mbed-client +d2412b5dd77c8c67919f6da663f1059b70b13e35 not-for-merge branch 'memopt_heap_allocated_objects' of https://github.com/ARMmbed/mbed-client +f4c5076415155d0889412ea9c22327f102b74ef6 not-for-merge branch 'memory_optimizations' of https://github.com/ARMmbed/mbed-client +be64826994790723d27a35b5e5183450ef979534 not-for-merge branch 'memory_optimizations_base' of https://github.com/ARMmbed/mbed-client +f9e294d7f237045e06d2f684cf1473e733963c0e not-for-merge branch 'memory_savings' of https://github.com/ARMmbed/mbed-client +011b6aebcb4799f06e45859d4853f426eab9549b not-for-merge branch 'minor_fixes' of https://github.com/ARMmbed/mbed-client +a838866e20e15d2293a40e8a3a9c75e87981fd86 not-for-merge branch 'misc_refactoring' of https://github.com/ARMmbed/mbed-client +4c4f11287c2caa34185791231e5584836e835d35 not-for-merge branch 'more_coap_message_tracing' of https://github.com/ARMmbed/mbed-client +9586deb5c6cfbfc168f0d7abf917160b2b235069 not-for-merge branch 'nsdl-functions-mutexed' of https://github.com/ARMmbed/mbed-client +c78dabf2127827504f9430e51b83bfee2a82df22 not-for-merge branch 'nsdl-mutex-to-member' of https://github.com/ARMmbed/mbed-client +47685fce59db930dc8cebe6702cdfbe50780a64b not-for-merge branch 'obs_parameter_refactor' of https://github.com/ARMmbed/mbed-client +89a6e5be808a5ef9b889223a83a5c7e9e6a45e8d not-for-merge branch 'oma_test_fest' of https://github.com/ARMmbed/mbed-client +c845fb80d47e87ff61b5d9c4592cb0e24c4f4473 not-for-merge branch 'opaque_content' of https://github.com/ARMmbed/mbed-client +df7e8df3fafa03320b2b004a6a41156c13661e9f not-for-merge branch 'pal_tls' of https://github.com/ARMmbed/mbed-client +4028c0a2c3ac201128b686010c98c9540816cf6e not-for-merge branch 'port-randomization' of https://github.com/ARMmbed/mbed-client +353686bc91053f8bc1e0417839f76cb834bfa13c not-for-merge branch 'porting-guide-doc' of https://github.com/ARMmbed/mbed-client +0b66ec9d3f0f6288d35e568e41731412676a6859 not-for-merge branch 'put_change' of https://github.com/ARMmbed/mbed-client +aaef1ee1cbf32064ca60a2ec927b25c46e87f3cd not-for-merge branch 'ram_savings' of https://github.com/ARMmbed/mbed-client +d3872b9c84f1ce9f257c1ded79e0cc83e8ffad84 not-for-merge branch 'rand_port_fix' of https://github.com/ARMmbed/mbed-client +db1daaa9760aa74916b0701c627a758a7803434b not-for-merge branch 'reconnection_fix' of https://github.com/ARMmbed/mbed-client +26f52e5c7a9c3fa0cc4a1fe7586b2588312d4bf0 not-for-merge branch 'recursion_removal' of https://github.com/ARMmbed/mbed-client +2524e01a2f730e604b9093142baad1feb15289a5 not-for-merge branch 'refactor_memory_allocations' of https://github.com/ARMmbed/mbed-client +e6f059c1053cd84ae1ee9f4e41c5b3564eb3727c not-for-merge branch 'refactor_observation_handler_owner' of https://github.com/ARMmbed/mbed-client +78e322a51e8746a975ac9ce857148beb768bcc78 not-for-merge branch 'refactor_observation_handler_owner_ver2' of https://github.com/ARMmbed/mbed-client +065bd0f299fccde5f13ff9aa1a7522455b527219 not-for-merge branch 'refactor_resource_inheritance' of https://github.com/ARMmbed/mbed-client +7728572f221d66b78bc9182e986b648f6c0a77ad not-for-merge branch 'refactor_resource_inheritance_ver2' of https://github.com/ARMmbed/mbed-client +fc2692ec830dcd05c10bbdd01ef1366bfd0ca1f4 not-for-merge branch 'reg_fix_after_bs' of https://github.com/ARMmbed/mbed-client +7df139957086eb51cdc5d436c6ea39d3a083bf80 not-for-merge branch 'reg_update-1' of https://github.com/ARMmbed/mbed-client +5c2617e7613ffe6bc147d03f9f0fb6a957bdba3c not-for-merge branch 'registration-error' of https://github.com/ARMmbed/mbed-client +3f1ec3954570494ea077777e37524024af19465d not-for-merge branch 'rel1.2-rebase' of https://github.com/ARMmbed/mbed-client +0e65fa1008e6e5999279d1f774c96214df61b50b not-for-merge branch 'remove_location_ptr_copy' of https://github.com/ARMmbed/mbed-client +11c550b4e9a022706690073d9c23befdaf0e3626 not-for-merge branch 'revert-402-coap_separation' of https://github.com/ARMmbed/mbed-client +c2c2b52dd58a4bbf5301137305e47bff454478c4 not-for-merge branch 'revert_value_updated' of https://github.com/ARMmbed/mbed-client +d731109741cd82ce8188cb2ad71e0ebf5e2a14c5 not-for-merge branch 'small_cleanups' of https://github.com/ARMmbed/mbed-client +15e5a72f45601ce7859e8b69c7958313e8f60670 not-for-merge branch 'struct_realingnment' of https://github.com/ARMmbed/mbed-client +861fdbcebb8333e9dbc91556ddde6ddb2de1ed89 not-for-merge branch 'subscription-token' of https://github.com/ARMmbed/mbed-client +3314a8657b073e5710abf9cc0a6440fe05144bb5 not-for-merge branch 'template' of https://github.com/ARMmbed/mbed-client +c6565220df705b0559206aee6986267f0abcf23c not-for-merge branch 'thread-sync-fix' of https://github.com/ARMmbed/mbed-client +91cc7d6b1236082d4201f3151901a84654aa9b3f not-for-merge branch 'tlv_number_update' of https://github.com/ARMmbed/mbed-client +9e70addf8160ad3c7f0b596fc769ca0eeb94a1d1 not-for-merge branch 'tools_check' of https://github.com/ARMmbed/mbed-client +6390d6a9ff5695bcbc18311facc2e85854d4fd92 not-for-merge branch 'unbreak_build' of https://github.com/ARMmbed/mbed-client +25eb5e4b0c8a6662e4c6499585b949ce7f1840c2 not-for-merge branch 'unit_test_compilation_fix' of https://github.com/ARMmbed/mbed-client +c5cfc8d1097a6e2265c7c144fc81340da3c5b96e not-for-merge branch 'unit_test_fixes' of https://github.com/ARMmbed/mbed-client +4d08f6a4fccb87ba917fbad55eba686a34939ab2 not-for-merge tag 'RR1.2.0-EA' of https://github.com/ARMmbed/mbed-client +6bb3f5c830a9298b0eacf1b7510f6937f1fab3db not-for-merge tag 'RR1.2.0-RC1' of https://github.com/ARMmbed/mbed-client +d14e1247cf88ae37039493411010d0eaedad2dbe not-for-merge tag 'RR1.2.0-RC10' of https://github.com/ARMmbed/mbed-client +53e3fa1f1a22fe0b0b8ccd5ae30a85e230da7d85 not-for-merge tag 'RR1.2.0-RC11' of https://github.com/ARMmbed/mbed-client +e7f888a83b664c1a4a8d6f8e2a9807be20579806 not-for-merge tag 'RR1.2.0-RC2' of https://github.com/ARMmbed/mbed-client +75d2eb4b353a94427cc0240ea4b71ffacb00326b not-for-merge tag 'RR1.2.0-RC6' of https://github.com/ARMmbed/mbed-client +c3bfadb063dbafa958da6b8d99a6c594c59e7eb5 not-for-merge tag 'RR1.2.0-RC7' of https://github.com/ARMmbed/mbed-client +531163bc917412ed666cf619b7c51343a981f75c not-for-merge tag 'RR1.2.0-RC8' of https://github.com/ARMmbed/mbed-client +543dc9fe60ddd3aa1d01d78d0284eb32b186cd10 not-for-merge tag 'RR1.2.0-RC9' of https://github.com/ARMmbed/mbed-client +47e676bf7af1481700d85721c33e33c06f6db0e3 not-for-merge tag 'v2.1.1' of https://github.com/ARMmbed/mbed-client +56ff6bf56478dcb425b54275c3673ace98826098 not-for-merge tag 'v2.2.0' of https://github.com/ARMmbed/mbed-client +392e80679c2c6522abc24d24bdf9bfbffb76aa72 not-for-merge tag 'v2.2.1' of https://github.com/ARMmbed/mbed-client +6df180bb091a982347620a197764f98b2931a02a not-for-merge tag 'v3.0.0' of https://github.com/ARMmbed/mbed-client
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d41459d8b514d72d525e761fb4e34031e09f76e7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +b01dc96baefea7b7c7835c88128d0e37318710db
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/mbed-client/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file mbed-client/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,27 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores +mbed-client-classic +mbed-client-mbed-tls \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 b01dc96baefea7b7c7835c88128d0e37318710db www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189587 +0000 clone: from https://github.com/ARMmbed/mbed-client/ +b01dc96baefea7b7c7835c88128d0e37318710db d41459d8b514d72d525e761fb4e34031e09f76e7 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189590 +0000 checkout: moving from master to d41459d8b514d72d525e761fb4e34031e09f76e7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 b01dc96baefea7b7c7835c88128d0e37318710db www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189587 +0000 clone: from https://github.com/ARMmbed/mbed-client/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/Fix_deserializer Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 df97066d4bf1ed862f3c8851102aa4f6a562f973 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/Flag_MBED_CLIENT_SUPPORT_INTERFACE_DESCRIPTION_PTR Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 dc2d3d9269170e43f4374a69fb652d9f6604e3e7 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 b01dc96baefea7b7c7835c88128d0e37318710db www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189587 +0000 clone: from https://github.com/ARMmbed/mbed-client/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/LinuxPort Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +a2799adbae878317f645a2099e0bf175acf0cf51 e0623df87096c1ff3d6bb4f0724b482d0f4c2cc3 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/LinuxPort2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 2f92b42c05a82b765f71eeaa4bad221bf505b18f www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/TESTING-drop-bs-finish-ack Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 8b04e3c7c95e456861ab238d68a061589f8f1d22 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/TLV_binary_integer Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 940339e3d1d0646c37b4ec413453b7f0177f06c8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/TLV_binary_integers_from_master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d7056d55bfcdb28c575b1fb82e132ce0de756237 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/TVL_deserializer_fix_offset Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 6de69813accef1f8ece1ae8f51fce3d4fd7cde39 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/api-enhancement Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 c0389db5f8123dbcc2a92e7f32fa0b027e38da13 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/callback_memory_optimizations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +07030bc1ac2638c85ad29d8e2084058976e5b66d 5e396e2cb29981456ae7e4d7a4bcc03d4b168714 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: forced-update
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/compiler_warning_fixes Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 ea2ea45f20b97647df98aba9fc78b294c4bab05e www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/data_api_constifying Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 79fca5837b5bcd0e054ef4f3f2bdc762d69f08aa www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/dynamic_memory_options Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4ac8a398a0e69f2167d375cc72abab8a7fd13f5d www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/error-description-api Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d45cc02b51b28875f2d416e2af68585823c6ac35 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/fixes_for_observation_cases Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4a222583c9ad3e68c421328bd20d1db2505a6b1d www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +b01dc96baefea7b7c7835c88128d0e37318710db 97e522ba470f5374f933d304fcb05386702c9fa0 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/mbed-client-mbed-tls-update Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 ef569afbf3a77e44557ed82164ebd7cbe7ee340b www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/mbed-cloud-client-rel1.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d2d7336d843a2034a7f656b8ecd1d2540c84a8ac 5d479fd3cde7f92ddf0b3fd8e0d3fbac2f7e6835 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: forced-update
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/mbed-cloud-client-rel1.2-int Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 09d27d881b797d8299461bf11071feb2299e5768 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/mbed_os_5_4_rc Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 85ef66c4282eef70fdfe1a4a7cd3dcd7291a2b01 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/mem_opt_phase_2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 5f0a5b8005619f346c1ce45113b655ae687bfb75 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/mem_opt_phase_3 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 c9479fdd56ce4b0250cd33f492abf3436fc33fd0 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/memory_optimizations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +21253826cdfe4bd2ef4479a978854ef52148ec6d f4c5076415155d0889412ea9c22327f102b74ef6 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: forced-update
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/minor_fixes Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 011b6aebcb4799f06e45859d4853f426eab9549b www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/misc_refactoring Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 a838866e20e15d2293a40e8a3a9c75e87981fd86 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/obs_parameter_refactor Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 47685fce59db930dc8cebe6702cdfbe50780a64b www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/recursion_removal Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 26f52e5c7a9c3fa0cc4a1fe7586b2588312d4bf0 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/refactor_memory_allocations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +a90911526ccd30fd50d4cd34a25b368d585675e5 2524e01a2f730e604b9093142baad1feb15289a5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/refactor_observation_handler_owner Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 e6f059c1053cd84ae1ee9f4e41c5b3564eb3727c www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/refactor_observation_handler_owner_ver2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 78e322a51e8746a975ac9ce857148beb768bcc78 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/refactor_resource_inheritance Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 065bd0f299fccde5f13ff9aa1a7522455b527219 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/refactor_resource_inheritance_ver2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 7728572f221d66b78bc9182e986b648f6c0a77ad www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/rel1.2-rebase Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 3f1ec3954570494ea077777e37524024af19465d www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/revert-402-coap_separation Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 11c550b4e9a022706690073d9c23befdaf0e3626 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/small_cleanups Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d731109741cd82ce8188cb2ad71e0ebf5e2a14c5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/struct_realingnment Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 15e5a72f45601ce7859e8b69c7958313e8f60670 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/template Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 3314a8657b073e5710abf9cc0a6440fe05144bb5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/tlv_number_update Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 91cc7d6b1236082d4201f3151901a84654aa9b3f www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/unbreak_build Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 6390d6a9ff5695bcbc18311facc2e85854d4fd92 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/unit_test_compilation_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 25eb5e4b0c8a6662e4c6499585b949ce7f1840c2 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/logs/refs/remotes/origin/unit_test_fixes Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 c5cfc8d1097a6e2265c7c144fc81340da3c5b96e www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787100 +0000 fetch --append origin: storing head
Binary file mbed-client/.git/objects/pack/pack-13f8d6819992b9112508c318b7b1067704115c89.idx has changed
Binary file mbed-client/.git/objects/pack/pack-13f8d6819992b9112508c318b7b1067704115c89.pack has changed
Binary file mbed-client/.git/objects/pack/pack-f85e212ba25fe555ca3a448f3a8d87a8bfa57395.idx has changed
Binary file mbed-client/.git/objects/pack/pack-f85e212ba25fe555ca3a448f3a8d87a8bfa57395.pack has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,355 @@ +# pack-refs with: peeled +2269b33a792389d2017e79b021517289b54d740e refs/remotes/origin/Black_Duck +4262f3f7025817b8297f183b8045a4d4e571bed0 refs/remotes/origin/Execute_operation +1f845a27ec6e6e6a03064d498ebf24b01cdc2156 refs/remotes/origin/IOTCLT-961 +d24e70e8034ab90c0cd4ba343bbc3f1bc81b3b09 refs/remotes/origin/IOTSVS-683 +a2799adbae878317f645a2099e0bf175acf0cf51 refs/remotes/origin/LinuxPort +7b0b9db295d4dface6fb375eca895da467aff780 refs/remotes/origin/alpha2-release +fc80ee7d7c16cd6829ae26256296ce3083c6b602 refs/remotes/origin/anttiylitokola-patch-1 +141edae8a22ba36ac9b5210250eccdbf7b1117a9 refs/remotes/origin/api_extension +1303a61b91709f3d8cf27eb98d4ad616ddc9a453 refs/remotes/origin/api_refactor +d49be9ca676b09058ba35394fd9a04d37b684317 refs/remotes/origin/base_memory_opt +41f8fc41816ffe09c4a1f43831f3cd357e4a0c38 refs/remotes/origin/blocks_to_flash +56d08cb8080b68610e5e7dac8a146a4080f31252 refs/remotes/origin/bootstrap +0b12158e1e53a141cc39e29adae5cce9b5c9ae91 refs/remotes/origin/bootstrap_fix +707bf8e0744aa596d896890e57b0c7bbdf90833d refs/remotes/origin/bootstrap_support +e33986707ddf6e2ac12dd4950c081fb8974ce942 refs/remotes/origin/build-ignore +99c2fd025825cc9cd441825f5e70b4a5ca17cfc9 refs/remotes/origin/build-warning +07030bc1ac2638c85ad29d8e2084058976e5b66d refs/remotes/origin/callback_memory_optimizations +9424b064e9c629fff6ac99a6e57d1dc97be12508 refs/remotes/origin/classic_unit_test_fix +cdaa07d6fc6a416feb8b1b448c6d2bcc6c12433f refs/remotes/origin/cloud_rel1.2 +2bbf9a858b0088cc3fbb8fe9b5e92c46202dca98 refs/remotes/origin/coap-option-tidy +481514bcc8582cebf605a85ea2b605782bd3bdba refs/remotes/origin/coap_separation +75bbebf4374f320f4c2246ffa526b2ca624a68d9 refs/remotes/origin/config-mechanism +94719c136eb34571129e7d5af3cb9163f6ea8d0d refs/remotes/origin/config-parameters +5eca39b9689636770c5702a5bca260c81af786e9 refs/remotes/origin/debugging +fe77efc2424911dd110aab5d9c9723ba35d7b324 refs/remotes/origin/device_object +3ae8e51a9751b71cfa96039ca387d8998fc2e374 refs/remotes/origin/doc-update-api +1795b86693b3324f71aa286671327187be6a72cd refs/remotes/origin/execute_params_optimization +b417281f224c2d648249dab73c036ccc9275a259 refs/remotes/origin/fix_unittests_ip6tos +f49f8ce6055898084aa3fb36abc96d8bc7ced00d refs/remotes/origin/hide_string_setters +b274bb23b86c433ba0bebd1ff5fab95fd7b90abb refs/remotes/origin/iar_debug_hacks +f0706ffc64df7ec8e01e0437acc7a268bfa64bd7 refs/remotes/origin/ignore-duplicate +ac323a053046adce4f445b487a725309887a3009 refs/remotes/origin/init_path_member_by_real_data +5d2bb9674d800d2d1fd1fd1e83706b85ea246001 refs/remotes/origin/iotclt-1318 +e023dd341c59f8010766019ec0fd9d35c38b4706 refs/remotes/origin/m2msecurity-server-uri-set-value-buffer +a3e218517381669dab3976507787d2b7e104b8f8 refs/remotes/origin/makefile_compilation +b01dc96baefea7b7c7835c88128d0e37318710db refs/remotes/origin/master +4e39566e3e1cf05cd36afe4266acae4bf018130b refs/remotes/origin/mbed-client_ram_opt +d2d7336d843a2034a7f656b8ecd1d2540c84a8ac refs/remotes/origin/mbed-cloud-client-rel1.2 +01190b59e18bbea165bcaa99f5ad93aeddd23d7f refs/remotes/origin/memopt_heap_allocated_connection_security +d2412b5dd77c8c67919f6da663f1059b70b13e35 refs/remotes/origin/memopt_heap_allocated_objects +21253826cdfe4bd2ef4479a978854ef52148ec6d refs/remotes/origin/memory_optimizations +be64826994790723d27a35b5e5183450ef979534 refs/remotes/origin/memory_optimizations_base +f9e294d7f237045e06d2f684cf1473e733963c0e refs/remotes/origin/memory_savings +4c4f11287c2caa34185791231e5584836e835d35 refs/remotes/origin/more_coap_message_tracing +9586deb5c6cfbfc168f0d7abf917160b2b235069 refs/remotes/origin/nsdl-functions-mutexed +a37cbb4c9f02f1a594e63ac937956093c9714c30 refs/remotes/origin/nsdl-interface-list-accesses +c78dabf2127827504f9430e51b83bfee2a82df22 refs/remotes/origin/nsdl-mutex-to-member +89a6e5be808a5ef9b889223a83a5c7e9e6a45e8d refs/remotes/origin/oma_test_fest +c845fb80d47e87ff61b5d9c4592cb0e24c4f4473 refs/remotes/origin/opaque_content +df7e8df3fafa03320b2b004a6a41156c13661e9f refs/remotes/origin/pal_tls +4028c0a2c3ac201128b686010c98c9540816cf6e refs/remotes/origin/port-randomization +353686bc91053f8bc1e0417839f76cb834bfa13c refs/remotes/origin/porting-guide-doc +0b66ec9d3f0f6288d35e568e41731412676a6859 refs/remotes/origin/put_change +aaef1ee1cbf32064ca60a2ec927b25c46e87f3cd refs/remotes/origin/ram_savings +d3872b9c84f1ce9f257c1ded79e0cc83e8ffad84 refs/remotes/origin/rand_port_fix +db1daaa9760aa74916b0701c627a758a7803434b refs/remotes/origin/reconnection_fix +a90911526ccd30fd50d4cd34a25b368d585675e5 refs/remotes/origin/refactor_memory_allocations +fc2692ec830dcd05c10bbdd01ef1366bfd0ca1f4 refs/remotes/origin/reg_fix_after_bs +7df139957086eb51cdc5d436c6ea39d3a083bf80 refs/remotes/origin/reg_update-1 +5c2617e7613ffe6bc147d03f9f0fb6a957bdba3c refs/remotes/origin/registration-error +0e65fa1008e6e5999279d1f774c96214df61b50b refs/remotes/origin/remove_location_ptr_copy +c2c2b52dd58a4bbf5301137305e47bff454478c4 refs/remotes/origin/revert_value_updated +861fdbcebb8333e9dbc91556ddde6ddb2de1ed89 refs/remotes/origin/subscription-token +c6565220df705b0559206aee6986267f0abcf23c refs/remotes/origin/thread-sync-fix +9e70addf8160ad3c7f0b596fc769ca0eeb94a1d1 refs/remotes/origin/tools_check +cfd66cb8f296c657c8bd8e9013878876877c957d refs/tags/beta-release +a5fd1023f901dda24cc07d8270c1dba1fe1a37b3 refs/tags/mbed-os-5.0-rc1 +^909f2dc4bb792352e71f55b99f80240476cbab19 +85389d63c5401a89842762070211a9410de15f06 refs/tags/mbed-os-5.0-rc2 +^91310afd5c441feea81d6b94ec232f5900ed948e +ddf201ce71fa46af04a7ad231401a1568dcc6786 refs/tags/mbedCloudClient-R1.1 +^c767032d7ad708a6684bd7fb5ad8379966dedb49 +f8552cddd864b08c62b72ef702f55a98d9eb8d23 refs/tags/mbedCloudClient-R1.1-RC1 +^c767032d7ad708a6684bd7fb5ad8379966dedb49 +906dc52f4002c2fa1127155d262f17fabdf75be6 refs/tags/mbedCloudClient-R1.1-RC2 +^c767032d7ad708a6684bd7fb5ad8379966dedb49 +1906f8e5d1b929c70291057a2dc4ff5bd4ce4844 refs/tags/mbedCloudClient-R1.1-RC3 +^c767032d7ad708a6684bd7fb5ad8379966dedb49 +8392151ab6fccc7cfc20151d78687dc519668e81 refs/tags/mbedCloudClient-r0.8 +^1c03b36ac944532688a39d9a6bd7f8a42aecf8f3 +2b3b6adc9016ad72635a6807624eff06c7f912a8 refs/tags/mbedCloudClient-r0.8.1 +^1c03b36ac944532688a39d9a6bd7f8a42aecf8f3 +5a4e8e59ce87654bb0f85eb2a6825743b93d4e47 refs/tags/mbedCloudClient-r0.8.2 +^1c03b36ac944532688a39d9a6bd7f8a42aecf8f3 +1f540e75e65e676692b57c65c67c47a2aabcc15c refs/tags/mbedCloudClient-r1.0 +^1c03b36ac944532688a39d9a6bd7f8a42aecf8f3 +7b0b9db295d4dface6fb375eca895da467aff780 refs/tags/mbedOS-alpha2 +c19fd7f549448639521ce89906be66d38d94608b refs/tags/mbedos-16.01-release +c19fd7f549448639521ce89906be66d38d94608b refs/tags/mbedos-16.03-release +f2cc1fca954bbe77446068557679dd172cf9c8b8 refs/tags/mbedos-2016q1-oob1 +bc0b977461ba29f9d6a521b75fb324164da69695 refs/tags/mbedos-2016q1-oob2 +c19fd7f549448639521ce89906be66d38d94608b refs/tags/mbedos-2016q1-oob3 +8085b7fd398b5f06c16e2438c74a0db1f4aff094 refs/tags/mbedos-release-15-11 +2fcc5efd3c4ee4f0d3175ccd0f36a8bcca16302e refs/tags/mbedos-techcon-oob2 +1362e54918cb764c91684383770ae6484cd35f23 refs/tags/r0.5-rc4 +^87b35f76c88cb42b4ff439344328423d8c4b1227 +7e09b35136f31281fadc8b70de6685729340f64e refs/tags/test_tag +^1c03b36ac944532688a39d9a6bd7f8a42aecf8f3 +89cc356fe895cff2bbd98e26f8eaf1a993235387 refs/tags/v0.1.1 +3447a09148b0a1a18284deadffd924c930574f02 refs/tags/v0.1.10 +7b176af290ca2b4e17632acb1665e3cb6c877e9b refs/tags/v0.1.11 +95cc08baf79ec4190e955745eeb8faab074e0b6a refs/tags/v0.1.12 +ac36686dadd27a3c4e81e94f71c8c787eaaf9b81 refs/tags/v0.1.13 +75f3afd443385a9fa03d83ad71726642ad5aee33 refs/tags/v0.1.2 +d111d8eb455616607b8c16e18a928e7bcdd4fc38 refs/tags/v0.1.3 +e1eb5279eb3db1433fd0adc17455b82dd8baa6ec refs/tags/v0.1.4 +539d456d0e40eafb3324bb7a446627d13161ff9a refs/tags/v0.1.5 +df922bd2c2c7ea3e88ae98ee5db085ebd5499d34 refs/tags/v0.1.6 +ec83b3eaf9622e8e6f60642888cc18e648c620f2 refs/tags/v0.1.7 +0afa8147acf6fad513ebff569bc9934e1cbc54a0 refs/tags/v0.1.8 +f1020e866fb58d54d75eb5ba2c7258ce3d8963ba refs/tags/v0.1.9 +31f17389e0fea0f1eedf14d3c43224d43dd640f4 refs/tags/v0.2.1 +5869e3703a4c011c591858f0b90306ff7efc3168 refs/tags/v0.2.10 +^8fab59f31000ce5799f7a9a8c2a5dbbaa9702609 +54d066320d1a1b5ae5a14cd953991361552ad06b refs/tags/v0.2.11 +^47020cb207781dda8f8daf3c10cf5aae96cb30dd +beb838a31275fcc8186f62e566a5de1c9b119532 refs/tags/v0.2.12 +^4d94c599a6cacb847dea6f6eab896ec047ff654d +92aaa1230523e28fb0c956591c315f77ecc1b3dd refs/tags/v0.2.13 +^4f173bcee16ba7d9fd69c485cf9e4bc8fc8a9ca4 +d4ee134d2446634151e331319c8930d38f2fbb30 refs/tags/v0.2.14 +^e5233839c1f96b08a86fc53514cd964d8ef7f802 +1551e7d7e0fb3894b0cf4911171ff7a91d3ad4c1 refs/tags/v0.2.15 +^f421338563e816b66fd058e523ba527d2306bd98 +90c640f6f92cde424ac1de3d9080625b55a126ca refs/tags/v0.2.16 +^015dad1380c2944039d6a062c522204a6683b4e5 +70c516925362ef1dbaa3b94bd8e1d27dd700193b refs/tags/v0.2.17 +^05ef7d4cea7e914160c16879e735bfb11a49429c +ed5a5290bb0cc9115af89d5ff9892e842b550064 refs/tags/v0.2.18 +^3cc12c95289d86c6a59770df0f72a6cf70b2f01d +318b5f54c66db7621fb1f71b6f50a08414430478 refs/tags/v0.2.19 +^7483979467ecf092bbd9b7b0e0c0a51f6090a002 +b292f8f4c6ec0cbb441b98b851d9d40f35e74906 refs/tags/v0.2.2 +^5d16990936124ff3fd649472a8478c5d3de997be +4a03628e607fb9f59994d84592f55ec102b37dc8 refs/tags/v0.2.20 +^cfd66cb8f296c657c8bd8e9013878876877c957d +134e50d06b8dcde4d30b5c6680e8d4ec9b41906c refs/tags/v0.2.21 +755ddb2666ac872ed754c295e19d36c71015b39e refs/tags/v0.2.22 +1cc9797e5a2e739880d0875e04687738835681ba refs/tags/v0.2.3 +11b19433e346522b7d775dfcfa41e1c7a0a0adcd refs/tags/v0.2.4 +e05bbb5041d63a9756268f4371f2f880284013d1 refs/tags/v0.2.5 +^423b8156d21b89dcabe89042d5a13878b36f4179 +c524baab661800e61e8237c2e3bff7e1623ce539 refs/tags/v0.2.6 +22b90719b9629f0d0c4bfc2e0d8abf0443f4ff77 refs/tags/v0.2.7 +^892c6df09ead347e175e39f391353f191add93f4 +32600d4dea58204fbc102fc949232c41a53320d9 refs/tags/v0.2.8 +8f8055640f9e9781e95f8b3af3b32550f82b3363 refs/tags/v0.2.9 +^5d3fd2e37723f8427a410a723477229a87b8b570 +9eb6e26e6563b90258d45baeb54b3bf340d4d929 refs/tags/v0.3.22 +^4374ac710dfb84df5936d042ce009892d0fe98ce +f20671cf1e3ee6929433a70da9ffc92e85185c94 refs/tags/v0.3.23 +^00f8caa681eb81835305f111df39efc259d2b3c8 +1bcc0cbeee120862ed5b8ff1985e102a9c75913e refs/tags/v0.3.24 +^325cee8cf944eaa7e057dbf456f64c9c40203638 +d6f428ad6f54e50d5915f95c5ee1949ad39aa108 refs/tags/v1.0.0 +^e4ca9b077365c187dd8be16f14a657299f35fd29 +d9f1e315404ec55367f9a7a8118ceb78e5b24667 refs/tags/v1.0.1 +^f3bc81c95120ae0c1d2c551881f42a8bbaf0b34f +13d41e1d6603652a1a39e3b27775a2b8ef792f84 refs/tags/v1.0.2 +^8784e0de82aa6b55c28ce6b8ecafcf6842e9989a +65368af2a188ada42894520cd4ec7a138cee6594 refs/tags/v1.1.0 +^e98fd55026f9b835e3c7317caf7ecdffadf06793 +0745f1b195ea067a53fbff171e3b8649f436c3e5 refs/tags/v1.1.1 +^c17184139618041ac76f0c2802d79d05f12bdb1a +0ea22891043a2d655cae9f2cd190518e0afbf28a refs/tags/v1.1.10 +^4d974c1d04d6460edb59bf91c7d049f458f01d69 +52bce5a2053b2fdb69cd4a7cfb29f0ecb0bd9ab5 refs/tags/v1.1.11 +^8134e1a648cbfe51c244b33aa839d34bf88b2798 +34b7877ab7d4a0612d3919eb8dbbe1f9aefd4fea refs/tags/v1.1.12 +^bea2da2342459f4ae7fd81260c778a228411c086 +d3a2b3d7ab18015afafe1cd6332d7472a32ec863 refs/tags/v1.1.13 +^d9e051c73dff22c7bc37cd25a35e94902691109f +0ae606f67ed27ed07dce400d282bf3db00be56d3 refs/tags/v1.1.15 +^2fcc5efd3c4ee4f0d3175ccd0f36a8bcca16302e +5acb4802451ea426185d01e83e6edec55694004d refs/tags/v1.1.2 +^f0d6954d60f043ec9acf149b13489a05116e962c +c72b0f9e501cf7f4b74477802a4eb39b7870d9b1 refs/tags/v1.1.3 +^f6b34616f7acfeeb8b6512661169d8bc70badb45 +00cf9236b2a9e613d3859f8cf59505ee0b4be26a refs/tags/v1.1.4 +^d364cf8d46e9b6d86ec38199a1b1ab76538cdf7b +856ebc8724e969bce41cb439819f71be4c741130 refs/tags/v1.1.5 +^987d9457e3605ad5931c35940412c8679b665afe +d14289faea239cea221a55682462736e580b95ce refs/tags/v1.1.6 +^e85d78b34a341fd63b357c7ff3d6c252a072b46c +19978dddebb5884702c8c916dc01e97350c9cc68 refs/tags/v1.1.7 +^d14dfab0e44ff17b1d90b273981c2744018e0882 +71e568db30b760cabff442ccdfa271df1607259f refs/tags/v1.1.8 +^be53d5f2a69d56bc2dd16a5ba8f5ef537f62e695 +6a6e805266bb7270fa40a21c7e514a8ed397cc51 refs/tags/v1.1.9 +^fddd2ee4f447b33338a7457c83c990ea5d26ad86 +9dc5c322a5076e2b7dd971a239d87757ac258d3a refs/tags/v1.10.0 +^2b2a464894a7d22b24dfd2468aeb84628fccc710 +25709c9744e611f0bc6ec38f3af1ba77e6cc99ea refs/tags/v1.10.1 +^926ec8a3dfaba97b9f5ac59bd9c2c4e370f0746d +91f787a2aa641941c85e5e1be2a9990a7f9666e3 refs/tags/v1.10.2 +^005830afe4e053afd079d9039f93badba8c9e1b4 +b3339ad2c398e546ac076c1210ee83a70c0a9207 refs/tags/v1.11.0 +^6932696fe3863491144c1d38e228213ca844e29c +d33b3bd2f460f410e57047772c0db876dfe538ba refs/tags/v1.11.1 +^5d160fb2dd185da20ef6071e47dc31994c57f94c +b06e617a3ac95d0a4d36ba18c8c284f4afbffc22 refs/tags/v1.12.0 +^44f449f3ec1625d5a3c923905949b523a3db76d7 +e494784cc74563fc38e7317ff53c6bf9cb27c149 refs/tags/v1.12.1 +^ff7b4287102c67118f5da2e401c361cc3d8c2be8 +8c74fde5a711d8103ad88abb95349d371dfaf317 refs/tags/v1.12.2 +^abe7405a49d2c00c61dc689ad1a26dda6284dd09 +630ee43d061bd6135cc7fa38b04701d69cfd2396 refs/tags/v1.12.3 +^d3872b9c84f1ce9f257c1ded79e0cc83e8ffad84 +39333497e0de2d76eac835116cd67f4954fbb657 refs/tags/v1.12.4 +^5dc62d168aa4341641cffe1b11e6c5ee26347aa0 +65ab5852f7bb18eb30d7eb48a996c43ca4b3f709 refs/tags/v1.12.5 +^a6a46726f027a45ca651363d185b98d0fd8cb473 +5e2bff84d5e5e33f225099ec51bb2e648eec1a8f refs/tags/v1.12.6 +^375a48cf51608ab4228d8521105cad81ed7a69ec +f06393de6b7d8e2bbc4288075a45c667c263dd6a refs/tags/v1.12.7 +^599b9f02f51b38caf227f71aa861623ebd928da6 +d562d8ed2b4d3bcab913f2ba4c925af523f808dd refs/tags/v1.12.8 +^6638585a455c9e6d429c2089cbf28ff032245482 +854bd9ac798419bc7ea69f4d9739136d86c7c459 refs/tags/v1.13.0 +^7e09a3bc6a81eeb7032e61412bcfee09b8361132 +d5df5981f02652e4cce59d8c24a5e1677fcc3c19 refs/tags/v1.13.1 +^909f2dc4bb792352e71f55b99f80240476cbab19 +49292b40398487c86129eac24072351cb06142d9 refs/tags/v1.13.2 +^91310afd5c441feea81d6b94ec232f5900ed948e +2e8b5721535be02bb01f39194da19e383a399b00 refs/tags/v1.13.3 +^5fb49d253a137f601fc9f13819e404706f47154c +e422b0a295a56dc48b3a14aea2d552c234122225 refs/tags/v1.13.4 +^87b35f76c88cb42b4ff439344328423d8c4b1227 +5225fbb3adbff3d81a2945ea72a006648ef4bdce refs/tags/v1.14.0 +^98bb9cf8652d9fa3f7882d5c3d5e15c21a1e55a9 +1b00711513ed63dca4572b76f3620517306abfd0 refs/tags/v1.15.0 +^ce709e08039407ee69ce1f638543652261742439 +57426020a5d25877c9159b31c27f2ffbbc1a4ff8 refs/tags/v1.15.1 +^ae89da57afcafb68d02e1e591db0bc2c9b03d5bd +09a8bdfb1c6d3e13a9eb64603204ac685e111b6a refs/tags/v1.15.2 +^c319b987d287e0fbfe5e5b4ef5141f8826e07f46 +7b96d92c5ea57af1787013f85e5270aacf9dcb68 refs/tags/v1.15.3 +^51dbe894981ab0b576a42120a1ab087908f18995 +2560e12589513e8397aca9c009e32b5370e64b17 refs/tags/v1.16.0 +^600de4abb6c0cccc5ee575386635a7a4821f90d5 +82658443134c98d65f4dc3de2a0b3cc700e31a70 refs/tags/v1.17.0 +^02445eb1269f323e7c5eda1f0fa1645ab09fe01c +89900d3776cc32e67d2da06711af7333681c0fca refs/tags/v1.18.0 +^35b46377ef584ebfb886daf499d4fb37b2bbcaa3 +149f36615926b01399dd0510ca50b274a4a6c6f1 refs/tags/v1.18.1 +^c2577b10255ed073a1862407d2675f1028c2ff9f +6a29b2ff3bedd3ef9ef936ef943961a7864d2ce6 refs/tags/v1.18.2 +^33371459658997b296f90e1f297abbe1c9c3a2a7 +6dcb370752c45fcaf39ff08a976d53bce1259d26 refs/tags/v1.18.3 +^1c03b36ac944532688a39d9a6bd7f8a42aecf8f3 +2d509a1dea00dbf0515d81b14e680462c9f6b169 refs/tags/v1.2.0 +^45d8d3d5ff1eb6beaf5c879dd9ffead8f2442029 +57e87af20895c99c2a4be393335301357377bc35 refs/tags/v1.2.1 +^a30fb9ddddbc1d049af1401f4684cc9a1315bb7f +90aee96d8063ed10cfeb76035180e0ccdcbe3edc refs/tags/v1.2.10 +^4fa149414c24126ec9c1252795f672cfcd648e73 +a70c171a8e1c9b07cd62d8a3898de63d7a8f55dd refs/tags/v1.2.11 +^c7ceced2db1cf0bef75e08a96e6a0a539f907b6a +3ff0e43c6bf1ab206485d7351edd1de86bcf6b2e refs/tags/v1.2.12 +^154e742f3f4661808e59b6ccdac5198f02d40bf2 +38abbc90f74db804f276ca123481940033a165c8 refs/tags/v1.2.13 +^823be89b151c31bf932a5ca17f14137271cde3f1 +0b1c6bca82f89dd74018ca0fb5fc11e80bc10545 refs/tags/v1.2.14 +^9bb711aa9d9b69ed28e5394f2503d1eeb95a874b +eaa16f4e72ee31f3147a3b2d5ca2f719e2505567 refs/tags/v1.2.15 +^4577b19c5718387f6d4f495ba7a175a097825a4b +bcf4e0bdfd3f3a6dc6e0dab39e2f2f5de2d04a03 refs/tags/v1.2.16 +^c9bca12bc800f2417ee889d1167349bbef9a80ff +a536315efbaacaab8a015d9585a3bd0beea10853 refs/tags/v1.2.17 +^f6b79e763d197ca057d943158e70146cdf683811 +7c65517e8a7fbb7b281ca2c955c30d58cd2cad07 refs/tags/v1.2.18 +^56fd68cfd53a29043f451c833a98b2dd880fe839 +365332e2423381bb769f97a59dd786ae9ef5186a refs/tags/v1.2.19 +^61d4c6ac56db3a51f668dbe042d94a608054d209 +66a225f91a21adaddc5e6716d0857a023871c282 refs/tags/v1.2.2 +^63e26b737af6f0257d0ccbc2c227744fc332f048 +098eb3bfb26c45906b4ac037528d03ba41c5b6f2 refs/tags/v1.2.20 +^8253957b7cc824c4867e45d7d296dc1c198eea83 +67f1fd18f23edca8965d14c44abb8324c9d3050a refs/tags/v1.2.3 +^53c88ba1bedf692f0619a6fa141ac224e2c7c066 +962e87f220dada4cc65e1ee5f17702a57d80082d refs/tags/v1.2.4 +^c849d99c5dc1caf3dd8a749498d22a2c9193d856 +9fd604716250390509b95acdb53df7a3b6cb4a30 refs/tags/v1.2.5 +^544bca5de2db4a132e8b06b723b7a368b9ed1322 +d9954d165df9ec96b7c9904a45fe06f297e57083 refs/tags/v1.2.6 +^ce4909fd1c1740650e093d87c1f40439771bd582 +9d275baad4ce430bde7fb0e4c8434b06abb66bcd refs/tags/v1.2.7 +^550528095ce5ad1d233cc5780ba33e1da6a8fdcf +4e39f5f33291ade56c09cef31d1f3dcfde13fdac refs/tags/v1.2.8 +^0501e0d0d8ce8f40191a72693ae64ad1e12c0d7b +f98ed84789de8e07a50e839ff18d4a534be29725 refs/tags/v1.2.9 +^d16738ecb9aaaad90d82a3c51f8fcc64f949b87e +6b1c6ba08b0dffecb1f9afc267c121881c72ac0f refs/tags/v1.3.0 +^54b1f3a605f8678858e1ed373620c9a8b52dbc33 +3c0daef1f67f5c1cd08c1b36614e2e894b9bc1f4 refs/tags/v1.3.1 +^72ca58857912d3a1c77aa2940c650d5c3f469aee +c0aac756df5c89ee7d058b51bda23e38eac2b509 refs/tags/v1.3.2 +^56a82c7fd103d66d522bd238ef816b500710aae0 +ca94c5a9f4d97b42ef970e0f5d95c5882343e61f refs/tags/v1.4.0 +^28dcfd7faa6891a8d6269209a142115493ae3b52 +2a91eabd691e9caf74276a1233227e2ff914b763 refs/tags/v1.4.1 +^4ce16c92c7fa055ef8a5ffe46378ab5ee59dfc97 +5105a037a14e1129bc179f1a32d9b50ec6d78569 refs/tags/v1.4.10 +^c9839249068b0becd03f55205ab70a16c8f4e5b7 +8688fa32d168c0edd0269c44ba3766a67e91b235 refs/tags/v1.4.2 +^37a9be3c8aa9b1efb444450b9f12cc0430460a28 +7001985cd753b6366ddc49d58eda1f8e9525dc0d refs/tags/v1.4.3 +^bd19af31c88a9e3793c2ad644c50e97681027a60 +037107abd62371325b1ace76785b1d1a334492ba refs/tags/v1.4.4 +^7e01b2d9925db7a4995f8a76d19e402607bd87d0 +d3c0e4337622c9b7511d2a8507c56cf0e5f2b88a refs/tags/v1.4.5 +^3f95cfef49fa30312152d0fa2ad5021c22ab0530 +9a3d6e9450969d2a8f872883d1d2a328e94f401d refs/tags/v1.4.6 +^99b6f34688f45206c7e2ce90351bd9323a23f049 +1f634f987e3dd9c211f5e844a81efae4843f1f9a refs/tags/v1.4.7 +^c20e584e6cdbcf054d259253d36483df94c93ab7 +1923c4289ffad347a68488f8b9c386d30278449c refs/tags/v1.4.8 +^f2cc1fca954bbe77446068557679dd172cf9c8b8 +ba29be49c8376223b6efa6e683dcbdfff830810e refs/tags/v1.4.9 +^b9d7524a2062c8929802a3863d0c1a55a4a135e8 +7e7dcaac8cf170f48321467c28b3c0c712343dd8 refs/tags/v1.5.0 +^bc0b977461ba29f9d6a521b75fb324164da69695 +f7f72a02f1ed646a4fe5ec2804b83629d114aa99 refs/tags/v1.6.0 +^0a7744fd1575d3374e94977f7f8c8f5986bf9839 +cd4669a97844000124087b82f8acf92d5c7d4b2b refs/tags/v1.7.0 +^c19fd7f549448639521ce89906be66d38d94608b +397bfdd386c55955e20b1b1eb3a0401a81a9ddf6 refs/tags/v1.7.1 +^0d6fd83f72e3ace33b4656aa2e29a8bad7196957 +5bca91e59658706317e0e3f58204cbfee1ac5145 refs/tags/v1.7.2 +^f74acbb54f8c2d1b195ea5a86e57a9e757d16b9f +c15a0bcff43dd29e7c6e5ccb6ffd44e6d0f8a0c4 refs/tags/v1.7.3 +^062a3b3213b821719dc9ee75f088737c0b8c80ef +72f6f5d41d5e2c431eb43e54d7565d08fc21428a refs/tags/v1.8.0 +^0f9aae05b5b9f6602d9c7e14dd3be8c43a7cbc3f +84dc238b6211c6b717b8e64d072d9f0db6e7d233 refs/tags/v1.8.1 +^4fa896a0037f14cfc10264929c4f3e532fa8058a +c77f1c7228349cf797f473360fe7f43e4636f444 refs/tags/v1.9.0 +^83c03536152c8fbc7316f98d11c2bf304b5db962 +32861afe96d12ae18c1c2608c289f3fda6eff1e0 refs/tags/v1.9.1 +^b0dafff60d002ad4cf3157b7f1786380d5ae4127 +c5381cc0e9fab7443a6de2e91a8a0d1835faea33 refs/tags/v1.9.2 +^c48093cbc2a850274eef79515ba60fab59ef2871 +374e2bd13fc256c2b186f24d01982367e612f563 refs/tags/v1.9.3 +^f8e47a8cff48c319f404972bfa1a8848b2971065 +f1af303ec51f7ca40308a792c094e65f01e51325 refs/tags/v1.9.4 +^1ec00f7af2d702cf4d10f08a6e75664a3d31cb58 +1c40e615dbe5cc39c8fd24165223ad143c615bc4 refs/tags/v2.0.0 +^5d7f78254dc55d4130cb9f7604225bb7ee7c31c5 +2d5431f220c568bc38b0268efefab34d3866657e refs/tags/v2.0.1 +^eecac3a4177159d4f7e01ac94ca4e7b2ebaf2461 +64f05b683937c8012eff79852e6ac7eb064b4fcb refs/tags/v2.0.2 +^d41459d8b514d72d525e761fb4e34031e09f76e7 +d1f5ab194db1908064f6493508917bae92a66061 refs/tags/v2.1.0 +^e057dfc57efe0f938e27c4dff650b78a705458f4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +b01dc96baefea7b7c7835c88128d0e37318710db
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/Fix_deserializer Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +df97066d4bf1ed862f3c8851102aa4f6a562f973
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/Flag_MBED_CLIENT_SUPPORT_INTERFACE_DESCRIPTION_PTR Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +dc2d3d9269170e43f4374a69fb652d9f6604e3e7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/LinuxPort Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e0623df87096c1ff3d6bb4f0724b482d0f4c2cc3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/LinuxPort2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +2f92b42c05a82b765f71eeaa4bad221bf505b18f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/TESTING-drop-bs-finish-ack Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +8b04e3c7c95e456861ab238d68a061589f8f1d22
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/TLV_binary_integer Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +940339e3d1d0646c37b4ec413453b7f0177f06c8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/TLV_binary_integers_from_master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d7056d55bfcdb28c575b1fb82e132ce0de756237
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/TVL_deserializer_fix_offset Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +6de69813accef1f8ece1ae8f51fce3d4fd7cde39
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/api-enhancement Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +c0389db5f8123dbcc2a92e7f32fa0b027e38da13
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/callback_memory_optimizations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +5e396e2cb29981456ae7e4d7a4bcc03d4b168714
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/compiler_warning_fixes Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ea2ea45f20b97647df98aba9fc78b294c4bab05e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/data_api_constifying Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +79fca5837b5bcd0e054ef4f3f2bdc762d69f08aa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/dynamic_memory_options Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4ac8a398a0e69f2167d375cc72abab8a7fd13f5d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/error-description-api Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d45cc02b51b28875f2d416e2af68585823c6ac35
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/fixes_for_observation_cases Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4a222583c9ad3e68c421328bd20d1db2505a6b1d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +97e522ba470f5374f933d304fcb05386702c9fa0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/mbed-client-mbed-tls-update Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ef569afbf3a77e44557ed82164ebd7cbe7ee340b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/mbed-cloud-client-rel1.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +5d479fd3cde7f92ddf0b3fd8e0d3fbac2f7e6835
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/mbed-cloud-client-rel1.2-int Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +09d27d881b797d8299461bf11071feb2299e5768
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/mbed_os_5_4_rc Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +85ef66c4282eef70fdfe1a4a7cd3dcd7291a2b01
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/mem_opt_phase_2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +5f0a5b8005619f346c1ce45113b655ae687bfb75
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/mem_opt_phase_3 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +c9479fdd56ce4b0250cd33f492abf3436fc33fd0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/memory_optimizations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +f4c5076415155d0889412ea9c22327f102b74ef6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/minor_fixes Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +011b6aebcb4799f06e45859d4853f426eab9549b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/misc_refactoring Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +a838866e20e15d2293a40e8a3a9c75e87981fd86
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/obs_parameter_refactor Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +47685fce59db930dc8cebe6702cdfbe50780a64b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/recursion_removal Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +26f52e5c7a9c3fa0cc4a1fe7586b2588312d4bf0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/refactor_memory_allocations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +2524e01a2f730e604b9093142baad1feb15289a5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/refactor_observation_handler_owner Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e6f059c1053cd84ae1ee9f4e41c5b3564eb3727c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/refactor_observation_handler_owner_ver2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +78e322a51e8746a975ac9ce857148beb768bcc78
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/refactor_resource_inheritance Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +065bd0f299fccde5f13ff9aa1a7522455b527219
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/refactor_resource_inheritance_ver2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7728572f221d66b78bc9182e986b648f6c0a77ad
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/rel1.2-rebase Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +3f1ec3954570494ea077777e37524024af19465d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/revert-402-coap_separation Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +11c550b4e9a022706690073d9c23befdaf0e3626
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/small_cleanups Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d731109741cd82ce8188cb2ad71e0ebf5e2a14c5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/struct_realingnment Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +15e5a72f45601ce7859e8b69c7958313e8f60670
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/template Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +3314a8657b073e5710abf9cc0a6440fe05144bb5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/tlv_number_update Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +91cc7d6b1236082d4201f3151901a84654aa9b3f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/unbreak_build Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +6390d6a9ff5695bcbc18311facc2e85854d4fd92
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/unit_test_compilation_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +25eb5e4b0c8a6662e4c6499585b949ce7f1840c2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/remotes/origin/unit_test_fixes Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +c5cfc8d1097a6e2265c7c144fc81340da3c5b96e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-EA Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4d08f6a4fccb87ba917fbad55eba686a34939ab2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC1 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +6bb3f5c830a9298b0eacf1b7510f6937f1fab3db
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC10 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d14e1247cf88ae37039493411010d0eaedad2dbe
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC11 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +53e3fa1f1a22fe0b0b8ccd5ae30a85e230da7d85
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e7f888a83b664c1a4a8d6f8e2a9807be20579806
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC6 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +75d2eb4b353a94427cc0240ea4b71ffacb00326b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC7 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +c3bfadb063dbafa958da6b8d99a6c594c59e7eb5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC8 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +531163bc917412ed666cf619b7c51343a981f75c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/RR1.2.0-RC9 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +543dc9fe60ddd3aa1d01d78d0284eb32b186cd10
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/v2.1.1 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +47e676bf7af1481700d85721c33e33c06f6db0e3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/v2.2.0 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +56ff6bf56478dcb425b54275c3673ace98826098
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/v2.2.1 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +392e80679c2c6522abc24d24bdf9bfbffb76aa72
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.git/refs/tags/v3.0.0 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +6df180bb091a982347620a197764f98b2931a02a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.gitignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,38 @@ +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +yotta_modules +yotta_targets +build +lcov/* +coverage/* +results/* +output/* +.yotta.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.mbedignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,4 @@ +config/* +docs/* +doxygen/* +test/*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.msub Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +mbed-client-classic = https://github.com/ARMmbed/mbed-client-classic/#33:42f18d977122acd4f5ad9ce141b74304b357dec2 +mbed-client-mbed-tls = https://github.com/ARMmbed/mbed-client-mbed-tls/#98:7e1b6d81503843ee98192e11f31df12508938c9d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/.yotta_ignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,7 @@ +# files for linux builds + +# ignore linux test application +test/lwm2mtestapplication/* +test/lwm2m/* +coverage/* +results/*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/DOXYGEN_FRONTPAGE.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +ARM mbed Client +================ + +## Introduction +This is the Doxygen generated documentation of mbed Client. +It should be used in conjunction with the [mbed Client Guide](https://docs.mbed.com/docs/mbed-client-guide/en/latest/) +hosted in http://docs.mbed.com. + +# API documentation + +See [Files](files.html) section to find a documentation about specific API.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/LICENSE Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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 + 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. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,59 @@ +# +# Makefile for mbed Client C++ Library +# +# List of subdirectories to build +TEST_FOLDER := ./test/ + +# Define compiler toolchain with CC or PLATFORM variables +# Example (GCC toolchains, default $CC and $AR are used) +# make +# +# OR (Cross-compile GCC toolchain) +# make PLATFORM=arm-linux-gnueabi- +# +# OR (ArmCC/Keil) +# make CC=ArmCC AR=ArmAR +# +# OR (IAR-ARM) +# make CC=iccarm + +LIB = libmbedclient.a + +# List of unit test directories for libraries +UNITTESTS := $(sort $(dir $(wildcard $(TEST_FOLDER)*/utest/*))) + +# If configuration is not specified, use linux +ifeq (,$(CONFIG)) +CONFIG := linux +endif + +include sources.mk +include include_dirs.mk +include config/$(CONFIG).mk + +SERVLIB_DIR := ../../libService +NSDL_C_DIR := ../../nsdl-c +override CFLAGS += -I$(SERVLIB_DIR)/libService +override CFLAGS += -I$(NSDL_C_DIR)/nsdl-c +override CFLAGS += $(addprefix -I,$(INCLUDE_DIRS)) +override CFLAGS += $(addprefix -D,$(FLAGS)) +ifeq ($(DEBUG),1) +override CFLAGS += -DHAVE_DEBUG +endif + +COVERAGEFILE := ./lcov/coverage.info + +# +# Define compiler toolchain +# +include ../../libService/toolchain_rules.mk + +$(eval $(call generate_rules,$(LIB),$(SRCS))) + +# Extend default clean rule +clean: clean-extra + +$(CLEANDIRS): + @make -C $(@:clean-%=%) clean + +clean-extra: $(CLEANDIRS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +ARM mbed Client +======================= + +This repository contains ARM mbed Client: a library that connects devices to mbed Device Connector Service, mbed Device Server (mDS) and to mbed-enabled cloud services from our partners. + +The documentation is collected under the docs directory and the **mbed Client Guide** is also hosted [here](https://docs.mbed.com/docs/mbed-client-guide/en/latest/). + +Running Unit Tests +----------------------- + +Pre-requisites for the unit tests includes the following tools: +- CppUTest +- XSL +- lcov +- gcovr +- Ninja + +You can use these commands to get the tools if you are running Ubuntu. + + sudo apt-get install cpputest + sudo apt-get install xsltproc + sudo apt-get install lcov + sudo apt-get install gcovr + sudo apt-get install ninja-build
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/config/linux.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +FLAGS += \ + TARGET_LIKE_LINUX
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/Howto.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,468 @@ +# How to use the mbed Client API + +This section explains how to use our C++ API to create and configure different types of Objects, Object Instances and Resources for mbed Client to comply with the OMA LWM2M specifications. These resources can then be communicated to mbed Device Server. + +<span class="notes">**Note:** The API complies with the OMA LWM2M specifications.</span> + +As per the OMA LWM2M specification: + +- The client must have defined Objects, under which it can create Object Instances. +- The client must have created Object Instances under Objects, which will eventually contain Resources. +- The client must have Resources under Object Instances which belong to Objects. +- The client must have created Resources under Object Instance. You can create M2MResource from the M2MObjectInstance class. +- The client must have created Resource Instances under Resources. You can create M2MResourceInstance from the M2MObjectInstance class. + +Read the API doxygen documentation [here](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/index.html). + +## How to create and configure Objects + +With this API, you can create and configure the following Objects: + +- [Device Objects](#device-object) +- [Security Objects](#security-object) +- [Custom Objects](#custom-object) + +The M2MObject class is derived from the M2MBase class, so all the public methods can be used from the M2MObject and its derived classes. + +### Creating OMA-defined Objects + +#### Device Object + +To create a Device Object: + +`static M2MDevice *create_device();` + +Because there can be only one instance of M2MDevice, it is a static class and you can delete it as follows: + +`M2MDevice::delete_instance();` + +Check the [M2MDevice class documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/m2mdevice_8h.html) to see how to configure the Device Object. + +#### Security Object + +To create a Security Object: + +`static M2MSecurity *create_security(M2MSecurity::ServerType server_type);` + +You can create a Bootstrap or normal mbed Device Server by passing the appropriate `enum` value. + +Check the [M2MSecurity class documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/m2msecurity_8h.html) to see how to configure the Security Object, as well as how to create appropriate Resources and assign values to them. + +#### Custom Object + +For a Custom Object, you need to pass the name of the Object that you would like to create (for example `Test`); this will create an Object with that name in mbed Device Server. + +To create an M2MObject: + +`static M2MObject *create_object(const String &name);` + +#### Configuring the Object + +Once you have created an Object (whether OMA-specific or custom), you can configure various parameters in it to control or modify communication with mbed Device Server. + +``` +M2MObject * _object = M2MInterfaceFactory::create_object("Test"); + if(_object) { + _object->set_register_uri(true); // The registration message explicitly sends this object path as registered resource such as /Test. + } +``` + +Here, we discuss a few of the most important parameters, which you must configure properly to work with the Objects. + +##### Setting Operation Mode + +To set the operation mode of the Objects so that they can handle `GET`, `PUT`, `POST`, `DELETE` or a combination of these requests coming from mbed Device Server: + +``` +virtual void set_operation(M2MBase::Operation operation); +_object->set_operation(M2MBase::GET_PUT_POST_ALLOWED); // This defines the REST operations that can be performed on this object. +``` + +##### Setting Observable Mode + +To set the Object to be an observable resource: + +`virtual void set_observable(bool observable);` + +By default, all the created objects are non-observable. You can set them to be observable or not observable using this API. + +``` +_object->set_observable(true); // The object can be observed from server. +_object->set_observable(false); // The object cannot be observed from server. +``` + +##### Setting CoAP content type + +Currently, the only available content type is the OMA TLV type. The OMA TLV type works only for Objects with a numeric value. For example, if you are creating a custom Object it must be of a numeric type such as `100`. + +`M2MObject * _object = M2MInterfaceFactory::create_object("100");` + +By default, all the numeric objects are assigned the CoAP content type of `99` by mbed Client but if you want your Object to assign any other CoAP content type, for example 120, you can do that by setting the object's CoAP content type as shown below: + +``` +virtual void set_coap_content_type(const uint8_t content_type); +_object->set_coap_content_type(120); +``` + +<span class="tips">**Tip:** In future releases, we will introduce support for the JSON content types.</span> + +## How to create and configure Object Instances + +With this API, you can create and configure the following Object Instances: + +- [Device Object Instance](#device-object-instance) +- [Security Object Instance](#security-object-instance) +- [Custom Object Instance](#custom-object-instance) + +The `M2MObjectInstance` class is derived from the `M2MBase` class, so all the public methods from `M2MObjectInstance` and its derived classes can be used. + +### Creating an OMA-defined Object Instance + +#### Device Object Instance + +Because there can only be one instance for the Device Object, the Object Instance is automatically created when creating an M2MDevice Object. + +#### Security Object Instance + +Because there can only be one instance for the Security Object, the Object Instance is automatically created when creating an M2MDevice Object based on a selected server type. + +#### Custom Object Instances + +Object Instances need IDs. Normally, the IDs start from '0' and increment, +so the Object Instance structure on the mbed Device Server side would look like this: + +`Object/Object Instance ID` + +When you create an Object Instance, you therefore need to pass the ID that you would like to create. For example, if you pass `0`, you get an object `/Test/0` on mbed Device Server. + +To create an M2M Object Instance: + +`M2MObject::create_object_instance(uint16_t instance_id);` + +You can pass an Object Instance ID to create appropriate Object Instances. Normally, Object Instances will start from `0` and increment. So the Object Instance structure on the mbed Device Server side would look like this: + +`Object/Object Instance ID` + +``` +M2MObjectInstance * object_instance = _object->create_object_instance(0); + if(object_instance) { + object_instance->set_register_uri(true); // The registration message explicitly sends this object instance path as registered resource such as /Test/0. + } +``` + +### Configuring the Object Instance + +When you have created an Object Instance (whether OMA-specific or custom), you can configure various parameters in it to control or modify communication with mbed Device Server. + +Here, we present a few of the most important parameters that you must configure properly to work with the object instances. + +##### Setting Operation Mode + +To set the operation mode of the Objects so that they can handle `GET`, `PUT`, `POST`, `DELETE` or a combination of these requests coming from mbed Device Server: + +``` +virtual void set_operation(M2MBase::Operation operation); +object_instance->set_operation(M2MBase::GET_PUT_POST_ALLOWED); // This defines the REST operations that can be performed on this object instance. +``` + +##### Setting Observable Mode + +To set the Object Instance to be an observing resource: + +`virtual void set_observable(bool observable);` + +By default, all the created Object Instances are non-observable. You can set them to be observable or not observable using this API. + +``` +_object_instance->set_observable(true); // This defines that the Object Instance can be observed from server. +_object_instance->set_observable(false); // This defines that the Object Instance cannot be observed from server. +``` + +##### Setting CoAP content type + +Currently, the only available content type is the OMA TLV type. The OMA TLV type works only for Objects and Object Instances with a numeric value. For example, if you are creating a custom Object and Object Instances it must be of a numeric type such as `100`. + +``` +M2MObject * _object = M2MInterfaceFactory::create_object("100"); +M2MObjectInstance * object_instance = _object->create_object_instance(0); +``` + +By default, all numeric objects are assigned the CoAP content type of `99` by mbed Client but if you want your Object Instance to assign any other CoAP content type, for example 120, you can do that by setting the object's CoAP content type as follows: + +``` +virtual void set_coap_content_type(const uint8_t content_type); +object_instance->set_coap_content_type(120); +``` + +<span class="tips">**Tip:** In future version, we will introduce support for the JSON content types.</span> + +There are additional APIs that provide getter and remove functions for Object Instances in the `M2MObjectInstance` class; [check the API documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/classM2MObjectInstance.html) for their usage. + +## How to create and configure Resources and Resource Instances + +With this API, you can create and configure the following Resources and Resource Instances: + +- [Device Object Resources](#device-object-resources) +- [Security Object Resources](#security-object-resources) +- [Custom Resources](#custom-resources) + + +The `M2MResource` class is derived from the `M2MResourceInstance`, which in turn is derived from the `M2MBase` class, so all the public methods can be used from `M2MResource` or `M2MResourceInstance` and their derived classes. + +### Creating OMA-defined Resources + +#### Device Object Resources + +There are direct APIs to create and set values for the Device Resources. You can create the required Resource and set values based on their data types. + +- For Resources that take string values: + +`M2MResource* create_resource(DeviceResource resource, const String &value);` + +- For Resources that take integer values: + +`M2MResource* create_resource(DeviceResource resource, uint32_t value);` + +- There are a few Resources that can have multiple instances. To create these Resources: + +`M2MResourceInstance* create_resource_instance(DeviceResource resource, uint32_t value,uint16_t instance_id);` + +Where `instance_id` is the Resource Instance ID, for example `/3/0/11/0`. + +Check the [M2MDevice API documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/classM2MDevice.html) to find which enums are supported for `integer` or `string` value types. + +There are other APIs in the `M2MDevice` class that you can use to set, remove and modify new values for the resources. + +#### Security Object Resources + +_Mandatory Resources_ + +Most of the mandatory Resources are created automatically when you create an M2MSecurity Object. You can set their values based on their data types. + +Resources that are automatically created and their accepted data types: + +- `SecurityMode` +- `ShortServerID` +- `M2MServerUri` +- `BootstrapServer` +- `PublicKey` +- `ServerPublicKey` +- `Secretkey` + +For Resources (`SecurityMode`, `ShortServerID`) that take integer values, you can set the values as follows: + +`bool set_resource_value(SecurityResource resource,uint32_t value);` + +``` +security_object->set_resource_value(M2MSecurity::SecurityMode, 1); +security_object->set_resource_value(M2MSecurity::ShortServerID, 1); +``` + +For Resources (`M2MServerUri`) that take string values, you can set the values as follows: + +`bool set_resource_value(SecurityResource resource,const String &value);` + +``` +security_object->set_resource_value(M2MSecurity::M2MServerUri, "coap://api.connector.mbed.com:5684"); +``` + +For Resources (`PublicKey`, `ServerPublicKey`, `Secretkey`) that take binary values, you can set the values as follows: + +`bool set_resource_value(SecurityResource resource,onst uint8_t *value,const uint16_t length);` + +``` +uint8_t key[] = {"key"}; +security_object->set_resource_value(M2MSecurity::PublicKey, key, sizeof(key)); +``` + +_Optional Resources_ + +Optional Resources as defined in the Security Object: + +- `SMSSecurityMode` +- `M2MServerSMSNumber` +- `ClientHoldOffTime` + +To create and set values for the optional Resources that take an integer value: + +`M2MResource* create_resource(SecurityResource resource, uint32_t value);` + +`security_object->create_resource(M2MSecurity::M2MServerSMSNumber, 123542323);` + + +Check the [M2MSecurity API documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/classM2MSecurity.html) to find which enums are supported for `integer`, `string` or `uint8_t*` value types. + +There are more APIs in the `M2MSecurity` class that you can use to set, remove and modify Resource values. + +#### Custom Resources + +For Custom Objects, you can create Resources of two types: + +- **M2MResource**: a resource with a single instance, for example `/Test/0/Resource`. + +- **M2MResourceInstance**: a resource with multiple instances, for example `/Test/0/Resource/0`, `/Test/0/Resource/1`. + +For each of these types, the Resource and Resource Instances can be either static or dynamic: + +- **Static**: Resource and Resource Instances whose value does not change over time, these are not observable. +- **Dynamic**: Resource and Resource Instances whose value can change. These can be made observable. + +**Creating dynamic and static single-instance Resources** + +- To create a single-instance Resource with a static value (`/Test/0/Resource`): + +``` +M2MObject * object = M2MInterfaceFactory::create_object("Test"); +M2MObjectInstance * object_instance = object->create_object_instance(0); + +uint8_t value[] ={"value"}; +M2MResource* resource = object_instance->create_static_resource("Resource", "sensor",M2MResourceInstance::INTEGER,value,sizeof(value),false); +``` + +- To create an observable single-instance Resource (`/Test/0/Resource`) with a dynamic value that can be set later on: + +``` +M2MObject * object = M2MInterfaceFactory::create_object("Test"); +M2MObjectInstance * object_instance = object->create_object_instance(0); + +M2MResource* resource = object_instance->create_dynamic_resource("Resource", "sensor",M2MResourceInstance::INTEGER, true, false); +int64_t value = 1000; +resource->set_value(value); +``` + +**Creating dynamic and static Resource Instances** + +- To create a Resource Instance (`/Test/0/Resource/0`) with a static value: + +``` +M2MObject * object = M2MInterfaceFactory::create_object("Test"); +M2MObjectInstance * object_instance = object->create_object_instance(0); + +uint8_t value[] ={"value"}; +M2MResourceInstance* resource_instance = object_instance->create_static_resource_instance("Resource", "sensor",M2MResourceInstance::INTEGER,value,sizeof(value),0); +``` + + +- To create an observable Resource Instance (`/Test/0/Resource/0`) with a dynamic value that can be set later on: + +``` +M2MObject * object = M2MInterfaceFactory::create_object("Test"); +M2MObjectInstance * object_instance = object->create_object_instance(0); + +uint8_t value[] ={"value"}; +M2MResourceInstance* resource_instance = object_instance->create_dynamic_resource_instance("Resource", "sensor",M2MResourceInstance::INTEGER, true, 0); +int64_t value = 1000; +resource_instance->set_value(value); + +``` + +#### Configuring the Resource and Resource Instance + +When you have created a Resource or Resource Instance (whether OMA-specific or custom), you can configure various parameters to control or modify communication with mbed Device Server. + +Here, we present a few of the most important parameters that you must configure properly to work with the Resource and Resource Instance. + +##### Setting Operation Mode + +You can set the Resource or Resource Instance operation mode so that they can handle `GET`, `PUT`, `POST`, `DELETE` or a combination of these requests coming from mbed Device Server. + +To set the operation mode: + +``` +virtual void set_operation(M2MBase::Operation operation); +resource->set_operation(M2MBase::GET_PUT_POST_ALLOWED); // This defines the REST operations that can be performed on this Resource. +resource_instance->set_operation(M2MBase::GET_PUT_POST_ALLOWED); // This defines the REST operations that can be performed on this Resource Instance. +``` + +##### Setting Observable Mode + +To set the Resource or Resource Instance to be an observable resource: + +`virtual void set_observable(bool observable);` + +By default, all created static Resources or Resource Instances are non-observable. While creating a dynamic Resource or Resource Instance you can specify through API whether they are observable or not. You can change that later as well as follows: + +``` +resource->set_observable(true); // This defines that the Resource or Resource Instance can be observed from server. +resource->set_observable(false); // This defines that the Resource or Resource Instance cannot be observed from server. +``` + +##### Setting the value of a dynamic Resource or Resource Instance + +You can set the value of a dynamic Resource or Resource Instance so that they can be sent to mbed Device Server using `GET` requests. + +To set the values: + +``` +virtual bool set_value(const uint8_t *value, const uint32_t value_length); +uint8_t value[] = {"value"}; +resource->set_value(value,sizeof(value)); +``` + +##### Setting an executable function + +For dynamic Resources, you can pass a function pointer to the Resource or Resource Instance. It will be executed when mbed Device Server calls a `POST` method on that resource. The Resource or Resource Instance must support the `POST` operation mode for this feature to work. + +To pass the function pointer: + +``` +virtual void set_execute_function(execute_callback callback); +void execute_function_example(void *) { +// Code +}; +resource->set_execute_function(execute_callback(this,&execute_function_example)); +``` + +In case execute callback function is defined as a global function and it's outside of your class scope you can use overloaded set_execute_function: +``` +virtual void set_execute_function(execute_callback_2 callback); +static void c_style_function(void *) { +// Code +} +resource->set_execute_function(&c_style_function); +``` +There are additional APIs that provide getter and remove functions for Resource and Resource Instances in the `M2MResource` and `M2MResourceInstance` classes. Check [the API documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/annotated.html) for their usage. + +##### Setting an external handler for block-wise messages + +For dynamic Resources, you can pass a function pointer to the Resource Instance. It will be executed when mbed Device Server calls a `PUT` method on that resource with large payload using block-wise operation. The Resource must support the `PUT` operation mode for this feature to work. If the callback is set, the application will be notified for every incoming block-wise message and the message is not stored in mbed Client side anymore. In such case, it is application's responsibility to store each block-wise message and combine them when the last block has arrived. + +<span class="notes">**Note:** Due to a limitation in the mbed-client-c library, GET request can only contain data up to 65KB.</span> + +To pass the function pointer for an incoming block-wise message: + +``` +virtual void set_incoming_block_message_callback(incoming_block_message_callback callback); +void block_message_received(M2MBlockMessage *argument) { +// Code +} +resource->set_incoming_block_message_callback(incoming_block_message_callback(this, &block_message_received)); +``` + +To pass the function pointer for an outgoing block-wise message: + +``` +virtual void set_outgoing_block_message_callback(outgoing_block_message_callback callback); +void block_message_requested(const String& resource, uint8_t *&data, uint32_t &len) { +// Code +} +resource->set_outgoing_block_message_callback(outgoing_block_message_callback(this, &block_message_requested)); +``` + +Applications can define their own maximum incoming message size in bytes at build time. For mbed OS, create a `mbed_app.json` file in the application level and overwrite the value as described below: + +``` +"target_overrides": { + "*": { + "mbed-client.sn-coap-max-incoming-message-size": 100000 + } + +``` + +For yotta based builds, you need to create a `config.json` file in the application level: + +``` +{ +"coap_max_incoming_block_message_size": 100000 +} +```
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/Introduction.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,212 @@ +# ARM mbed Client overview + +ARM mbed Client is a library that provides the means to connect constrained embedded devices to mbed Device Connector Service, mbed Device Server and to mbed-enabled cloud services from our partners. + +The mbed Client high-level APIs allow mbed OS developers to create applications with LWM2M features as described in the [Lightweight Machine to Machine Technical Specification](http://technical.openmobilealliance.org/Technical/technical-information/release-program/current-releases/oma-lightweightm2m-v1-0): + +- Manage devices on mbed Device Server. +- Securely communicate with internet services over the industry standard TLS/DTLS. +- Fully control the endpoint and application logic. + +The API is written in C++ to allow quick application development. + +## Managing devices on mbed Device Server + +mbed Client supports the following three features introduced in the subsequent chapters: + +- [Client Registration and Deregistration](client_reg_dereg.md) +- [Device Management and Service Enablement](dev_man_serv_enable.md) +- [Information Reporting](info_reporting.md) + +The API also provides an interface to define the application endpoint information. This information will be delivered to mbed Device Server during the registration operation. + +First, you need to create an interface for mbed Client: + +``` +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2minterface.h" + +M2MInterface* interface = M2MInterfaceFactory::create_interface(*this, + "mbed-endpoint", + "test", + 3600, + 5684, + "", + M2MInterface::UDP, + M2MInterface::LwIP_IPv4, + ""); +``` + +### Setting up own random number generator function + +To provide a stronger security mechanism, mbed Client requires a random number generator to feed a random number into the underlying SSL library. There is a default PRNG seeded with RTC for security but some platforms do not have RTC, and for some, time value seeded PRNG is not secure enough. + +Now, an application can pass its own RNG implementation to mbed Client as function pointer callback through an API, `set_random_number_callback(random_number_cb callback)`. + +Here is an example on how you can use it from an application: + +``` +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2minterface.h" + +uint32_t get_random_number(void) +{ + uint32_t i = 0; + printf("\Your application's RNG logic\n"); + return i; +} + +_interface->set_random_number_callback(&get_random_number); + +``` + +### Setting up own entropy function for additional secure connectivity + +mbed Client provides an API to add your own entropy source into the underlying SSL library. There is a default entropy source provided by mbed Client. It uses PRNG seeded with RTC for the security but some platforms do not have RTC, and for some, this level of security may not be strong enough. + +Now, an application can pass its own entropy source to mbed Client as function pointer callback through an API `set_entropy_callback(entropy_cb callback)`. + +Here is an example on how you can use it from an application: + +``` +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2minterface.h" + +entropy_cb ent_cb; + +int ent_poll( void *, unsigned char *output, size_t len, + size_t *olen ) +{ + for(uint16_t i=0; i < len; i++){ + srand(time(NULL)); + output[i] = rand() % 256; + } + *olen = len; + + return( 0 ); +} + + ent_cb.entropy_source_ptr = ent_poll; + ent_cb.p_source = NULL; + ent_cb.threshold = 128; + ent_cb.strong = 0; + +_interface->set_entropy_callback(ent_cb); + +``` + +### Maximum UDP message size + +The maximum single UDP message size that mbed Client can receive is 1152 bytes. The actual payload size is 1137 bytes, the header information using the remaining 15 bytes. + +For transferring larger amounts of data, the Blockwise feature must be deployed. When using this feature, mbed Client can handle messages up to 65KB by default. This feature is disabled by default. To receive more than 65KB, see [Setting an external handler for block-wise messages](Howto.md#setting-an-external-handler-for-block-wise-messages). + +To enable the Blockwise feature in mbed OS, create a `mbed_app.json` file in the application level and overwrite Blockwise value as described below: + +*Example:* +``` +"target_overrides": { + "*": { + "mbed-client.sn-coap-max-blockwise-payload-size": 1024 + } + +``` + +To enable the Blockwise feature in yotta based builds, you need to create a `config.json` file in the application level. + +*Example:* +``` +{ +"coap_max_blockwise_payload_size": 1024 +} +``` + +Acceptable values for the `coap_max_blockwise_payload_size` flag are: +0, 16, 32, 64, 128, 256, 512 and 1024. Value 0 means that the feature is not used. + +### CoAP message deduplication + +By default, message deduplication is disabled. More information about deduplication in the [CoAP specification](https://tools.ietf.org/html/rfc7252#page-24). + +For mbed OS, to enable message deduplication, create a `mbed_app.json` file in the application level and overwrite the deduplication value as described below: + +*Example:* +``` +"target_overrides": { + "*": { + "mbed-client.sn-coap-duplication-max-msgs-count": 1 + } + +``` +For yotta based builds, to enable message deduplication, you need to create a `config.json` file in the application level. + +*Example:* +``` +{ +"coap_duplication_max_msgs_count": 1 +} +``` +Recommended values for the `coap_duplication_max_msgs_count` flag are 0 to 6. Value 0 means that the feature is not used. It is not recommended to use higher value than 6, because it increases the memory consumption. + +### Reconnectivity + +Apart from standard CoAP features, mbed Client also handles reconnectivity logic on behalf of applications, thereby aiming to provide seamless connectivity experience and recovery from temporary network hiccups or service side disruptions. + +The reconnection logic handles the following: + + - Reconnection towards mDS; establishing the network connection and re-registration to mDS. + - CoAP message resending logic. More information about resending in [CoAP specification](https://tools.ietf.org/html/rfc7252#section-4.8). + +There are two parameters in the reconnection logic, both configurable by the application: + + - Reconnection Retry + - Reconnection Time Interval (in seconds) + +mbed Client tries to establish a successful connection to the server by incrementing the reconnection trials every time there is a failed connection attempt. + +The logic of the `Reconnection Timeout` is `Reconnection Retry count * Reconnection Time Interval` , where `Reconnection Retry count` is incremented by 1 with every failed reconnection attempt. + +mbed Client continues to attempt a reconnection until `Reconnection Retry count` reaches the defined value (either by the application or the default value set in Client). + +If mbed Client still cannot establish a connection and the set `Reconnection Retry count` is reached, it returns an error through a callback with an appropriate error code defining the reason for failed connection. + +There are a few exceptions to the reconnection logic though. If mbed Client sends registration data that is rejected by the server, the client returns an error and does not attempt a reconnection as the server has rejected the data from the client. A typical example of such case would be passing a non-matching endpoint name or domain name against the client certificates. + +Applications can define their own parameters for the reconnection logic. + +For mbed OS, to overwrite the reconnection retry count and reconnection time interval, create a `mbed_app.json` file in the application level and overwrite the values as described below: + +*Example:* +``` +"target_overrides": { + "*": { + "mbed-client.reconnection-count": 3, + "mbed-client.reconnection-interval": 5, + } + +``` +For yotta based builds, to overwrite the reconnection retry count and reconnection time interval, you need to create a `config.json` file in the application level. + +*Example:* +``` +{ +"reconnection_count": 3, +"reconnection_interval": 5 +} +``` + +## How to use the API +More information on how to use the API effectively to create and configure Objects, Object Instances and Resources, can be found [here](Howto.md). + +## API documentation + +The documentation for this API is [available here](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/annotated.html). + +## Example application + +We have an example application for + +1. [mbed OS](https://github.com/ARMmbed/mbed-client-examples). + +2. [Ubuntu](https://github.com/ARMmbed/mbed-client-linux-example). +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/client_reg_dereg.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,177 @@ +# The Client Registration feature + +The client uses the Client Registration to register with mbed Device Server, update registration and deregister. + +Currently, only one-to-one client-server registration is supported. One-to-many client-server registrations will be supported in an upcoming release. + +The Client Registration includes multiple sub-features. Currently supported: + +- [Register](#the-register-feature) +- [Update](#the-update-feature) +- [Deregister](#the-deregister-feature) + +## The Register feature + +This API enables the client registration functionality. + +When registering, the client: + +* Performs the **Register** operation and provides parameters that mbed Device Server requires to register the client (for example Endpoint Name). + +* Maintains the registration and session (for example, it sets the Lifetime and Queue Mode towards mbed Device Server). + +* Provides information on the Objects the client supports and existing Object Instances in the client. + +### Registering your client + +To provide information to mbed Device Server and issue the register command: + +**Step 1.** Create an mbed DS Object. This object contains information about mbed Device Server, such as its address and security mode. + +``` +#include "mbed-client/m2msecurity.h" + M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); + if(security) { + security->set_resource_value(M2MSecurity::M2MServerUri, LWM2M_SERVER_ADDRESS); + security->set_resource_value(M2MSecurity::BootstrapServer, 0); + security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity); + } +``` + +**Step 2.** mbed Client supports both non-secure and secure mode operations. For secure mode, you need to provide a certificate, private key and server public key through the API. + +To create a secure mode operation: + +``` +#include "mbed-client/m2msecurity.h" + M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); + if(security) { + security->set_resource_value(M2MSecurity::M2MServerUri, LWM2M_SERVER_ADDRESS); + security->set_resource_value(M2MSecurity::BootstrapServer, 0); + security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate); + security->set_resource_value(M2MSecurity::ServerPublicKey,<SERVER_CERT>,sizeof(<SERVER_CERT>)); + security->set_resource_value(M2MSecurity::PublicKey,<CERT>,sizeof(<CERT>)); + security->set_resource_value(M2MSecurity::Secretkey,<KEY>,sizeof(<KEY>)); + } +``` + +**Step 3.** Register all the resources that you would like to monitor or follow using mbed Device Server. To do this, create the resource objects and pass them to the Register API for registration purposes. + +For example, if you want to register your OMA LWM2M based Device object, you need to create the object and set the values for mandatory resources as follows: + +``` +#include "mbed-client/m2mdevice.h" +M2MDevice *device = M2MInterfaceFactory::create_device(); +if(device) { + device->create_resource(M2MDevice::Manufacturer,MANUFACTURER); + device->create_resource(M2MDevice::DeviceType,TYPE); + device->create_resource(M2MDevice::ModelNumber,MODEL_NUMBER); + device->create_resource(M2MDevice::SerialNumber,SERIAL_NUMBER); + } +``` + +<span class="notes">**Note:** You can register other resources, including custom resources. Please check the [API documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/annotated.html) for a detailed description of the M2MObject, M2MObjectInstance and M2MResource classes.</span> + +**Step 4.** You have the registration server object and resources that you want to register. Now, you need to call the register API and pass the following objects as parameters: + +``` +M2MInterface::register_object(M2MSecurity* register_object, M2MObjectList object_list); +``` + +**Success or failure callback** + +Because this is an asynchronous operation, you will receive the result of this operation through a callback defined in `m2minterfaceobserver.h` in your application. + +_Success_ + +If the register operation is successful and the client can register all your resources to mbed DS, your application will receive the following callback: + +``` +void object_registered(M2MSecurity *server_object, const M2MServer& server) +``` + +The `M2MSecurity *server_object` specifies to which mbed Device Server instance the client has just registered and `M2MServer &server` contains the data related to mbed Device Server, including the Short ServerID and the client registration period. + +_Failure_ + +If the registration operation fails for some reason, you will receive the following callback: + +``` +void error(M2MInterface::Error error) +``` + +You will get more information about the error from the `error` parameter passed with the callback; use it to fix the source of the error. + +## The Update feature + +Periodically, or in response to events within the client or as initiated by mbed Device Server, the client updates its registration information with mbed Device Server by sending it an **Update** operation. + +Normally, the enabler will update the registration automatically, but if you want to renew the registration before that, you can use this API. + +To update your registration: + +``` +M2MInterface::update_registration(M2MSecurity* security_object, const uint32_t lifetime) +``` + +To update your registration and publish newly created objects to mbed Device Server: + +``` +M2MInterface::update_registration(M2MSecurity *security_object, const M2MObjectList &object_list, const uint32_t lifetime); +``` + +**Success or failure callback** + +_Success_ + +If the update operation is successful, your application will receive the following callback: + +``` +void registration_updated(M2MSecurity *const M2MServer& server) +``` + +The `M2MSecurity *server_object` specifies with which mbed Device Server instance the client has just updated the registration and `M2MServer &server` contains the data related to mbed Device Server, including the Short ServerID and the client registration period. + +_Failure_ + +If the update operation fails for some reason, you will receive the following callback: + +``` +void error(M2MInterface::Error error) +``` + +## The Deregister feature + +The client can deregister from mbed Device Server when it no longer requires access to the server. When mbed Device Server receives the **Deregister** message it removes the device's registration information from its database. When the client needs mbed Device Server again, it has to register again. + +To deregister your endpoint client: + +If the endpoint has multiple server registrations, you need to provide the `server_object` of the server from which would like to deregister. If there is only one registration, you can pass `NULL` and the client will deregister from the default registration. + +``` +M2MInterface::unregister_object(M2MSecurity *object); +``` + +**Success or failure callback** + +Because this is an asynchronous operation, you will receive the result of this operation through a callback defined in `m2minterfaceobserver.h` in your application. + +_Success_ + +If the client is successfully deregistered from mbed Device Server, your application will receive the following callback: + +``` +void object_unregistered(M2MSecurity *server_object) +``` + +The `M2MSecurity *server_object` specifies from which mbed Device Server instance the client has just deregistered. + +_Failure_ + +If the deregistration operation fails for some reason, you will receive the following callback: + +``` +void error(M2MInterface::Error error) +``` + +You will get more information about the error from the `error` parameter passed with the callback; use it to fix the source of the problem.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/data_types.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,162 @@ +mbed Client data types +====================== + +This chapter describes how the different data types are processed in the mbed Client and the REST API. + +The following two aspects are considered: + +- How the different data types should be passed to API on mbed Client. +- How the data is received on REST API side, and how it is converted into right data type. + +## Using mbed Client data types + +When data is transferred from mbed Client to mbed Device Server, the following need to be kept in mind: + +- mbed Client is based on CoAP client. The Resource values are represented as text/plain format. +- Different data type values have to be converted into corresponding text/plain format. +- For example, an integer value 100 is passed in a text buffer format of 100 and it appears on the web service side as 100 in text format. +- The service must interpret this data to an appropriate format. + +### Transferring integers from mbed Client to mbed Device Server + +**Integer (from the application)**: + +``` +int value = 1; +M2MResource* instance = objinst->create_dynamic_resource(âD", âIntegerTypeâ,M2MResourceInstance::INTEGER, true); +char buffer[20]; +int size = sprintf(buffer,"%d",value); +instance->set_value((const uint8_t*)buffer, size); +``` + +If you want the value of the resource to be stored in the server cache for a certain period of time, you can set the `max_age` parameter. Subsequent requests to the same resource will get the response directly from the cache: + +``` +instance->set_max_age(15) ; // This is the resource lifetime in the server cache (in seconds). +``` + +**Response on the REST API**: + +``` +{"async-response-id":...{ "id" : "1131895768#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/Test/0/D", "status" : 200, "payload" : "MQ==", "ct" : "text/plain", "max-age" : 0 } +``` + +- Base64 encoded value of the payload -> `MQ==` +- Base64 decoded value of the payload -> `1` + +<span class="notes">**Note**: If the resource value is stored in the server cache and is still valid, the response comes straight from the cache in **plain text**, neither inside any json object nor encoded in B64.</span> + +### Transferring a float value from mbed Client to mbed Device Server + +**Float (from the application)**: + +``` +float value = 1.0232f; +M2MResource* instance = objinst->create_dynamic_resource(âD", âIntegerTypeâ,M2MResourceInstance::FLOAT, true); +char buffer[20]; +int size = sprintf(buffer,"%f",_value); +instance->set_value((const uint8_t*)buffer, size); +``` + +If you want the value of the resource to be stored in the server cache for a certain period of time, you can set the `max_age` parameter. Subsequent requests to the same resource will get the response directly from the cache: + +``` +instance->set_max_age(15) ; // This is the resource lifetime in the server cache (in seconds). +``` + +**Response on the REST API**: + +``` +{"async-response-id":...{ "id" : "1132945328#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/Test/0/D", "status" : 200, "payload" : "MS4wMjMyMDA=", +"ct" : "text/plain", "max-age" : 0 } +``` + +- Base64 encoded value of the payload -> `MS4wMjMyMDA=` +- Base64 decoded value of the payload -> `1.023200` + +<span class="notes">**Note**: If the resource value is stored in the server cache and is still valid, the response comes straight from the cache in **plain text**, neither inside any json object nor encoded in B64.</span> + +### Transferring a boolean value from mbed Client to mbed Device Server + +**Boolean (from the application)**: + +``` +bool value = true; +M2MResource* instance = objinst->create_dynamic_resource(âD", âIntegerTypeâ,M2MResourceInstance::BOOLEAN, true); +char buffer[20]; +int size = sprintf(buffer,"%d",_value); +instance->set_value((const uint8_t*)buffer, size); +``` + +If you want the value of the resource to be stored in the server cache for a certain period of time, you can set the `max_age` parameter. Subsequent requests to the same resource will get the response directly from the cache: + +``` +instance->set_max_age(15) ; // This is the resource lifetime in the server cache (in seconds). +``` + +**Response on the REST API**: + +``` +{"async-response-id":â¦.{ "id" : "1131895768#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/Test/0/D", "status" : 200, "payload" : "MQ==", "ct" : "text/plain", "max-age" : 0 } +``` + +- Base64 encoded value of the payload -> `MQ==` +- Base64 decoded value of the payload -> `1` + +<span class="notes">**Note**: If the resource value is stored in the server cache and is still valid, the response comes straight from the cache in **plain text**, neither inside any json object nor encoded in B64.</span> + +### Transferring a string value from mbed Client to mbed Device Server + +**String (from the application)**: + +``` +M2MResource* instance = objinst->create_dynamic_resource(âD", âIntegerTypeâ,M2MResourceInstance::STRING, true); +char buffer[10] = âTest Dataâ; +instance->set_value((const uint8_t*)buffer, 10); +``` + +If you want the value of the resource to be stored in the server cache for a certain period of time, you can set the `max_age` parameter. Subsequent requests to the same resource will get the response directly from the cache: + +``` +instance->set_max_age(15) ; // This is the resource lifetime in the server cache (in seconds). +``` + +**Response on the REST API**: + +``` +{"async-response-id":... { "id" : "1133335779#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/Test/0/D", "status" : 200, "payload" : "VGVzdCBEYXRh", +"ct" : "text/plain", "max-age" : 0 } +``` + +- Base64 encoded value of the payload -> `VGVzdCBEYXRh` +- Base64 decoded value of the payload -> `Test Data` + +<span class="notes">**Note**: If the resource value is stored in the server cache and is still valid, the response comes straight from the cache in **plain text**, neither inside any json object nor encoded in B64.</span> + +### Transferring an opaque value from mbed Client to mbed Device Server + +**Opaque(from the application)**: + +``` +M2MResource* instance = objinst->create_dynamic_resource(âD", âIntegerTypeâ,M2MResourceInstance::OPAQUE, true); +uint8_t buffer[12] = âOpaque Dataâ; +instance->set_value(buffer, 12); +``` + +If you want the value of the resource to be stored in the server cache for a certain period of time, you can set the `max_age` parameter. Subsequent requests to the same resource will get the response directly from the cache: + +``` +instance->set_max_age(15) ; // This is the resource lifetime in the server cache (in seconds). +``` + +**Response on the REST API**: + +``` +{"async-response-id":... { "id" : "1134045351#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/Test/0/D", "status" : 200, "payload" : "T3BhcXVlIERhdGEA", +"ct" : "application/octet-stream", "max-age" : 0 } +``` + +- Base64 encoded value of the payload -> `T3BhcXVlIERhdGEA` +- Base64 decoded value of the payload -> `Opaque Data` + +<span class="notes">**Note**: If the resource value is stored in the server cache and is still valid, the response comes straight from the cache in **plain text**, neither inside any json object nor encoded in B64.</span>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/dev_man_serv_enable.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,219 @@ +# The Device Management and Service Enabler feature + +mbed Device Server uses the Device Management and Service Enabler to access Object Instances and Resources available on the client. The interface provides this access through the following operations: + +- [Create](#the-create-operation) +- Delete +- [Read](#the-read-operation) +- [Write](#the-write-operation) +- [Write Attributes](#the-write-attributes-operation) +- [Execute](#the-execute-operation) + +Currently, support for the Create and Delete actions is limited to Object Instances. + +The Device Management and Service Enabler Interface supports the following data types: + +- Text: for Resources. +- TLV: for Object and Object Instances. + +## The Create operation + +There are two types of resources you can create: + +- Static: you set the value of the resource once and it does not change during the course of operations. +- Dynamic: the value is expected to change during the course of operations. Therefore, the value is fetched from setter APIs every time the server requests a read operation. + +Here is an example of creating a custom static Resource: + +``` +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +_object = M2MInterfaceFactory::create_object("Test"); +if(_object) { + M2MObjectInstance* inst = _object->create_object_instance(); + if(inst) { + inst->create_static_resource("S", + "ResourceTest", + STATIC_VALUE, + sizeof(STATIC_VALUE)-1); +``` + +And here is an example of creating a custom dynamic Resource: + +``` +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +_object = M2MInterfaceFactory::create_object("Test"); +if(_object) { + M2MObjectInstance* inst = _object->create_object_instance(); + if(inst) { + M2MResource* res = inst->create_dynamic_resource("D","ResourceTest",true); + char buffer[20]; + int size = sprintf(buffer,"%d",_value); + res->set_operation(M2MBase::GET_PUT_ALLOWED); + res->set_value((const uint8_t*)buffer, + (const uint32_t)size); +``` + +For more information on different resource functionalities, please check the [API documentation](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/annotated.html) for the M2MObject, M2MObjectInstance and M2MResource classes. + +## The Read operation + +The Client API allows setting values to Resources, an array of Resource Instances, an Object Instance or all the Object Instances of an Object (TLV format supported). mbed Device Server can then read these values using the **Read** operation. + +## The Write operation + +The **Write** operation is used to overwrite the value of a Resource, an array of Resource Instances or multiple Resources from an Object Instance. + +Whenever there is a valid `PUT` operation for any of the resources, the application will receive a callback: + +``` +void value_updated(M2MBase *base, M2MBase::BaseType type) +``` +Where `M2MBase` is the Object whose value has been updated and `M2MBase::BaseType` is the object type. + +Check the code snippet below for usage. +``` +void value_updated(M2MBase *base, M2MBase::BaseType type) { + M2MResource* resource = NULL; + M2MResourceInstance* res_instance = NULL; + M2MObjectInstance* obj_instance = NULL; + M2MObject* obj = NULL; + String object_name = ""; + String resource_name = ""; + uint16_t object_instance_id = 0; + uint16_t resource_instance_id = 0; + if(base) { + switch(base->base_type()) { + case M2MBase::Object: + obj = (M2MObject *)base; + object_name = obj->name(); + break; + case M2MBase::ObjectInstance: + obj_instance = (M2MObjectInstance *)base; + object_name = obj_instance->name(); + object_instance_id = obj_instance->instance_id(); + break; + case M2MBase::Resource: { + resource = (M2MResource*)base; + object_name = resource->object_name(); + object_instance_id = resource->object_instance_id(); + resource_name = resource->name(); + printf("Value updated, object name %s, object instance id %d, resource name %s\r\n", + resource->object_name().c_str(), resource->object_instance_id(), resource->name().c_str()); + } + break; + case M2MBase::ResourceInstance: { + res_instance = (M2MResourceInstance*)base; + object_name = res_instance->object_name(); + object_instance_id = res_instance->object_instance_id(); + resource_name = res_instance->name(); + resource_instance_id = res_instance->instance_id(); + } + break; + default: + break; + } + } + } +``` +By default, callbacks are handled in the `value_updated()` function but the application can also define a callback function for an individual resource. + +Check the code snippet below for usage. + +``` +static void value_updated_global(const char *name) { + if(name) { + ... + } +} + +void M2MLWClient::value_updated_function(const char* name) { + if (name) { + ... + } +} + +M2MResource* res = inst->create_dynamic_resource("D", "ResourceTest", true); +char buffer[20]; +int size = sprintf(buffer,"%d",_value); +res->set_operation(M2MBase::GET_PUT_POST_DELETE_ALLOWED); +res->set_value((const uint8_t*)buffer, (const uint32_t)size); +res->set_value_updated_function(value_updated_callback(this,&MbedClient::value_updated_function)); +/* Overloaded function can be used If callback function is not in class scope. +res2->set_value_updated_function(value_updated_callback2(&value_updated_global)); +*/ + +``` + +## The Write Attributes operation + +Any readable Resource can have attributes that are considered during the [**Observe** operation](info_reporting.md#the-observe-feature). The following attributes are used: + +- Minimum Period (pmin) +- Maximum Period (pmax) +- Greater Than (gt) +- Less Than (lt) +- Step (st) + +mbed Device Server sets the endpoint attribute values that are used to determine when the endpoint sends the Resource value to the server. + +Check the [LWM2M Specification](http://technical.openmobilealliance.org/Technical/technical-information/release-program/current-releases/oma-lightweightm2m-v1-0) for details of all the possible **Write Attributes** defined for different types of Objects and Resources. + +## The Execute operation + +mbed Device Server uses the **Execute** operation to perform an action. This operation can only be performed on individual Resources. + +<span class="notes">**Note:** mbed Client returns an error when the **Execute** operation is received for Object Instances or Resource Instances.</span> + +If you want to execute a piece of code in your application, you can pass a `POST` request from mbed Device Server. +When your Resource receives the `POST` request, mbed Client parses the payload from the request and wraps it in the `M2MResource::M2MExecuteParameter` class. The class object is passed through the execute callback function. +You can then typecast the `void*` argument into the corresponding `M2MResource::M2MExecuteParameter` and access the passed payload and its length through the given API. M2MResource::M2MExecuteParameter contains also information which object and object instance resource belongs to. Make sure that the payload sent through POST request is in `plain/text` format and that the content-type is set as âplain/textâ on the POST request call. + +Check the code snippet below for usage. + +``` +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" + static void execute_function_2(void *argument) { + if(argument) { + M2MResource::M2MExecuteParameter* param = (M2MResource::M2MExecuteParameter*)argument; + int payload_length = param->get_argument_value_length(); + uint8_t* payload = param->get_argument_value(); + String object_name = param->get_argument_object_name(); + uint16_t object_instance_id = param->get_argument_object_instance_id(); + String resource_name = param->get_argument_resource_name(); + } + + void M2MLWClient::execute_function(void *argument) { + if(argument) { + M2MResource::M2MExecuteParameter* param = (M2MResource::M2MExecuteParameter*)argument; + int payload_length = param->get_argument_value_length(); + uint8_t* payload = param->get_argument_value(); + String object_name = param->get_argument_object_name(); + uint16_t object_instance_id = param->get_argument_object_instance_id(); + String resource_name = param->get_argument_resource_name(); + } + +_object = M2MInterfaceFactory::create_object("Test"); +if(_object) { + M2MObjectInstance* inst = _object->create_object_instance(); + if(inst) { + M2MResource* res = inst->create_dynamic_resource("D","ResourceTest",true); + char buffer[20]; + int size = sprintf(buffer,"%d",_value); + res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + res->set_value((const uint8_t*)buffer, + (const uint32_t)size); + res->set_execute_function(execute_callback(this,&M2MLWClient::execute_function)); + /* Overloaded function can be used If callback function is not in class scope. + res->set_execute_function(execute_callback_2(&execute_function_2)); + */ +``` + +The POST method allows the client to respond immediately with the updated payload value as a piggyback response. If you want to send the payload response to the server later (because the Execute operation may take longer time on device to complete), you can handle this through the API. + +You can set the resource API `void set_delayed_response(bool)` to `true`. In this case, the POST request response to the server is an empty acknowledgment. When your resource is ready with the response, you can simply call `send_delayed_post_response()` on that resource and the client sends the latest resource value to the server as part of a separate response to the POST request. By default, `void set_delayed_response(bool)` is `false`, which means that the POST response returns the resource value as a piggyback payload immediately.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/further-reading.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +# Useful reading + +[Getting started with mbed Device Connector](https://docs.mbed.com/docs/getting-started-with-mbed-device-connector/en/latest/) provides you: + +- a generic introduction to mbed Device Connector. +- a quick start guide for using mbed Device Connector. + +[mbed Device Connector Web Interfaces](https://docs.mbed.com/docs/mbed-device-connector-web-interfaces/en/latest/) provides you: + +- an overview to the Web Interfaces, explaining how the web applications interact with mbed Device Connector using the REST API. + +[mbed Device Connector developer site](https://www.mbed.com/en/development/cloud/mbed-device-connector-service/) + +- a web site for developers
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/index.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,17 @@ +About this document +===================== + +This document introduces the mbed Client and the use of its API. The document is divided into the following chapters: + +- [**Introduction**](Introduction.md) is a brief introduction to the mbed Client and its features. +- [**The Client Registration feature**](client_reg_dereg.md) introduces the Client Registration feature in detail. +- [**The Device Management and Service Enabler feature**](dev_man_serv_enable.md) introduces the Device Management and Service Enabler feature in detail. +- [**The Information Reporting feature**](info_reporting.md) introduces the Information Reporting feature in detail. +- [**mbed Client data types**](data_types.md) describes how the different data types are processed in the mbed Client and the REST API. +- [**How to use the mbed Client API**](Howto.md) contains detailed instructions on using the mbed Client API. +- [**Porting mbed Client**](porting-guide.md) is meant for advanced users and tells how to build mbed Client and port it for different platforms. +- [**Useful reading**](further-reading.md) links you to mbed Device Connector documentation and the developer site. + +Read the doxygen API documentation [here](https://docs.mbed.com/docs/mbed-client-guide/en/latest/api/index.html). + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/info_reporting.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,20 @@ +# The Information Reporting feature + +mbed Device Server uses the Information Reporting to observe any changes in a registered Resource on the client. The server registers to observe the Resource. When the Resource changes, it sends a notification with its new value to all servers who asked to observe it. + +The interface supports the following sub-features: + +## The Observe feature + +mbed Device Server initiates an observation request to observe the changing value of either an Object, Object Instance or Resource. + +<span class="tips">**Tip:** Related parameters for the **Observe** operation are described in the [Write Attributes](dev_man_serv_enable.md#write-attributes) section.</span> + +## The Notify feature + +The client sends the **Notify** operation to mbed Device Server during a valid observation on a Resource, when the notification conditions are met. + +## Cancel + +mbed Device Server sends the **Cancel Observation** operation to the client to end an observation relationship for an Object Instance or a Resource. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/known-issues-mbed-client1511.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,59 @@ +# Known Issues + +## About this document + +This is the list of known issues for the 15.11 release of [mbed Client](https://github.com/ARMmbed/mbed-client). We publish mbed-client as module in GitHub, and track open issues as tickets in the repository. That makes for an easy development flow, but doesnât make it very easy for you to get a single view of all the issues that affect the whole release. + +The purpose of this document is to provide that single view of all the key issues we are aware of. It isnât a complete list; itâs a filtered and reviewed list, focusing on the issues we thought youâd want to be aware of. Each item explains the problem, as well as workarounds if those are possible. For items filed through GitHub, weâve included a link to the issue so that you can follow the discussion and code - or even suggest a solution. + +For more information about an issue, contact us on the [mbed forums](http://forums.mbed.com). + +### Other information not in this document + +Weâre still very actively building mbed Client and the 15.11 release is a technology preview. As such there are some other limitations of the release that you can find described in the [release note](https://www.mbed.com/en/development/software/mbed-client/releases/mbed-client1511). + +#### Important Note for Windows Users + +If you are using this release on Microsoft Windows, please be advised that because of the way Windows handles filename and paths, you may have problems if you attempt to use this in a deep directory hierarchy with a long path name (e.g. `c:\some\very\long\path`). If you experience problems unpacking or building this release, please try it in a location with a shorter path before filing a bug. Thanks. + +*** +### mbed Client API may not be fully interoperable with other LWM2M servers. + +*Description*: mbed Client API is OMA LWM2M compatible. However, some features may not be fully interoperable against other open source LWM2M servers. This is the first release version and more features will be made interoperable over coming releases. + +*Workaround*: mbed Client is compatible with mbed Device Connector Service, which can be tested at [https://connector.mbed.com](https://connector.mbed.com). + +*Reported Issue*: ARM internal reference IOTCLT-366 + +*Priority*: Major + +### mbed Client for Linux doesn't support IPv6 connectivity + +*Description*: mbed Client for Linux platform currently works only for IPv4-enabled LWM2M server addresses. IPv6 address support is currently broken. + +*Workaround*: mbed Client is compatible with mbed Device Connector Service which can be tested from [https://connector.mbed.com](https://connector.mbed.com) over IPv4 Address. + +*Reported Issue*: https://github.com/ARMmbed/mbed-client-linux/issues/19 + +*Priority*: Major + +### mbed Client will occasionally disconnect from LWM2M Server because of network errors + +*Description*: If mbed Client is kept running for long durations (over 24 hours) with long lifetime values, it occasionally goes offline due to unstable network conditions - and doesn't send periodic updates to LWM2M server. + +*Workaround*: Set the periodic lifetime value to less than 15 minutes if you want to run stability tests. Also, implement a network error handling mechanism on the application side, to handle `error()` callbacks received from the mbed-client library. + +*Reported Issue*: ARM internal reference IOTCLT-206 + +*Priority*: Major + +### mbed Client might experience a memory leak when running for long durations + +*Description*: mbed Client might have memory leak issues when left running for longer than 12 hours. + +*Workaround*: None + +*Reported Issue*: ARM internal reference IOTCLT-290 + +*Priority*: Major +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/mbed_Client_Known_Issues_16_03.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,42 @@ +# mbed Client Known Issues + +## About this document + +This is the list of known issues for the [16.03 release of mbed Client](Release_Note.md). + +We publish mbed Client as a collection of modules on GitHub. Issues are raised in the specific repositories and then tracked internally. + +The purpose of this document is to provide a single view of the outstanding key issues that have not been addressed for this release. As such it is a filtered and reviewed list based on priority and potential impact. Each item summarises the problem and includes any known workarounds, along with a link to the GitHub issue (if applicable). We welcome any comments or proposed solutions. + +For more information about an issue, contact us on the [forums](http://forums.mbed.com). + +## Additional information + +For further information regarding this release please refer to the release notes referenced above. + +# Known issues + +## mbed Client API does not support float data type +* **Description**: mbed Client API doesn't work correctly with float data type, as it is disabled in the FRDM target configuration. +* **Workaround**: No workaround at the moment. There will be a fix for target-mbed-gcc soon, which will enable float data type usage. +* **Reported Issue**: ARM internal reference IOTCLT-649 +* **Priority**: Critical + +## mbed-trace module has a missing test dependency on Linux and Windows build targets. +* **Description**: The mbed-trace library has a test-dependency on cpputest, which is not yet available in the yotta registry. Since you can't download this dependency, "yt test" for mbed-trace will fail. +* **Workaround**: No workaround available. +* **Reported Issue**: ARM internal reference IOTCLT-650 +* **Priority**: Critical + +## mbed Client API may not be fully interoperable with other LWM2M servers. +* **Description**: mbed Client API is OMA LWM2M compatible. However, some features may not be fully interoperable against other open source LWM2M servers. +* **Workaround**: mbed Client is compatible with mbed Device Connector Service, which can be tested at [https://connector.mbed.com](https://connector.mbed.com). +* **Reported Issue**: ARM internal reference IOTCLT-366 +* **Priority**: Major + +## mbed Client example application may drop off from Connector if kept running for a long duration. +* **Description**: mbed Client example application sometimes drops off from Connector after a few hours. This may happen when mbed Client is kept running for long durations (over 24 hours) - it occasionally goes offline due to unstable network conditions, and doesn't send periodic updates to Connector. +* **Workaround**: Set the periodic lifetime value to less than 15 minutes if you want to run stability tests. Also, implement a network error handling mechanism on the application side, to handle error() callbacks received from the mbed-client library. +* **Reported Issue**: [https://github.com/ARMmbed/mbed-client-examples/issues/52](https://github.com/ARMmbed/mbed-client-examples/issues/52) +* **Priority**: Major +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/mbed_Client_Release_Note_16_03.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,79 @@ + +# Release note for mbed Client 16.03 + +mbed Client is an OS-agnostic embedded software library that provides the means to connect and manage constrained embedded devices to web applications through mbed Device Server. + +## Release summary + +This is an iterative release of mbed Client, which is available for mbed OS as well as for Ubuntu-like Linux distributions. Weâre continuously maturing mbed Client and adding new features to mbed Client.. This release builds on the Technology Preview 15.11 release through the introduction of new APIs, enhanced functionalities and bug fixes. +## Collaboration +Weâre building mbed Client as a collaborative project, bringing together industry and open source community contributions. If youâd like to work on mbed Client with us, weâd encourage you [to pitch in](https://github.com/ARMmbed/mbed-os/blob/master/CONTRIBUTING.md). With this technology preview weâre ready to start receiving contributions back from the community. +## Documentation +To get started with mbed Client, please visit our [getting started guide](https://docs.mbed.com/docs/mbed-client-guide/en/latest/). +# Changes since last release + +## New APIs and functions + +* New APIs: + * Setting the max-age of a resource value. See [https://tools.ietf.org/html/draft-ietf-core-coap-09#section-5.10.6](https://tools.ietf.org/html/draft-ietf-core-coap-09#section-5.10.6). + * Omitting registered resources' URI path from the registration message's body (which is sent from the client to the server). + * Allowing the client to send a delayed response to POST requests. See [https://tools.ietf.org/html/draft-ietf-core-coap-09#section-5.2.2](https://tools.ietf.org/html/draft-ietf-core-coap-09#section-5.2.2). + * Getting Object and Object Instance information from Resource Object. +* Added a new class for handling arguments received from POST method for Resource. +* Enabled CoAP Blockwise payload handling by client. See [https://tools.ietf.org/html/draft-ietf-core-block-08#section-2](https://tools.ietf.org/html/draft-ietf-core-block-08#section-2). +* Added support for handling observation cancellation through a RESET message from Device Connector Server. +* Disabled Bootstrap API functionality from source code. + +## Bug fixes + +1. Multiple fixes related to Object, Object Instance and Resource Observation. +2. Multiple fixes related to Write Attributes parameter handling for Object, Object Instance and Resource. +3. Multiple fixes for creating and deleting object instances. +4. Fixes related to sending notifications from multiple resource levels. +5. Fixing memory leaks. +6. Fixing mbed Client IPv6 connectivity for Linux. +7. Memory handling in the ``m2mstring`` class. +8. Fix for preventing the client from sending multiple confirmable messages on mbed OS. + +# Modules versions + +mbed Client is available as part of mbed OS or as a standalone component for Ubuntu-like Linux distributions. + +The yotta modules & versions released for these different product configurations are listed below. + +mbed Client as part of mbed OS: + +1. mbed-client-quickstart (example) +1. mbed-client - 1.6.x +1. mbed-client-c - 2.2.x +1. nanostack-libservice - 3.1.x +1. mbed-client-mbedtls - 1.0.x +1. mbedtls - 2.2.0 +1. mbed-client-mbed-os - 1.1.x +1. mbed-client-examples +1. target-frdm-k64f-gcc - 2.0.0 + + +mbed Client as a standalone distribution for Ubuntu-like Linux distributions: + +1. mbed-client-linux-example +1. mbed-client - 1.6.x +1. mbed-client-c - 2.2.x +1. nanostack-libservice - 3.1.x +1. mbed-client-mbedtls - 1.0.x +1. mbedtls - 2.2.0 +1. mbed-client-linux - 1.1.x +1. target-x86-linux-native - 1.0.0 +1. target-linux-native - 1.0.0 + + +### Known issues + +The known issues list for this release is available as [a separate document](Known_Issues.md) + +### Other ways of accessing this release + + +We prefer that you access and collaborate with mbed Client online. However, the release may also be downloaded as a [tar archive file](https://mbed-media.mbed.com/filer_public/7b/75/7b75d9fe-bf15-4818-b959-c54e11e767af/mbed-client-1603.zip). + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/porting-guide.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,558 @@ +<span class="notes">**Note:** To port mbed Client, you need to [install yotta and its dependencies](https://github.com/ARMmbed/yotta/blob/master/docs/index.md).</span> + +# mbed Client structure and build process + +<span class="tips">**Tip:** Before embarking on your own port, you should build the core mbed Client for an existing compilation target to get an understanding of how the mbed Client builds.</span> + +mbed Client is structured as a set of modules. Each module declares which other modules it depends on. When you build a module, our build system `yotta` looks at these dependencies and installs the necessary modules before completing the build. + +This is also the process to build applications for the mbed Client (including the example application in the release). The application declares dependencies on the mbed Client and when it is built, `yotta` ensures that the modules (and anything that they depend on, recursively) are present before building. + +In general, `yotta` downloads and installs the necessary modules over the internet from the public yotta Registry (which saves published versions of modules) or from a specified source control URL. + +# Components of mbed Client + +## Component software modules + +mbed Client consists of one main component. More major components will be added in future development phases: + + * `mbed-client` is the core mbed Client, providing C++ APIs for the mbed Client. + +This module depends on further internal modules: + +``` +mbed-client x.x.x +| +|_mbed-client-c x.x.x +| |_mbed-client-libservice x.x.x +| +|_mbed-client-linux x.x.x +``` + +To list the dependency trees, use the [`yotta list --all` command](http://docs.yottabuild.org/reference/commands.html). + +<span class="notes">**Note**: In this case, we have listed the dependencies for the `x86-linux-native` compilation target. Different modules are needed for different compilation targets.</span> + +We are using the [mbed Client Linux example](https://github.com/ARMmbed/mbed-client-linux-example) in this document. You can see that it depends directly only on the `mbed-client` and `mbed-client-linux` modules. These modules depend internally on various other modules. + +``` +mbed-client-linux-example x.x.x +| +|_mbed-client x.x.x + | + |_mbed-client-c x.x.x + | |_mbed-client-libservice x.x.x + | + |_mbed-client-linux x.x.x +``` + +## Compilation targets + +To compile for a target board, you need a [target description](http://docs.yottabuild.org/tutorial/targets.html) that describes how to compile for the target. + +The `mbed-client` module uses the platform name that each target defines to choose which `mbed-client-<platform-name>` module to depend on to provide the platform-specific implementation. + +# Porting mbed Client to a different platform + +To port mbed Client to a new platform: + + 1. [Request for a development repository](#requesting-for-a-development-repository). + 2. [Create a yotta compilation target for your board](#creating-a-yotta-compilation-target). + 3. [Implement the `mbed-client-xxx` module for your target platform](#implementing-mbed-client-xxx). + 4. [Modify the `module.json` of the `mbed-client` module](#modifying-the-json-file-in-the-mbed-client-module). + 5. [Verify that your implementation is correct](#testing-and-verification). + +The `yotta` build system is designed for easy reuse of generic modules. If you intend to support multiple platforms that share common features, we recommend moving the common functionality into a separate module and use it for each platform. + +## Requesting for a development repository + +We provide private git repositories to our partners porting mbed Client. Only the members of the mbed Client team and relevant partner contacts and engineers have access to these repositories. + +When you contact `support@mbed.org`, a repository will be created for your module. You also need to provide the target description of your board as follows: + +- **`mbed-client-<platform-name>`** is the module that provides the `mbed-client-xxx` implementation for your platform. You may choose to split it into further modules in the future, to enable sharing of code, but we recommend that you implement the port for your first board in this module itself. + +- **`target-<targetname>`** contains the yotta target description of the target you are porting to. This is usually your platform name. + +## Creating a yotta compilation target + +An example on compiling for linux target can be found in the `yotta_targets` directory of [the example application] (https://github.com/ARMmbed/mbed-client-linux-example). + +Please, refer to the [yotta documentation](http://yottadocs.mbed.com/tutorial/targets.html) for setting up your compilation target. + +1.To make your target available locally (without publishing it), you use the `yotta link-target` command to link it into the global install targets directory: + +``` +# in the directory of your target: +yotta link-target +``` + +2.Use `yotta link-target <targetname>` command to make the globally linked target available when compiling another module. + +3.Use the `yotta target <targetname>` command to select your target for the compilation. + +## Implementing mbed-client-xxx + +Clone your `mbed-client-<your-platform-name>` module and `mbed-client` modules from GitHub. + +The `mbed-client-<your-platform-name>` module needs to provide a socket and timer implementation for your target platform. The `mbed-client-xxx` module should include files `m2mconnectionhandler.h`and `m2mtimer.h` from `mbed-client` and implement a corresponding `.cpp` file that points to the platform-specific private implementations of the timer and the socket. + +<span class="notes">**Note**: Private implementation classes **must** be named as `M2MConnectionHandlerPimpl` and `M2MTimerPimpl`, because of forward declarations.</span> + +An example of mbed-client-platform: + +``` +|_module.json +| +|_mbed-client-platform +| |_m2mconnectionhandlerpimpl.h +| |_m2mtimerpimpl.h +| +|_source + |_m2mconnectionhandler.cpp + |_m2mconnectionhandlerpimpl.cpp + |_m2mtimer.cpp + |_m2mtimerpimpl.cpp +``` + +To make your module available to other modules that you want to build, you need to use the [`yotta link`](http://docs.yottabuild.org/reference/commands.html#yotta-link) command to link it to the module where you want to test it out. + +For example, to use your local your in-development mbed-client implementation, use the command `yotta link mbed-client-xxx` in the main `mbed-client` module. + +``` +# in mbed-client, link your module: +yotta link mbed-client-xxx +``` + +You can also just commit and push your untested code to GitHub, but it is always a good idea to test before committing. + +Your `mbed-client-xxx` module must provide a platform-specific implementation for the mbed-client. The APIs that need porting are defined in the `mbed-client-linux` module. The header files contain documentation alongside the declaration of each function, where the function is described along with its parameters and return value. + +There are two header files that require porting for your platform: + +- `m2mconnectionhandler.h` +- `m2mtimer.h` + +To see how this is done in Linux, check the `mbed-client-linux` module from the mbed [Client Linux Example](https://github.com/ARMmbed/mbed-client-linux-example). + +### Implementing the M2MConnectionHandler class for your platform + +``` +/* + * Copyright (c) 2015 ARM. All rights reserved. + */ +#ifndef M2M_CONNECTION_HANDLER_H__ +#define M2M_CONNECTION_HANDLER_H__ + +#include "mbed-client/m2mconfig.h" +#include "mbed-client/m2minterface.h" +#include "mbed-client/m2mconnectionobserver.h" +#include "nsdl-c/sn_nsdl.h" + +/** + * \brief M2MConnectionHandler. + * This class handles the socket connection for the LWM2M Client. + */ + +class M2MConnectionHandler { +public: + + /** + * @enum ConnectionError + * This enum defines an error that can come from + * socket read and write operation. + */ + typedef enum { + CONNECTION_ERROR_WANTS_READ = -1000, + CONNECTION_ERROR_WANTS_WRITE = -1001, + ERROR_NONE = 0, + SSL_CONNECTION_ERROR, + SOCKET_READ_ERROR, + SOCKET_SEND_ERROR, + SOCKET_ABORT, + DNS_RESOLVING_ERROR, + SSL_HANDSHAKE_ERROR + }ConnectionError; + + +public: + + /** + * \brief Constructor + */ + M2MConnectionHandler(M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack); + + /** + * \brief Destructor + */ + ~M2MConnectionHandler(); + + /** + * \brief This binds the socket connection. + * \param listen_port Port to be listened to for an incoming connection. + * \return True if successful, else false. + */ + bool bind_connection(const uint16_t listen_port); + + /** + * \brief This resolves the server address. Output is + * returned through a callback. + * \param String The server address. + * \param uint16_t The server port. + * \param ServerType The server type to be resolved. + * \param security The M2MSecurity object that determines which + * type of secure connection will be used by the socket. + * \return True if address is valid, else false. + */ + bool resolve_server_address(const String& server_address, + const uint16_t server_port, + M2MConnectionObserver::ServerType server_type, + const M2MSecurity* security); + + /** + * \brief Sends data to the connected server. + * \param data_ptr The data to be sent. + * \param data_len The length of data to be sent. + * \param address_ptr The address structure to which the data needs to be sent. + * \return True if data is sent successfully, else false. + */ + bool send_data(uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr); + + /** + * \brief Listens to the incoming data from a remote server. + * \return True if successful, else false. + */ + bool start_listening_for_data(); + + /** + * \brief Stops listening to the incoming data. + */ + void stop_listening(); + + /** + * \brief Sends directly to the socket. This is used by + * security classes to send the data after it has been encrypted. + * \param buf Buffer to send. + * \param len The length of the buffer. + * \return Number of bytes sent or -1 if failed. + */ + int send_to_socket(const unsigned char *buf, size_t len); + + /** + * \brief Receives directly from the socket. This + * is used by the security classes to receive raw data to be decrypted. + * \param buf Buffer to send. + * \param len The length of the buffer. + * \return Number of bytes read or -1 if failed. + */ + int receive_from_socket(unsigned char *buf, size_t len); + + /** + * \brief Closes the open connection. + */ + void close_connection(); + + /** + * \brief Error handling for DTLS connectivity. + * \param error Error code from the TLS library. + */ + void handle_connection_error(int error); + + /** + * \brief Sets the network interface handler that is used by client to connect + * to a network over IP.. + * \param handler A network interface handler that is used by client to connect. + * This API is optional but provides a mechanism for different platforms to + * manage usage of underlying network interface by client. + */ + void set_platform_network_handler(void *handler = NULL); + + /** + * \brief Claims mutex to prevent thread clashes + * in multithreaded environment. + */ + void claim_mutex(); + + /** + * \brief Releases mutex to prevent thread clashes + * in multithreaded environment. + */ + void release_mutex(); + +private: + + M2MConnectionObserver &_observer; + M2MConnectionHandlerPimpl *_private_impl; + +friend class Test_M2MConnectionHandler; +friend class Test_M2MConnectionHandler_mbed; +friend class Test_M2MConnectionHandler_linux; +friend class M2MConnection_TestObserver; +}; + +#endif //M2M_CONNECTION_HANDLER_H__ + +``` + +Please note that some of these functions are asynchronous in nature and some are expecting a callback from the network. For example, receiving data from a socket needs to be communicated back to `mbed-client` so that the library can act on the data received. The callback comes through the Observer class defined in `M2MConnectionObserver`. + +The file `m2mconnectionobserver.h` is present in `mbed-client`. To see how the callback needs to be called, check the implementation in `m2mconnectionhandlerpimpl.cpp` in `mbed-client-linux`. + +``` +/* + * Copyright (c) 2015 ARM. All rights reserved. + */ +#ifndef M2M_CONNECTION_OBSERVER_H__ +#define M2M_CONNECTION_OBSERVER_H__ + +#include "mbed-client/m2minterface.h" + +/** + * @brief Observer class for informing socket activity to the state machine + */ + +class M2MConnectionObserver +{ + +public : + + /** + * \enum ServerType, Defines the type of the + * server that the client wants to use. + */ + typedef enum { + Bootstrap, + LWM2MServer + }ServerType; + + /** + * \brief The M2MSocketAddress struct. + * Unified container for holding socket address data + * across different platforms. + */ + struct SocketAddress{ + M2MInterface::NetworkStack _stack; + void *_address; + uint8_t _length; + uint16_t _port; + }; + + /** + * \brief Indicates that data is available from socket. + * \param data The data read from the socket. + * \param data_size The length of the data read from the socket. + * \param address The address of the server where the data is coming from. + */ + virtual void data_available(uint8_t* data, + uint16_t data_size, + const M2MConnectionObserver::SocketAddress &address) = 0; + + /** + * \brief Indicates an error occured in socket. + * \param error_code The error code from socket, it cannot be used any further. + * \param retry Indicates whether to re-establish connection. + */ + virtual void socket_error(uint8_t error_code, bool retry = true) = 0; + + /** + * \brief Indicates that the server address resolving is ready. + * \param address The resolved socket address. + * \param server_type The type of the server. + * \param server_port The port of the resolved server address. + */ + virtual void address_ready(const M2MConnectionObserver::SocketAddress &address, + M2MConnectionObserver::ServerType server_type, + const uint16_t server_port) = 0; + + /** + * \brief Indicates that data has been sent successfully. + */ + virtual void data_sent() = 0; +}; + +#endif // M2M_CONNECTION_OBSERVER_H__ + +``` + +### Implementing M2MTimer class for your platform + +This class provides the periodic timer functionality for your platform. + +``` +/* + * Copyright (c) 2015 ARM. All rights reserved. + */ +#ifndef M2M_TIMER_H +#define M2M_TIMER_H + +#include <stdint.h> + +class M2MTimerObserver; +/** + * @brief M2MTimerImpl + * Private implementation class for timer, this can be + * modified based on the board on which mbed Client needs + * to be used. + */ +class M2MTimerImpl +{ +private: + + // Prevents the use of assignment operator + M2MTimer& operator=(const M2MTimer& other); + + // Prevents the use of copy constructor + M2MTimer(const M2MTimer& other); + +public: + + /** + * Constructor. + */ + M2MTimer(M2MTimerObserver& _observer); + + /** + * Destructor. + */ + virtual ~M2MTimer(); + + /** + * Starts timer + * @param interval Timer's interval in milliseconds + * @param single_shot defines if timer is ticked + * once or is it restarted everytime timer expires. + */ + void start_timer(uint64_t interval, bool single_shot = true); + + /** + * @brief Starts timer in DTLS manner. + * @param intermediate_interval Intermediate interval to use, must be smaller than tiotal (usually 1/4 of total). + * @param total_interval Total interval to use, this is the timeout value of a DTLS packet. + * @param type Type of the timer + */ + void start_dtls_timer(uint64_t intermediate_interval, uint64_t total_interval, + M2MTimerObserver::Type type = M2MTimerObserver::Dtls); + + /** + * Stops timer. + * This cancels the ongoing timer. + */ + void stop_timer(); + + /** + * @brief Checks if the intermediate interval has passed. + * @return true if interval has passed, false otherwise. + */ + bool is_intermediate_interval_passed(); + + /** + * @brief Checks if the total interval has passed. + * @return true if interval has passed, false otherwise. + */ + bool is_total_interval_passed(); + +}; + +#endif // M2M_TIMER_H +``` + +The timer API functions are asynchronous in nature and whenever a timer event is available, `mbed-client` is notified, so that the library can act on the _timer expired_ signal. The callback is received through an Observer class defined in `M2MTimerObserver` . + +The file `m2mtimerobserver.h` is present in `mbed-client`. To see how the callback needs to be called, check the implementation in `m2mtimerimpl.cpp` in `mbed-client-linux`. + +``` +/* + * Copyright (c) 2015 ARM. All rights reserved. + */ +#ifndef M2M_TIMER_OBSERVER_H +#define M2M_TIMER_OBSERVER_H + +/** + * Observer class for informing the parent class of the timer expiry. + */ +class M2MTimerObserver +{ +public: + /** + * \enum Defines the types of timer + * that can be created for mbed Client. + */ + typedef enum { + Notdefined, + Registration, + NsdlExecution, + PMinTimer, + PMaxTimer, + Dtls, + QueueSleep, + RetryTimer + }Type; + + /** + * \brief Indicates that the timer has expired. + * \param type The type of the timer that has expired. + */ + virtual void timer_expired(M2MTimerObserver::Type type = + M2MTimerObserver::Notdefined) = 0; +}; + +#endif // M2M_TIMER_OBSERVER_H +``` + +## Modifying the `json` file in the `mbed-client` module + +You need to add your target name to `module.json` so that when you set `yt target <platform>`, yotta can resolve the dependency correctly and link the main library with your module. + +Two platforms, mbed OS and Linux, are already supported. You just need to add your module support after that. + +``` +{ + "name": "mbed-client", + "version": "1.12.0", + "description": "Mbed Client API", + "private": true, + "keywords": [], + "author": "XXX XXX <xxx.xxx@xxx.com>", + "homepage": "https://github.com/ARMmbed/mbed-client", + "licenses": [ + { + "url": "https://spdx.org/licenses/Apache-2.0", + "type": "Apache-2.0" + } + ], + "dependencies": { + "mbed-client-c": "^2.0.0" + }, + "targetDependencies": { + "arm": { + "mbed-client-mbed": "^3.0.0" + }, + "linux": { + "mbed-client-linux": "^3.0.0" + }, + "<your platform as defined in target.json>" : { + "mbed-client-platform": "<published version , can be done later, first link locally as explained in the steps above>" + }, + } +} +``` + +## Testing and verification + +You can build your mbed-client port immediately: + +``` +# use the target we previously made locally available (not necessary if your target has been published): +yotta link-target <yourtargetname> +# build! +yotta build +``` + +A `helloworld-mbedclient` program will be produced inside the `build/<yourtargetname>/test/` directory. This test application may require some changes to compile and run for your platform. Check for compilation errors. If you find any, fix the test application for your testing. + +Follow the `readme` [instructions](https://github.com/ARMmbed/mbed-client-linux-example) of the `mbed-client-linux` example to see what the test application can do.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/docs/release-note-mbed-client-1511.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ +# mbed Client 15.11 Technology Preview Release Note + +This is the first Technology Preview of mbed Client, which is available for mbed OS as well as Linux. Weâre actively working on mbed Client and we expect to make exciting changes in the next six months. Weâre making this technology preview available so you can see the trajectory weâre on. Our focus in this release is on laying the foundation for mbed Client development and collaboration, particularly core tools, technology and testing. + +We expect mbed Client developers to be able to access, build and run example projects and to explore the underlying code. + +## About this release + +Note that this is a technology preview release, which means that this release is not yet suitable for volume production use. The software is still maturing, and a number of things may change, including module names, repository URLs, APIs, header file names and configuration parameters. We'll try to mitigate the impact that these changes have on your code where possible. + +Note that in this release we're changing our version numbering scheme for mbed Client releases, to a calendar-based (year and month YY.MM) scheme. This release (15.11) has previously been called 3.0 in some communications. + +## Collaboration + +Weâre building mbed Client as a collaborative project, bringing together industry and open source community contributions. If youâd like to work on mbed Client with us, weâd encourage you [to pitch in](https://github.com/ARMmbed/mbed-os/blob/master/CONTRIBUTING.md). With this technology preview weâre ready to start receiving contributions back from the community. + +## Documentation + +To get started with mbed Client, please visit our [getting started guide](https://docs.mbed.com/docs/mbed-client-guide/en/latest/). + +## Changes since the last release + +This section documents the changes between this release and the earlier mbed Client Beta (15.09) release. + +This release contains the following new features: +Securely connect to mbed Device Server (mbed DS) over TCP connection through TLS. The supported secure connection includes Certificate mode. We still support non-secure connection mode for fast development and debugging. + +New LWM2M Firmware Object class preview for application development. + +## Known issues + +The known issues for this release are described [on GitHub](https://github.com/ARMmbed/mbed-client/blob/master/docs/known-issues-mbed-client1511.md). + +## Other ways of accessing this release + +We prefer that you access and collaborate with mbed Client online. However, the release may also be downloaded as an archive [on mbed.com](https://www.mbed.com/en/development/software/mbed-client/releases/mbed-client1511/). + +# Module versions in this release + +This release comprises the following yotta modules and their versions: + + +| Module | Version | +|----------------------------------|------------| +| `mbed-client` | 1.2.1 | +| `mbed-client-c` | 1.1.1 | +| `mbed-client-libservice` | 3.0.8 | +| `mbed-client-linux` | 1.1.0 | +| `mbed-client-linux-example` | 1.0.0 | +| `mbedtls` | 2.2.0 | +| `mbed-client-mbed-tls` | 1.0.9 | +| `target-x86-linux-native` | 1.0.0 | +| `target-linux-native` | 1.0.0 | + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/doxygen/mbedclient_doxy Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1850 @@ +# Doxyfile 1.8.2 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = mbed-client + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "mbed Client C++ library" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ../docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 16 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented classes, +# or namespaces to their corresponding documentation. Such a link can be +# prevented in individual cases by by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = YES + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = YES + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 18 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command <command> <input-file>, where <command> is the value of +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../mbed-client + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = */config/* +EXCLUDE_PATTERNS += */docs/* +EXCLUDE_PATTERNS += */doxygen/* +EXCLUDE_PATTERNS += */source/* +EXCLUDE_PATTERNS += */test/* + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> +# Qt Help Project / Custom Filters</a>. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> +# Qt Help Project / Filter Attributes</a>. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 44 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/get_sizes.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +#!/bin/bash +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. + +echo +echo "Build mbed Client API for executable size collection" +echo + +BUILD_TARGET="frdm-k64f-armcc" + +yt target $BUILD_TARGET +yt build + +SIZE_CMD="size --totals" + +OUTPUT_PATH="results/" +OUTPUT_FILE_POSTFIX="_${BUILD_TARGET}_size.txt" + +MAIN_MODULE_NAME="mbed-client" + +# yotta dependencies +YOTTA_DEPS=( + 'cmsis-core' + 'cmsis-core-k64f' + 'core-util' + 'dlmalloc' + 'greentea-client' + 'mbed-client-c' + 'mbed-client-mbed-os' + 'mbed-client-mbedtls' + 'mbed-drivers' + 'mbed-hal' + 'mbed-hal-frdm-k64f' + 'mbed-hal-k64f' + 'mbed-hal-ksdk-mcu' + 'mbedtls' + 'mbed-trace' + 'minar' + 'minar-platform-mbed' + 'nanostack-libservice' + 'sal' + 'sal-driver-lwip-k64f-eth' + 'sal-iface-eth' + 'sal-stack-lwip' + 'sockets' + 'ualloc' + 'uvisor-lib' +) + + +# yotta dummy dependencies, which have different naming +YOTTA_DUMMY_DEPS=( + 'cmsis-core-freescale' + 'compiler-polyfill' + 'mbed-hal-freescale' + 'minar-platform' +) + + +echo "Writing object file size informations to ${OUTPUT_PATH}" + +# the "main" module is in build/<target>/source/<module>.ar +${SIZE_CMD} ./build/${BUILD_TARGET}/source/${MAIN_MODULE_NAME}.ar >${OUTPUT_PATH}${MAIN_MODULE_NAME}${OUTPUT_FILE_POSTFIX} + +# these are the direct deps, found as build/<target>/ym/<module>/source/<module>.ar +for MODULE in "${YOTTA_DEPS[@]}" +do + ${SIZE_CMD} ./build/${BUILD_TARGET}/ym/${MODULE}/source/${MODULE}.ar >${OUTPUT_PATH}${MODULE}${OUTPUT_FILE_POSTFIX} +done + +# dummy libs, which are named with different logic +for MODULE in "${YOTTA_DUMMY_DEPS[@]}" +do + # on paths the "-" char needs to be converted to "_" + MODULE_PATH=${MODULE//-/_} + ${SIZE_CMD} ./build/${BUILD_TARGET}/ym/${MODULE}/yotta_dummy_lib_${MODULE_PATH}/${MODULE}.ar >${OUTPUT_PATH}${MODULE}${OUTPUT_FILE_POSTFIX} +done
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/include_dirs.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +INCLUDE_DIRS := \ + ../ \ + . \ + ../../nsdl-c \ + ../../libService/libService \ + ../../libService/exported-libs/mbed-client-libservice \ + ../../libService \ + ../../mbedtls/include \ + ../lwm2m-client-linux \ + ../lwm2m-client-linux/source \ + ../lwm2m-client-mbedtls \ + source \ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/junit_xsl.xslt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + +<xsl:output encoding="UTF-8" indent="yes" method="html"/> +<xsl:strip-space elements="*"/> + +<xsl:variable name="list" + select="document('index.xml')/list" /> + +<xsl:template match="/"> + <h1> + Unittest report + </h1> + + <p> + <b> + Total tests run <xsl:value-of select="sum(document($list/entry/@name)/testsuite/@tests)"/> + , failures: <xsl:value-of select="sum(document($list/entry/@name)/testsuite/@failures) + sum(document($list/entry/@name)/testsuite/@errors)"/> + </b> + + <xsl:for-each select="document($list/entry/@name)" > + <xsl:apply-templates select="testsuite"/> + </xsl:for-each> + </p> +</xsl:template> + +<xsl:template match="testsuite"> + <h2> + <xsl:value-of select="@name" /> + </h2> + <table border="1" cellSpacing="0" cellPadding="10" > + <tr> + <th>Tests run</th> + <th>Tests failed</th> + <th>Other errors</th> + </tr> + <tr> + <td><xsl:value-of select="@tests"/></td> + <td><xsl:value-of select="@failures"/></td> + <td><xsl:value-of select="@errors"/></td> + </tr> + </table> + <br/> + <table border="1" cellSpacing="0" cellPadding="10" > + <tr> + <th>Tests name</th> + <th>PASS/FAIL</th> + <th>Failing case</th> + <th>Reason</th> + </tr> + <xsl:apply-templates select="testcase"/> + </table> +</xsl:template> + +<xsl:template match="testcase"> + <xsl:choose> + <xsl:when test="failure"> + <tr><td><font color="#FF0000"><xsl:value-of select="@name" /></font></td><xsl:apply-templates select="failure"/></tr> + </xsl:when> + <xsl:when test="error"> + <tr><td><font color="#FF0000"><xsl:value-of select="@name" /></font></td><xsl:apply-templates select="error"/></tr> + </xsl:when> + <xsl:otherwise> + <tr><td><xsl:value-of select="@name" /></td><td><font color="#00FF00">PASS</font></td><td></td><td></td></tr> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="failure"> + <td> + <b><font color="#FF0000">FAIL</font></b> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@message" /> + </font> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@type" /> + </font> + </td> +</xsl:template> + +<xsl:template match="error"> + <td> + <b><font color="#FF0000">FAIL</font></b> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@message" /> + </font> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@type" /> + </font> + </td> +</xsl:template> + +</xsl:stylesheet> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-client-classic/#42f18d977122acd4f5ad9ce141b74304b357dec2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,41 @@ +ab45c556ce14c55261981eb0bf0459c4f7984945 not-for-merge branch 'IAR-fix' of https://github.com/ARMmbed/mbed-client-classic +fb36c255e218812180d6910b921cdb8f9f29d045 not-for-merge branch 'IOTCLT-1077' of https://github.com/ARMmbed/mbed-client-classic +b222048f1fd1ea8e1d9cd8dac022b1d9eb50e09e not-for-merge branch 'IOTCLT-961' of https://github.com/ARMmbed/mbed-client-classic +7c9cab77d88847facc48f2432da4c115142ae4ee not-for-merge branch 'LinuxPort' of https://github.com/ARMmbed/mbed-client-classic +e519ac01ae4584229639655bad454c9a53f778db not-for-merge branch 'assert_change' of https://github.com/ARMmbed/mbed-client-classic +70e13d9c64b2b81705f879315dd17d9a407090a9 not-for-merge branch 'bootstrap-integration' of https://github.com/ARMmbed/mbed-client-classic +26997ff599c1a1fdf65ab11b705956e8c6297a3a not-for-merge branch 'compiler_warning_fix' of https://github.com/ARMmbed/mbed-client-classic +6e0fb21d0d19f302cb315d93c884f9e2de76a06d not-for-merge branch 'config-parameter' of https://github.com/ARMmbed/mbed-client-classic +6b18fbdb7c731d9b09201d39dd55da50214f0b08 not-for-merge branch 'debug-event-counters' of https://github.com/ARMmbed/mbed-client-classic +16d4919e2f0bc4ef1ef52233c2d8eaf14aa6ba41 not-for-merge branch 'define-issue' of https://github.com/ARMmbed/mbed-client-classic +cf688ce91bee9dd6a924e446ad30eee264e3c7ee not-for-merge branch 'error_case_trace_improvements' of https://github.com/ARMmbed/mbed-client-classic +75505242d7ea691a2f5bae09f7f587bb54187591 not-for-merge branch 'fix-non-secure-mode' of https://github.com/ARMmbed/mbed-client-classic +75ef308cd45db5e9a60cb9c7f50446b33101ff13 not-for-merge branch 'fix-traces' of https://github.com/ARMmbed/mbed-client-classic +b095b839c0077c5d948dd0dc3159099aa4577f5c not-for-merge branch 'handshake_continue_event' of https://github.com/ARMmbed/mbed-client-classic +0a925d14ae18c5f984e42159ad52dc3b33462d48 not-for-merge branch 'init' of https://github.com/ARMmbed/mbed-client-classic +07c96080a2842abb53866a069017ccc2edae3dbe not-for-merge branch 'keep-alive' of https://github.com/ARMmbed/mbed-client-classic +4e66929607c3113b41bb9b1a9df9731320b6db3b not-for-merge branch 'master' of https://github.com/ARMmbed/mbed-client-classic +ae10cc5e5ca96267c0cfc4c679021c76294b950d not-for-merge branch 'mbed-cloud-client-rel1.2' of https://github.com/ARMmbed/mbed-client-classic +f0b4fb01df4011c4aee0006faf4f2c2de1354381 not-for-merge branch 'mbed-cloud-client-rel1.2-int' of https://github.com/ARMmbed/mbed-client-classic +d378109ec5cdd633c8fd5490e6fa9d533d821e05 not-for-merge branch 'memory_optimizations' of https://github.com/ARMmbed/mbed-client-classic +e7f378b3e283894f2ebf3fbb3cb381f124286679 not-for-merge branch 'non-thread' of https://github.com/ARMmbed/mbed-client-classic +31381dfcd9d62db5932a76a6b61b810ce61a6aa4 not-for-merge branch 'nsapi_updates' of https://github.com/ARMmbed/mbed-client-classic +5c3874e012ac1ffaa4c0512d5d023b9571c8e21b not-for-merge branch 'pal-port-patch' of https://github.com/ARMmbed/mbed-client-classic +a8b97a97b42d59abb02656795b48bebfc3ddb927 not-for-merge branch 'pal_socket_integration_test' of https://github.com/ARMmbed/mbed-client-classic +73953c6ddf64b8d900fe6b8fa80a2875054acccd not-for-merge branch 'port_rand' of https://github.com/ARMmbed/mbed-client-classic +30e71c3d240de439bacaa29c55c1f035159ddc29 not-for-merge branch 'put-post-fix' of https://github.com/ARMmbed/mbed-client-classic +a1090e9b19afc9edb516856d26991679f286e4b8 not-for-merge branch 'release-fix' of https://github.com/ARMmbed/mbed-client-classic +ae27fff6a4e862cfce3152321c0f90852b8784ba not-for-merge branch 'retry_connect_instead_of_select' of https://github.com/ARMmbed/mbed-client-classic +e81f1a60e94e2b8a7eae5005dffcd1524279ee7e not-for-merge branch 'tcp-fix' of https://github.com/ARMmbed/mbed-client-classic +4c69af1d9ecd22178fe806e9dfb94391638f15a8 not-for-merge branch 'tcp_socket_connect_fix' of https://github.com/ARMmbed/mbed-client-classic +0b23a089039d8b97cdb8bab4ee289e752fa4cf8a not-for-merge branch 'template' of https://github.com/ARMmbed/mbed-client-classic +6b5141649ffb109e5f0a201b0866b6aff795e6d5 not-for-merge branch 'trace_improvements' of https://github.com/ARMmbed/mbed-client-classic +2160016a9320f986fa9734178ec7afdfc921c7bb not-for-merge branch 'unit-tests' of https://github.com/ARMmbed/mbed-client-classic +63fe229f7b63fd52b3894ff9439ee1c7c2f0e1ec not-for-merge tag 'RR1.2.0-RC1' of https://github.com/ARMmbed/mbed-client-classic +c4c0038524da37bf55de4410bd99f93f61ee8cce not-for-merge tag 'RR1.2.0-EA' of https://github.com/ARMmbed/mbed-client-classic +fd8f4a553e6210798a79c12ec679ef82245e66c0 not-for-merge tag 'RR1.2.0-RC10' of https://github.com/ARMmbed/mbed-client-classic +3aea129a6219a6f5e5de233a290b41c834b1308f not-for-merge tag 'RR1.2.0-RC11' of https://github.com/ARMmbed/mbed-client-classic +8f201f52fb88a5abeb9dfd6bc54611c94950917f not-for-merge tag 'RR1.2.0-RC6' of https://github.com/ARMmbed/mbed-client-classic +8857bd7fc1cba550d7e9c73b2f6509b7b95f617e not-for-merge tag 'RR1.2.0-RC7' of https://github.com/ARMmbed/mbed-client-classic +7d7128a44e8b0ba169422dbd6a6e0f67d1320596 not-for-merge tag 'RR1.2.0-RC8' of https://github.com/ARMmbed/mbed-client-classic +835c69fbd88fe0ec8cb1ae57f710699c44c19e99 not-for-merge tag 'RR1.2.0-RC9' of https://github.com/ARMmbed/mbed-client-classic
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +42f18d977122acd4f5ad9ce141b74304b357dec2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +fa36438e956d25ef05677ec49f016a2c9b9a3e99
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/mbed-client-classic/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file mbed-client/mbed-client-classic/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 fa36438e956d25ef05677ec49f016a2c9b9a3e99 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189603 +0000 clone: from https://github.com/ARMmbed/mbed-client-classic/ +fa36438e956d25ef05677ec49f016a2c9b9a3e99 42f18d977122acd4f5ad9ce141b74304b357dec2 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189604 +0000 checkout: moving from master to 42f18d977122acd4f5ad9ce141b74304b357dec2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 fa36438e956d25ef05677ec49f016a2c9b9a3e99 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189603 +0000 clone: from https://github.com/ARMmbed/mbed-client-classic/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 fa36438e956d25ef05677ec49f016a2c9b9a3e99 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189603 +0000 clone: from https://github.com/ARMmbed/mbed-client-classic/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/LinuxPort Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7bc86de5445545204dae6826c8815c69cd12b0db 7c9cab77d88847facc48f2432da4c115142ae4ee www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: forced-update
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/compiler_warning_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 26997ff599c1a1fdf65ab11b705956e8c6297a3a www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/error_case_trace_improvements Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 cf688ce91bee9dd6a924e446ad30eee264e3c7ee www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/fix-non-secure-mode Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 75505242d7ea691a2f5bae09f7f587bb54187591 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/fix-traces Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 75ef308cd45db5e9a60cb9c7f50446b33101ff13 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/handshake_continue_event Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 b095b839c0077c5d948dd0dc3159099aa4577f5c www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +fa36438e956d25ef05677ec49f016a2c9b9a3e99 4e66929607c3113b41bb9b1a9df9731320b6db3b www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/mbed-cloud-client-rel1.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +746902aeb344fc5e89c7aa18a829794476180f7c ae10cc5e5ca96267c0cfc4c679021c76294b950d www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/mbed-cloud-client-rel1.2-int Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 f0b4fb01df4011c4aee0006faf4f2c2de1354381 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/memory_optimizations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 d378109ec5cdd633c8fd5490e6fa9d533d821e05 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/port_rand Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 73953c6ddf64b8d900fe6b8fa80a2875054acccd www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/retry_connect_instead_of_select Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 ae27fff6a4e862cfce3152321c0f90852b8784ba www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/tcp_socket_connect_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4c69af1d9ecd22178fe806e9dfb94391638f15a8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/template Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 0b23a089039d8b97cdb8bab4ee289e752fa4cf8a www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/logs/refs/remotes/origin/trace_improvements Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 6b5141649ffb109e5f0a201b0866b6aff795e6d5 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787095 +0000 fetch --append origin: storing head
Binary file mbed-client/mbed-client-classic/.git/objects/pack/pack-1b732f6aa5b4bd5b2d4ec4495ab1eb2071e35313.idx has changed
Binary file mbed-client/mbed-client-classic/.git/objects/pack/pack-1b732f6aa5b4bd5b2d4ec4495ab1eb2071e35313.pack has changed
Binary file mbed-client/mbed-client-classic/.git/objects/pack/pack-b88e8365e48574f6142ea10357964bc20790987b.idx has changed
Binary file mbed-client/mbed-client-classic/.git/objects/pack/pack-b88e8365e48574f6142ea10357964bc20790987b.pack has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,54 @@ +# pack-refs with: peeled +ab45c556ce14c55261981eb0bf0459c4f7984945 refs/remotes/origin/IAR-fix +fb36c255e218812180d6910b921cdb8f9f29d045 refs/remotes/origin/IOTCLT-1077 +b222048f1fd1ea8e1d9cd8dac022b1d9eb50e09e refs/remotes/origin/IOTCLT-961 +7bc86de5445545204dae6826c8815c69cd12b0db refs/remotes/origin/LinuxPort +e519ac01ae4584229639655bad454c9a53f778db refs/remotes/origin/assert_change +70e13d9c64b2b81705f879315dd17d9a407090a9 refs/remotes/origin/bootstrap-integration +6e0fb21d0d19f302cb315d93c884f9e2de76a06d refs/remotes/origin/config-parameter +6b18fbdb7c731d9b09201d39dd55da50214f0b08 refs/remotes/origin/debug-event-counters +16d4919e2f0bc4ef1ef52233c2d8eaf14aa6ba41 refs/remotes/origin/define-issue +0a925d14ae18c5f984e42159ad52dc3b33462d48 refs/remotes/origin/init +07c96080a2842abb53866a069017ccc2edae3dbe refs/remotes/origin/keep-alive +fa36438e956d25ef05677ec49f016a2c9b9a3e99 refs/remotes/origin/master +746902aeb344fc5e89c7aa18a829794476180f7c refs/remotes/origin/mbed-cloud-client-rel1.2 +e7f378b3e283894f2ebf3fbb3cb381f124286679 refs/remotes/origin/non-thread +31381dfcd9d62db5932a76a6b61b810ce61a6aa4 refs/remotes/origin/nsapi_updates +5c3874e012ac1ffaa4c0512d5d023b9571c8e21b refs/remotes/origin/pal-port-patch +810f7872099cfc992d9e13b60882a15464bf9ef8 refs/remotes/origin/pal_socket +a8b97a97b42d59abb02656795b48bebfc3ddb927 refs/remotes/origin/pal_socket_integration_test +922d2384b02241f444c222b5723724272b1ee5b8 refs/remotes/origin/pal_tls +30e71c3d240de439bacaa29c55c1f035159ddc29 refs/remotes/origin/put-post-fix +a1090e9b19afc9edb516856d26991679f286e4b8 refs/remotes/origin/release-fix +f718cbcf4758f840da50af31054f6a9d2093e441 refs/remotes/origin/remove_include_dependency_on_mbed_os +3fec4d99df86d6336f23ad23c8829fae3f0c929a refs/remotes/origin/status_check_fix +e81f1a60e94e2b8a7eae5005dffcd1524279ee7e refs/remotes/origin/tcp-fix +2160016a9320f986fa9734178ec7afdfc921c7bb refs/remotes/origin/unit-tests +18116b16c5448e2f558f2e12c69658c1a4d3c196 refs/tags/mbed-os-5.0-rc1 +^ea45eac305a9f4bc069b6e0d1cceb0bec8aac78e +b8df6fb864f9de0804616b6057d36075c808f1b5 refs/tags/mbed-os-5.0-rc2 +^6a4dfe61f86121ed249883e58c53e876b0a1a9cd +e552da1e9244f57bac50b778c8fb9d27445867ed refs/tags/mbed-os-5.1.3-rc1 +^e35a2aeb46bf31bfc53a4379441c0eaab72bd902 +085c5a5dcf8bd92d64205edad9dc7a377e7e4227 refs/tags/mbed-os-5.1.4-rc1 +^586e697365999fc7d976afc8360e26e068f264ae +c7ee38fe07cf0151cbc2a305b4fabdeea5f48995 refs/tags/mbedCloudClient-R1.1 +^42f18d977122acd4f5ad9ce141b74304b357dec2 +bbfcd12a9033f16593a7a8c0108dbc4c8faebbce refs/tags/mbedCloudClient-R1.1-RC1 +^42f18d977122acd4f5ad9ce141b74304b357dec2 +2ea6cef1d69babbf1110b748fd16beb5fec72860 refs/tags/mbedCloudClient-R1.1-RC2 +^42f18d977122acd4f5ad9ce141b74304b357dec2 +88e16e8dd081991c0020f8e7e9ec1a12861edcf8 refs/tags/mbedCloudClient-R1.1-RC3 +^42f18d977122acd4f5ad9ce141b74304b357dec2 +8e93b22f86ccb24f40013ee0ba37759847095773 refs/tags/mbedCloudClient-r0.8 +^656f13cd48640bce1f57f042eb2d735ddc48b315 +1ab62d8116a09ebbc23e14224a53ad7157446714 refs/tags/mbedCloudClient-r0.8.1 +^656f13cd48640bce1f57f042eb2d735ddc48b315 +13f415aafaaba8d8a73c087a60001cb2bd0def9d refs/tags/mbedCloudClient-r0.8.2 +^656f13cd48640bce1f57f042eb2d735ddc48b315 +aa7d60e199d16664362ee5ae9440bc99c7d152f3 refs/tags/mbedCloudClient-r1.0 +^656f13cd48640bce1f57f042eb2d735ddc48b315 +f7187bddd5c7a24f19dd3062835be38938219ef3 refs/tags/r0.5-rc4 +^fbfb300d622aaa8ccd0fc5a158f4d327ecf78416 +353075192ef6c7dac6838a62b75557acbd2db081 refs/tags/test_tag +^656f13cd48640bce1f57f042eb2d735ddc48b315
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +fa36438e956d25ef05677ec49f016a2c9b9a3e99
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/LinuxPort Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7c9cab77d88847facc48f2432da4c115142ae4ee
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/compiler_warning_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +26997ff599c1a1fdf65ab11b705956e8c6297a3a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/error_case_trace_improvements Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +cf688ce91bee9dd6a924e446ad30eee264e3c7ee
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/fix-non-secure-mode Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +75505242d7ea691a2f5bae09f7f587bb54187591
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/fix-traces Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +75ef308cd45db5e9a60cb9c7f50446b33101ff13
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/handshake_continue_event Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +b095b839c0077c5d948dd0dc3159099aa4577f5c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4e66929607c3113b41bb9b1a9df9731320b6db3b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/mbed-cloud-client-rel1.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ae10cc5e5ca96267c0cfc4c679021c76294b950d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/mbed-cloud-client-rel1.2-int Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +f0b4fb01df4011c4aee0006faf4f2c2de1354381
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/memory_optimizations Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +d378109ec5cdd633c8fd5490e6fa9d533d821e05
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/port_rand Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +73953c6ddf64b8d900fe6b8fa80a2875054acccd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/retry_connect_instead_of_select Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ae27fff6a4e862cfce3152321c0f90852b8784ba
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/tcp_socket_connect_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4c69af1d9ecd22178fe806e9dfb94391638f15a8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/template Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0b23a089039d8b97cdb8bab4ee289e752fa4cf8a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/remotes/origin/trace_improvements Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +6b5141649ffb109e5f0a201b0866b6aff795e6d5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-EA Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +c4c0038524da37bf55de4410bd99f93f61ee8cce
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-RC1 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +63fe229f7b63fd52b3894ff9439ee1c7c2f0e1ec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-RC10 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +fd8f4a553e6210798a79c12ec679ef82245e66c0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-RC11 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +3aea129a6219a6f5e5de233a290b41c834b1308f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-RC6 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +8f201f52fb88a5abeb9dfd6bc54611c94950917f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-RC7 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +8857bd7fc1cba550d7e9c73b2f6509b7b95f617e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-RC8 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7d7128a44e8b0ba169422dbd6a6e0f67d1320596
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.git/refs/tags/RR1.2.0-RC9 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +835c69fbd88fe0ec8cb1ae57f710699c44c19e99
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/.mbedignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +test/*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/LICENSE Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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 + 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.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/Makefile.test Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,63 @@ +# +# Makefile.test for mbed-client-classic unit tests +# + + +# List of subdirectories to build +TEST_FOLDER := ./test/ +# List of unit test directories for libraries +UNITTESTS := $(sort $(dir $(wildcard $(TEST_FOLDER)*/unittest/*))) +TESTDIRS := $(UNITTESTS:%=build-%) +CLEANTESTDIRS := $(UNITTESTS:%=clean-%) +COVERAGEFILE := ./lcov/coverage.info + +.PHONY: clone +clone: + @rm -rf ./test_modules + @mkdir -p test_modules + @git clone --depth 1 git@github.com:ARMmbed/mbed-os.git ./test_modules/mbed-os + @git clone --depth 1 git@github.com:ARMmbed/mbed-trace.git ./test_modules/mbed-trace + @git clone --depth 1 git@github.com:ARMmbed/sal-stack-nanostack-eventloop.git ./test_modules/sal-stack-nanostack-eventloop + @git clone --depth 1 git@github.com:ARMmbed/nanostack-libservice.git ./test_modules/nanostack-libservice + @git clone --depth 1 git@github.com:ARMmbed/mbed-client-c.git ./test_modules/mbed-client-c + @git clone --depth 1 git@github.com:ARMmbed/mbed-client.git ./test_modules/mbed-client + @git clone --depth 1 git@github.com:ARMmbed/mbed-client-pal.git ./test_modules/mbed-client-pal + +.PHONY: test +test: $(TESTDIRS) + @rm -rf ./lcov + @rm -rf ./coverage + @mkdir -p lcov + @mkdir -p lcov/results + @mkdir coverage + @find ./test -name '*.xml' | xargs cp -t ./lcov/results/ + @rm -f lcov/index.xml + @./xsl_script.sh + @cp junit_xsl.xslt lcov/. + @xsltproc -o lcov/testresults.html lcov/junit_xsl.xslt lcov/index.xml + @rm -f lcov/junit_xsl.xslt + @rm -f lcov/index.xml + @find ./ -name '*.gcno' | xargs cp --backup=numbered -t ./coverage/ + @find ./ -name '*.gcda' | xargs cp --backup=numbered -t ./coverage/ + @gcovr --object-directory ./coverage --exclude-unreachable-branches -e '.*/builds/.*' -e '.*/test/.*' -e '.*/test_modules/.*' -e '.*/stubs/.*' -e '.*/mbed-client-classic/.*' -e '.*/usr/.*' -x -o ./lcov/gcovr.xml + @lcov -d test/. -c -o $(COVERAGEFILE) + @lcov -q -r $(COVERAGEFILE) "/usr*" -o $(COVERAGEFILE) + @lcov -q -r $(COVERAGEFILE) "/test*" -o $(COVERAGEFILE) + @lcov -q -r $(COVERAGEFILE) "/mbed-client-libservice*" -o $(COVERAGEFILE) + @genhtml -q $(COVERAGEFILE) --show-details --output-directory lcov/html + @echo mbed-client-classic module unit tests built + +$(TESTDIRS): + @make -C $(@:build-%=%) + +$(CLEANDIRS): + @make -C $(@:clean-%=%) clean + +$(CLEANTESTDIRS): + @make -C $(@:clean-%=%) clean + +# Extend default clean rule +clean: clean-extra + +clean-extra: $(CLEANDIRS) \ +$(CLEANTESTDIRS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,10 @@ +ARM mbed Client Classic +======================= + +This repository contains ARM mbed Client Classic. You should not use this repo directly. This repo is the mbed +Client team's working area and we publish the official, tested versions as part of [mbed Client](https://github.com/ARMmbed/mbed-client). + +If you want to see an example application - a better starting point would be the [mbed OS example client](https://github.com/ARMmbed/mbed-os-example-client). + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/junit_xsl.xslt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + +<xsl:output encoding="UTF-8" indent="yes" method="html"/> +<xsl:strip-space elements="*"/> + +<xsl:variable name="list" + select="document('index.xml')/list" /> + +<xsl:template match="/"> + <h1> + Unittest report + </h1> + + <p> + <b> + Total tests run <xsl:value-of select="sum(document($list/entry/@name)/testsuite/@tests)"/> + , failures: <xsl:value-of select="sum(document($list/entry/@name)/testsuite/@failures) + sum(document($list/entry/@name)/testsuite/@errors)"/> + </b> + + <xsl:for-each select="document($list/entry/@name)" > + <xsl:apply-templates select="testsuite"/> + </xsl:for-each> + </p> +</xsl:template> + +<xsl:template match="testsuite"> + <h2> + <xsl:value-of select="@name" /> + </h2> + <table border="1" cellSpacing="0" cellPadding="10" > + <tr> + <th>Tests run</th> + <th>Tests failed</th> + <th>Other errors</th> + </tr> + <tr> + <td><xsl:value-of select="@tests"/></td> + <td><xsl:value-of select="@failures"/></td> + <td><xsl:value-of select="@errors"/></td> + </tr> + </table> + <br/> + <table border="1" cellSpacing="0" cellPadding="10" > + <tr> + <th>Tests name</th> + <th>PASS/FAIL</th> + <th>Failing case</th> + <th>Reason</th> + </tr> + <xsl:apply-templates select="testcase"/> + </table> +</xsl:template> + +<xsl:template match="testcase"> + <xsl:choose> + <xsl:when test="failure"> + <tr><td><font color="#FF0000"><xsl:value-of select="@name" /></font></td><xsl:apply-templates select="failure"/></tr> + </xsl:when> + <xsl:when test="error"> + <tr><td><font color="#FF0000"><xsl:value-of select="@name" /></font></td><xsl:apply-templates select="error"/></tr> + </xsl:when> + <xsl:otherwise> + <tr><td><xsl:value-of select="@name" /></td><td><font color="#00FF00">PASS</font></td><td></td><td></td></tr> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="failure"> + <td> + <b><font color="#FF0000">FAIL</font></b> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@message" /> + </font> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@type" /> + </font> + </td> +</xsl:template> + +<xsl:template match="error"> + <td> + <b><font color="#FF0000">FAIL</font></b> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@message" /> + </font> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@type" /> + </font> + </td> +</xsl:template> + +</xsl:stylesheet> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/mbed-client-classic/m2mconnectionhandlerpimpl.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_HANDLER_PIMPL_H__ +#define M2M_CONNECTION_HANDLER_PIMPL_H__ + +#include "ns_types.h" +#include "mbed-client/m2mconfig.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2minterface.h" +#include "mbed-client/m2mconnectionobserver.h" +#include "mbed-client/m2mconnectionsecurity.h" +#include "nsdl-c/sn_nsdl.h" + +#include "pal_network.h" + + +class M2MConnectionSecurity; +class M2MConnectionHandler; +class M2MSecurity; + +/** + * @brief M2MConnectionHandlerPimpl. + * This class handles the socket connection for LWM2M Client + */ + + +class M2MConnectionHandlerPimpl { +public: + + enum SocketEvent { + ESocketIdle = 0x00, + ESocketReadytoRead = 0x02, + ESocketDnsHandler = 0x04, + ESocketSend = 0x08 + }; + + struct TaskIdentifier { + M2MConnectionHandlerPimpl *pimpl; + void *data_ptr; + }; + + /** + * @brief Constructor + */ + M2MConnectionHandlerPimpl(M2MConnectionHandler* base, M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack); + + /** + * @brief Destructor + */ + ~M2MConnectionHandlerPimpl(); + + void start_timer(void); + + /** + * @brief This binds the socket connection. + * @param listen_port Port to listen for incoming connection. + * @return true if successful else false. + */ + bool bind_connection(const uint16_t listen_port); + + /** + * @brief This resolves the server address. Output is + * returned through callback + * @param String server address. + * @param uint16_t Server port. + * @param ServerType, Server Type to be resolved. + * @return true if address is valid else false. + */ + bool resolve_server_address(const String& server_address, + const uint16_t server_port, + M2MConnectionObserver::ServerType server_type, + const M2MSecurity* security); + + /** + * @brief Sends data, to the connected sent to server. + * @param data, Data to be sent. + */ + bool send_data(uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr); + + /** + * @brief Listens for incoming data from remote server + * @return true if successful else false. + */ + bool start_listening_for_data(); + + /** + * @brief Stops listening for incoming data + */ + void stop_listening(); + + /** + * @brief send_to_socket Sends directly to socket. This is used by + * security classes to send after data has been encrypted. + * @param buf Buffer to send + * @param len Length of a buffer + * @return Number of bytes sent or -1 if failed + */ + int send_to_socket(const unsigned char *buf, size_t len); + + /** + * \brief Receives directly from the socket. This + * is used by the security classes to receive raw data to be decrypted. + * \param buf Buffer to send. + * \param len The length of the buffer. + * \param timeout Timeout defined from DTLS to wait for blocking receive calls + * before timing out, by default value is 0. + * \return Number of bytes read or negative number if failed. + */ + int receive_from_socket(unsigned char *buf, size_t len); + + /** + * @brief Error handling for DTLS connectivity. + * @param error, Error code from TLS library + */ + void handle_connection_error(int error); + + /** + * \brief Sets the network interface handler that is used by client to connect + * to a network over IP.. + * \param handler A network interface handler that is used by client to connect. + * This API is optional but provides a mechanism for different platforms to + * manage usage of underlying network interface by client. + */ + void set_platform_network_handler(void *handler = NULL); + + /** + * \brief Claims mutex to prevent thread clashes + * in multithreaded environment. + */ + void claim_mutex(); + + /** + * \brief Releases mutex to prevent thread clashes + * in multithreaded environment. + */ + void release_mutex(); + + /** + * @brief Callback handler for sending data over socket. + */ + void send_handler(); + + /** + * @brief Callback handler for receiving data over socket. + */ + void receive_handler(); + + /** + * @brief Callback handler for receiving data for secured connection. + */ + void receive_handshake_handler(); + + /** + * @brief Returns true if DTLS handshake is still ongoing. + */ + bool is_handshake_ongoing(); + + /** + * @brief Returns connection handler tasklet ID. + */ + int8_t connection_tasklet_handler(); + + /** + * @brief Handles DNS resolving through event loop. + */ + void dns_handler(); + + /** + * @brief Sends data to socket through event loop. + */ + void send_socket_data(uint8_t *data, uint16_t data_len); + + void send_receive_event(void); + + +private: + + /** + * @brief Callback handler for socket events. + */ + void socket_event(); + + /** + * @brief Initialize mbed OS socket + */ + bool init_socket(); + + /** + * @brief Check socket type + * @return True if TCP connection otherwise false + */ + bool is_tcp_connection(); + + /** + * @brief Close and delete socket + */ + void close_socket(); + + /** + * @brief Enables keepalive for TCP connections. + */ + void enable_keepalive(); + +private: + M2MConnectionHandler *_base; + M2MConnectionObserver &_observer; + M2MConnectionSecurity *_security_impl; //owned + const M2MSecurity *_security; //non-owned + bool _use_secure_connection; + M2MInterface::BindingMode _binding_mode; + M2MInterface::NetworkStack _network_stack; + M2MConnectionObserver::SocketAddress _address; + + // _address._address will point to one of these two + palIpV4Addr_t _ipV4Addr; + palIpV6Addr_t _ipV6Addr; + + palSocket_t _socket; + bool _is_handshaking; + bool _listening; + M2MConnectionObserver::ServerType _server_type; + uint16_t _server_port; + uint16_t _listen_port; + bool _running; + unsigned char _recv_buffer[BUFFER_LENGTH]; + uint32_t _net_iface; + palSocketAddress_t _socket_address; + static int8_t _tasklet_id; + String _server_address; + +friend class Test_M2MConnectionHandlerPimpl; +friend class Test_M2MConnectionHandlerPimpl_mbed; +friend class Test_M2MConnectionHandlerPimpl_classic; +friend class M2MConnection_TestObserver; +}; + +#endif //M2M_CONNECTION_HANDLER_PIMPL_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/mbed-client-classic/m2mtimerpimpl.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef M2M_TIMER_PIMPL_H__ +#define M2M_TIMER_PIMPL_H__ + +#include "ns_types.h" +#include "mbed-client/m2mtimerobserver.h" + +class M2MTimerPimpl { +private: + + // Prevents the use of assignment operator + M2MTimerPimpl& operator=(const M2MTimerPimpl& other); + + // Prevents the use of copy constructor + M2MTimerPimpl(const M2MTimerPimpl& other); +public: + + /** + * Constructor. + */ + M2MTimerPimpl(M2MTimerObserver& _observer); + + /** + * Destructor. + */ + virtual ~M2MTimerPimpl(); + + /** + * Starts timer + * @param interval Timer's interval in milliseconds + * @param single_shot defines if timer is ticked + * once or is it restarted everytime timer is expired. + */ + void start_timer(uint64_t interval, M2MTimerObserver::Type type, bool single_shot = true); + + /** + * @brief Starts timer in DTLS manner + * @param intermediate_interval Intermediate interval to use, must be smaller than tiotal (usually 1/4 of total) + * @param total_interval Total interval to use; This is the timeout value of a DTLS packet + * @param type Type of the timer + */ + void start_dtls_timer(uint64_t intermediate_interval, uint64_t total_interval, M2MTimerObserver::Type type); + + /** + * Stops timer. + * This cancels the ongoing timer. + */ + void stop_timer(); + + /** + * Callback function for timer completion. + */ + void timer_expired(); + + /** + * @brief Checks if the intermediate interval has passed + * @return true if interval has passed, false otherwise + */ + bool is_intermediate_interval_passed(); + + /** + * @brief Checks if the total interval has passed + * @return true if interval has passed, false otherwise + */ + bool is_total_interval_passed(); + + /** + * @brief Start long period timer + */ + void start_still_left_timer(); + + /** + * @brief Get timer id + * @return Timer id + */ + inline int8_t get_timer_id() const; + + /** + * @brief Get still left time + * @return Time left in milliseconds + */ + uint64_t get_still_left_time() const; + +private: + + void start(); + void cancel(); + +private: + M2MTimerObserver& _observer; + bool _single_shot; + uint64_t _interval; + M2MTimerObserver::Type _type; + + uint64_t _intermediate_interval; + uint64_t _total_interval; + uint64_t _still_left; + uint8_t _status; + bool _dtls_type; + + // this is the timer-id of this object, used to map the + // timer event callback to the correct object. + int8_t _timer_id; + + static int8_t _tasklet_id; + static int8_t _next_timer_id; + + friend class M2MTimer; + friend class Test_M2MTimerPimpl_classic; +}; + +inline int8_t M2MTimerPimpl::get_timer_id() const +{ + return _timer_id; +} + +#endif //M2M_TIMER_PIMPL_H__ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/run_unit_tests_with_valgrind.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/bash +# Execute script with root path where to find binaries. +# For example ./run_unit_tests_with_valgrind.sh ./build/x86-linux-native-coverage/test/mbedclient/ + +input="binaries.txt" +valgrind_logs="valgrind_logs" +rm -rf $valgrind_logs +mkdir $valgrind_logs +find $1 -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print > $input +while file= read -r binary +do + valgrind --track-origins=yes --xml=yes --xml-file="${valgrind_logs}/valgrind_$(basename $binary).xml" "$binary" + +done < "$input" \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/source/m2mconnectionhandler.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client-classic/m2mconnectionhandlerpimpl.h" +#include "mbed-client/m2mconnectionobserver.h" +#include "mbed-client/m2mconnectionhandler.h" +#include "mbed-client/m2mconstants.h" + +M2MConnectionHandler::M2MConnectionHandler(M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack) +:_observer(observer) +{ + _private_impl = new M2MConnectionHandlerPimpl(this, observer, sec, mode, stack); +} + +M2MConnectionHandler::~M2MConnectionHandler() +{ + delete _private_impl; +} + +bool M2MConnectionHandler::bind_connection(const uint16_t listen_port) +{ + + return _private_impl->bind_connection(listen_port); +} + +bool M2MConnectionHandler::resolve_server_address(const String& server_address, + const uint16_t server_port, + M2MConnectionObserver::ServerType server_type, + const M2MSecurity* security) +{ + return _private_impl->resolve_server_address(server_address, server_port, + server_type, security); +} + +bool M2MConnectionHandler::start_listening_for_data() +{ + return _private_impl->start_listening_for_data(); +} + +void M2MConnectionHandler::stop_listening() +{ + _private_impl->stop_listening(); +} + +int M2MConnectionHandler::send_to_socket(const unsigned char *buf, size_t len) +{ + return _private_impl->send_to_socket(buf, len); +} + +int M2MConnectionHandler::receive_from_socket(unsigned char *buf, size_t len) +{ + return _private_impl->receive_from_socket(buf, len); +} + +bool M2MConnectionHandler::send_data(uint8_t *data, + uint16_t data_len, + sn_nsdl_addr_s *address) +{ + return _private_impl->send_data(data, data_len, address); +} + +void M2MConnectionHandler::handle_connection_error(int error) +{ + _private_impl->handle_connection_error(error); +} + +void M2MConnectionHandler::set_platform_network_handler(void *handler) +{ + _private_impl->set_platform_network_handler(handler); +} + +void M2MConnectionHandler::claim_mutex() +{ + _private_impl->claim_mutex(); +} + +void M2MConnectionHandler::release_mutex() +{ + _private_impl->release_mutex(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/source/m2mconnectionhandlerpimpl.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,640 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client-classic/m2mconnectionhandlerpimpl.h" +#include "mbed-client/m2mconnectionobserver.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2msecurity.h" +#include "mbed-client/m2mconnectionhandler.h" + +#include "pal.h" +#include "pal_rtos.h" +#include "pal_errors.h" +#include "pal_macros.h" +#include "pal_network.h" + +#include "eventOS_scheduler.h" +#include "eventOS_event.h" + +#include "mbed-trace/mbed_trace.h" +#include "mbed.h" + +#define TRACE_GROUP "mClt" + +int8_t M2MConnectionHandlerPimpl::_tasklet_id = -1; + +static M2MConnectionHandlerPimpl *connection_handler = NULL; + +extern "C" void connection_event_handler(arm_event_s *event) +{ + if(!connection_handler){ + return; + } + + switch(event->event_type){ + case M2MConnectionHandlerPimpl::ESocketReadytoRead: + connection_handler->receive_handler(); + break; + + case M2MConnectionHandlerPimpl::ESocketSend: + connection_handler->send_socket_data((uint8_t*)event->data_ptr, event->event_data); + free(event->data_ptr); + break; + + case M2MConnectionHandlerPimpl::ESocketDnsHandler: + connection_handler->dns_handler(); + break; + + default: + break; + } +} + +void M2MConnectionHandlerPimpl::send_receive_event(void) +{ + arm_event_s event; + event.receiver = M2MConnectionHandlerPimpl::_tasklet_id; + event.sender = 0; + event.event_type = ESocketReadytoRead; + event.data_ptr = NULL; + event.priority = ARM_LIB_HIGH_PRIORITY_EVENT; + eventOS_event_send(&event); +} + +extern "C" void socket_event_handler(void) +{ + if(!connection_handler) { + return; + } + connection_handler->send_receive_event(); +} + +M2MConnectionHandlerPimpl::M2MConnectionHandlerPimpl(M2MConnectionHandler* base, M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack) +:_base(base), + _observer(observer), + _security_impl(sec), + _security(NULL), + _use_secure_connection(false), + _binding_mode(mode), + _network_stack(stack), + _socket(0), + _is_handshaking(false), + _listening(true), + _server_type(M2MConnectionObserver::LWM2MServer), + _server_port(0), + _listen_port(0), + _running(false), + _net_iface(0) +{ +#ifndef PAL_NET_TCP_AND_TLS_SUPPORT + if (is_tcp_connection()) { + tr_error("ConnectionHandler: TCP support not available."); + return; + } +#endif + + if(PAL_SUCCESS != pal_init()){ + tr_error("PAL init failed."); + } + + memset(&_address, 0, sizeof _address); + memset(&_socket_address, 0, sizeof _socket_address); + connection_handler = this; + eventOS_scheduler_mutex_wait(); + if (M2MConnectionHandlerPimpl::_tasklet_id == -1) { + M2MConnectionHandlerPimpl::_tasklet_id = eventOS_event_handler_create(&connection_event_handler, ESocketIdle); + } + eventOS_scheduler_mutex_release(); +} + +M2MConnectionHandlerPimpl::~M2MConnectionHandlerPimpl() +{ + tr_debug("~M2MConnectionHandlerPimpl()"); + stop_listening(); + + close_socket(); + + delete _security_impl; + tr_debug("~M2MConnectionHandlerPimpl() - OUT"); +} + +bool M2MConnectionHandlerPimpl::bind_connection(const uint16_t listen_port) +{ + _listen_port = listen_port; + return true; +} + +bool M2MConnectionHandlerPimpl::resolve_server_address(const String& server_address, + const uint16_t server_port, + M2MConnectionObserver::ServerType server_type, + const M2MSecurity* security) +{ + arm_event_s event; + + tr_debug("resolve_server_address()"); + + _security = security; + _server_port = server_port; + _server_type = server_type; + _server_address = server_address; + + event.receiver = M2MConnectionHandlerPimpl::_tasklet_id; + event.sender = 0; + event.event_type = ESocketDnsHandler; + event.data_ptr = NULL; + event.priority = ARM_LIB_HIGH_PRIORITY_EVENT; + + return !eventOS_event_send(&event); +} + +void M2MConnectionHandlerPimpl::dns_handler() +{ + palStatus_t status; + uint32_t interface_count; + status = pal_getNumberOfNetInterfaces(&interface_count); + if(PAL_SUCCESS != status ) { + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } + if(interface_count <= 0) { + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } + + palSocketLength_t _socket_address_len; + + if(PAL_SUCCESS != pal_getAddressInfo(_server_address.c_str(), &_socket_address, &_socket_address_len)){ + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } + pal_setSockAddrPort(&_socket_address, _server_port); + + if(_network_stack == M2MInterface::LwIP_IPv4 || + _network_stack == M2MInterface::ATWINC_IPv4){ + if(PAL_SUCCESS != pal_getSockAddrIPV4Addr(&_socket_address,_ipV4Addr)){ + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } + + tr_debug("IP Address %s",tr_array(_ipV4Addr, 4)); + + _address._address = (void*)_ipV4Addr; + _address._length = PAL_IPV4_ADDRESS_SIZE; + _address._port = _server_port; + _address._stack = _network_stack; + } + else if(_network_stack == M2MInterface::LwIP_IPv6 || + _network_stack == M2MInterface::Nanostack_IPv6){ + if(PAL_SUCCESS != pal_getSockAddrIPV6Addr(&_socket_address,_ipV6Addr)){ + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } + + tr_debug("IP Address %s",tr_array(_ipV6Addr,sizeof(_ipV6Addr))); + + _address._address = (void*)_ipV6Addr; + _address._length = PAL_IPV6_ADDRESS_SIZE; + _address._port = _server_port; + _address._stack = _network_stack; + } + else { + tr_error("socket config error, %d", (int)_network_stack); + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } + + close_socket(); + if(!init_socket()) { + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } + + if(is_tcp_connection()) { +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + tr_debug("resolve_server_address - Using TCP"); + if (pal_connect(_socket, &_socket_address, sizeof(_socket_address)) != PAL_SUCCESS) { + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; + } +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + } + + _running = true; + + if (_security) { + if (_security->resource_value_int(M2MSecurity::SecurityMode) == M2MSecurity::Certificate || + _security->resource_value_int(M2MSecurity::SecurityMode) == M2MSecurity::Psk) { + if( _security_impl != NULL ){ + _security_impl->reset(); + if (_security_impl->init(_security) == 0) { + _is_handshaking = true; + tr_debug("resolve_server_address - connect DTLS"); + if(_security_impl->start_connecting_non_blocking(_base) < 0 ){ + tr_debug("dns_handler - handshake failed"); + _is_handshaking = false; + _observer.socket_error(M2MConnectionHandler::SSL_CONNECTION_ERROR); + close_socket(); + return; + } + } else { + tr_error("resolve_server_address - init failed"); + _observer.socket_error(M2MConnectionHandler::SSL_CONNECTION_ERROR, false); + close_socket(); + return; + } + } else { + tr_error("dns_handler - sec is null"); + _observer.socket_error(M2MConnectionHandler::SSL_CONNECTION_ERROR, false); + close_socket(); + return; + } + } + } + if(!_is_handshaking) { + enable_keepalive(); + _observer.address_ready(_address, + _server_type, + _address._port); + } +} + +bool M2MConnectionHandlerPimpl::send_data(uint8_t *data, + uint16_t data_len, + sn_nsdl_addr_s *address) +{ + arm_event_s event; + + tr_debug("send_data()"); + if (address == NULL || data == NULL || !data_len || !_running) { + return false; + } + + event.data_ptr = (uint8_t*)malloc(data_len); + if(!event.data_ptr) { + return false; + } + memcpy(event.data_ptr, data, data_len); + + event.receiver = M2MConnectionHandlerPimpl::_tasklet_id; + event.sender = 0; + event.event_type = ESocketSend; + event.event_data = data_len; + event.priority = ARM_LIB_HIGH_PRIORITY_EVENT; + + if (eventOS_event_send(&event) != 0) { + // Event push failed, free the buffer + free(event.data_ptr); + return false; + } + + return true; +} + +void M2MConnectionHandlerPimpl::send_socket_data(uint8_t *data, uint16_t data_len) +{ + size_t sent_len; + bool success = false; + palStatus_t ret = PAL_ERR_GENERIC_FAILURE; + + if(!data || ! data_len || !_running) { + return; + } + + tr_debug("send_handler()"); + + if( _use_secure_connection ){ + if( _security_impl->send_message(data, data_len) > 0){ + success = true; + } + } else { + if(is_tcp_connection()){ +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + //We need to "shim" the length in front + uint8_t* d = (uint8_t*)malloc(data_len+4); + if(d){ + d[0] = 0; + d[1] = 0; + d[2] = (data_len >> 8 )& 0xff; + d[3] = data_len & 0xff; + memcpy(d + 4, data, data_len); + ret = pal_send(_socket, d, data_len+4, &sent_len); + free(d); + } +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + } else { + ret = pal_sendTo(_socket, data, data_len, &_socket_address, sizeof(_socket_address), &sent_len); + } + if (ret == PAL_SUCCESS) { + success = true; + } + } + + if (!success) { + _observer.socket_error(M2MConnectionHandler::SOCKET_SEND_ERROR, true); + close_socket(); + } + else{ + _observer.data_sent(); + } +} + +bool M2MConnectionHandlerPimpl::start_listening_for_data() +{ + tr_debug("start_listening_for_data()"); + _listening = true; + return true; +} + +void M2MConnectionHandlerPimpl::stop_listening() +{ + tr_debug("stop_listening()"); + _listening = false; + + if(_security_impl) { + _security_impl->reset(); + } +} + +int M2MConnectionHandlerPimpl::send_to_socket(const unsigned char *buf, size_t len) +{ + size_t sent_len = 0; + palStatus_t status = PAL_ERR_GENERIC_FAILURE; + + if(!_running) { + return (-1); + } + + tr_debug("send_to_socket len - %d", len); + + if(is_tcp_connection()) { +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + status = pal_send(_socket, buf, len, &sent_len); +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + } else { + status = pal_sendTo(_socket, buf, len, &_socket_address, sizeof(_socket_address), &sent_len); + } + + if(status == PAL_SUCCESS){ + return sent_len; + } + + return (-1); +} + +int M2MConnectionHandlerPimpl::receive_from_socket(unsigned char *buf, size_t len) +{ + size_t recv_len; + palStatus_t status = PAL_ERR_GENERIC_FAILURE; + tr_debug("receive_from_socket"); + + if(!_running) { + return (-1); + } + + if(is_tcp_connection()) { +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + status = pal_recv(_socket, buf, len, &recv_len); +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + } else { + status = pal_receiveFrom(_socket, buf, len, NULL, NULL, &recv_len); + } + + if(status == PAL_SUCCESS){ + return recv_len; + } + else if(status == PAL_ERR_SOCKET_WOULD_BLOCK || status == (-65536)){ + return M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + } + else { + tr_info("PAL Socket returned: %d", status); + } + + return (-1); +} + +void M2MConnectionHandlerPimpl::handle_connection_error(int error) +{ + tr_debug("handle_connection_error"); + _observer.socket_error(error); +} + +void M2MConnectionHandlerPimpl::set_platform_network_handler(void *handler) +{ + tr_debug("set_platform_network_handler"); + if(PAL_SUCCESS != pal_registerNetworkInterface(handler, &_net_iface)) { + tr_error("Interface registration failed."); + } +} + +void M2MConnectionHandlerPimpl::receive_handshake_handler() +{ + tr_debug("receive_handshake_handler()"); + if( _is_handshaking ){ + int ret = _security_impl->continue_connecting(); + tr_debug("ret %d", ret); + if( ret == M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ ){ //We wait for next readable event + tr_debug("We wait for next readable event"); + return; + } else if( ret == 0 ){ + _is_handshaking = false; + _use_secure_connection = true; + enable_keepalive(); + _observer.address_ready(_address, + _server_type, + _server_port); + } else if( ret < 0 ){ + _is_handshaking = false; + _observer.socket_error(M2MConnectionHandler::SSL_CONNECTION_ERROR, true); + close_socket(); + } + } +} + +bool M2MConnectionHandlerPimpl::is_handshake_ongoing() +{ + return _is_handshaking; +} + +void M2MConnectionHandlerPimpl::receive_handler() +{ + tr_debug("receive_handler()"); + if(_is_handshaking){ + receive_handshake_handler(); + return; + } + + if(!_listening || !_running) { + return; + } + + if( _use_secure_connection ){ + int rcv_size; + do{ + rcv_size = _security_impl->read(_recv_buffer, sizeof(_recv_buffer)); + if(rcv_size > 0){ + _observer.data_available((uint8_t*)_recv_buffer, + rcv_size, _address); + } else if (M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ != rcv_size && rcv_size < 0) { + _observer.socket_error(M2MConnectionHandler::SOCKET_READ_ERROR, true); + close_socket(); + return; + } + } while(M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ != rcv_size); + } else{ + size_t recv; + palStatus_t status; + do{ + if(is_tcp_connection()){ +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + status = pal_recv(_socket, _recv_buffer, sizeof(_recv_buffer), &recv); +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + } else{ + status = pal_receiveFrom(_socket, _recv_buffer, sizeof(_recv_buffer), NULL, NULL, &recv); + } + + if(status == PAL_ERR_SOCKET_WOULD_BLOCK){ + return; + } + else if (status != PAL_SUCCESS) { + _observer.socket_error(M2MConnectionHandler::SOCKET_READ_ERROR, true); + close_socket(); + return; + } + + tr_debug("data received, len: %zu", recv); + + if(!is_tcp_connection()){ // Observer for UDP plain mode + _observer.data_available((uint8_t*)_recv_buffer, recv, _address); + } else { +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + if( recv < 4 ){ + _observer.socket_error(M2MConnectionHandler::SOCKET_READ_ERROR, true); + close_socket(); + return; + } + + //We need to "shim" out the length from the front + uint32_t len = (_recv_buffer[0] << 24 & 0xFF000000) + (_recv_buffer[1] << 16 & 0xFF0000); + len += (_recv_buffer[2] << 8 & 0xFF00) + (_recv_buffer[3] & 0xFF); + if(len > 0 && len <= recv - 4) { + // Observer for TCP plain mode + _observer.data_available(_recv_buffer + 4, len, _address); + } +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + } + } while(status != PAL_ERR_SOCKET_WOULD_BLOCK); + } +} + +void M2MConnectionHandlerPimpl::claim_mutex() +{ + eventOS_scheduler_mutex_wait(); +} + +void M2MConnectionHandlerPimpl::release_mutex() +{ + eventOS_scheduler_mutex_release(); +} + +static palNetInterfaceInfo_t interface_info; +static palIpV4Addr_t interface_address4 = {0,0,0,0}; +static palIpV6Addr_t interface_address6 = {0}; + +bool M2MConnectionHandlerPimpl::init_socket() +{ + tr_debug("init_socket - IN"); + _is_handshaking = false; + _running = true; + palSocketType_t socket_type = PAL_SOCK_DGRAM; + palStatus_t status; + palSocketDomain_t domain; + palSocketAddress_t bind_address; + + if(is_tcp_connection()) { +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + socket_type = PAL_SOCK_STREAM; +#else + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return; +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + } + + if(_network_stack == M2MInterface::LwIP_IPv4){ + domain = PAL_AF_INET; + } else if(_network_stack == M2MInterface::LwIP_IPv6){ + domain = PAL_AF_INET6; + } else { + domain = PAL_AF_UNSPEC; + } + + uint32_t interface_count; + pal_getNumberOfNetInterfaces(&interface_count); + tr_debug("Interface count: %d",interface_count); + pal_getNetInterfaceInfo(_net_iface, &interface_info); + tr_debug("Interface name: %s",interface_info.interfaceName); + tr_debug("Interface no: %d", _net_iface); + + tr_debug("init_socket - port %d", _listen_port); + + status = pal_asynchronousSocket(domain, socket_type, 1, _net_iface, &socket_event_handler, &_socket); + + if(PAL_SUCCESS != status) { + _observer.socket_error(M2MConnectionHandler::SOCKET_ABORT); + return false; + } + + if(_network_stack == M2MInterface::LwIP_IPv4){ + pal_setSockAddrIPV4Addr(&bind_address, interface_address4); + } else if(_network_stack == M2MInterface::LwIP_IPv6){ + pal_setSockAddrIPV6Addr(&bind_address, interface_address6); + } + + pal_setSockAddrPort(&bind_address, _listen_port); + pal_bind(_socket, &bind_address, sizeof(bind_address)); + + tr_debug("init_socket - OUT"); + return true; +} + +bool M2MConnectionHandlerPimpl::is_tcp_connection() +{ + return ( _binding_mode == M2MInterface::TCP || + _binding_mode == M2MInterface::TCP_QUEUE ); +} + +void M2MConnectionHandlerPimpl::close_socket() +{ + tr_debug("close_socket() - IN"); + if(_running) { + _running = false; + pal_close(&_socket); + } + tr_debug("close_socket() - OUT"); +} + +void M2MConnectionHandlerPimpl::enable_keepalive() +{ +#if MBED_CLIENT_TCP_KEEPALIVE_TIME +#ifdef PAL_NET_TCP_AND_TLS_SUPPORT + if(is_tcp_connection()) { + int enable = 1; + pal_setSocketOptions(_socket, PAL_SO_KEEPALIVE, &enable, sizeof(enable)); + } +#endif +#endif +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/source/m2mtimer.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mtimer.h" +#include "mbed-client/m2mtimerobserver.h" +#include "mbed-client-classic/m2mtimerpimpl.h" + + +M2MTimer::M2MTimer(M2MTimerObserver& observer) +: _observer(observer) +{ + _private_impl = new M2MTimerPimpl(observer); +} + +M2MTimer::~M2MTimer() +{ + delete _private_impl; + //_private_impl = NULL; +} + +void M2MTimer::start_timer( uint64_t interval, + M2MTimerObserver::Type type, + bool single_shot) +{ + _private_impl->start_timer(interval, + type, + single_shot); +} + +void M2MTimer::start_dtls_timer(uint64_t intermediate_interval, uint64_t total_interval, M2MTimerObserver::Type type){ + _private_impl->start_dtls_timer(intermediate_interval, total_interval, type); +} + +void M2MTimer::stop_timer() +{ + _private_impl->stop_timer(); +} + +bool M2MTimer::is_intermediate_interval_passed(){ + return _private_impl->is_intermediate_interval_passed(); +} + +bool M2MTimer::is_total_interval_passed(){ + return _private_impl->is_total_interval_passed(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/source/m2mtimerpimpl.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2015-2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include <assert.h> +#include <time.h> + +#include "mbed-client-classic/m2mtimerpimpl.h" +#include "mbed-client/m2mtimerobserver.h" +#include "mbed-client/m2mvector.h" + +#include "eventOS_event.h" +#include "eventOS_event_timer.h" +#include "eventOS_scheduler.h" +#include "ns_hal_init.h" + +#define MBED_CLIENT_TIMER_TASKLET_INIT_EVENT 0 // Tasklet init occurs always when generating a tasklet +#define MBED_CLIENT_TIMER_EVENT 10 + +#ifdef MBED_CONF_MBED_CLIENT_EVENT_LOOP_SIZE +#define MBED_CLIENT_EVENT_LOOP_SIZE MBED_CONF_MBED_CLIENT_EVENT_LOOP_SIZE +#else +#define MBED_CLIENT_EVENT_LOOP_SIZE 1024 +#endif + +int8_t M2MTimerPimpl::_tasklet_id = -1; + +int8_t M2MTimerPimpl::_next_timer_id = 1; + +static m2m::Vector<M2MTimerPimpl*> timer_impl_list; + +extern "C" void tasklet_func(arm_event_s *event) +{ + // skip the init event as there will be a timer event after + if (event->event_type == MBED_CLIENT_TIMER_EVENT) { + bool timer_found = false; + eventOS_scheduler_mutex_wait(); + int timer_count = timer_impl_list.size(); + for (int index = 0; index < timer_count; index++) { + M2MTimerPimpl* timer = timer_impl_list[index]; + if (timer->get_timer_id() == event->event_id) { + eventOS_scheduler_mutex_release(); + timer_found = true; + if (timer->get_still_left_time() > 0) { + timer->start_still_left_timer(); + }else { + timer->timer_expired(); + } + break; + } + } + if(!timer_found) { + eventOS_scheduler_mutex_release(); + } + } +} + +M2MTimerPimpl::M2MTimerPimpl(M2MTimerObserver& observer) +: _observer(observer), + _single_shot(true), + _interval(0), + _type(M2MTimerObserver::Notdefined), + _intermediate_interval(0), + _total_interval(0), + _still_left(0), + _status(0), + _dtls_type(false) +{ + ns_hal_init(NULL, MBED_CLIENT_EVENT_LOOP_SIZE, NULL, NULL); + eventOS_scheduler_mutex_wait(); + if (_tasklet_id < 0) { + _tasklet_id = eventOS_event_handler_create(tasklet_func, MBED_CLIENT_TIMER_TASKLET_INIT_EVENT); + assert(_tasklet_id >= 0); + } + + // XXX: this wraps over quite soon + _timer_id = M2MTimerPimpl::_next_timer_id++; + timer_impl_list.push_back(this); + eventOS_scheduler_mutex_release(); +} + +M2MTimerPimpl::~M2MTimerPimpl() +{ + // cancel the timer request, if any is pending + cancel(); + + // there is no turning back, event os does not have eventOS_event_handler_delete() or similar, + // so the tasklet is lost forever. Same goes with timer_impl_list, which leaks now memory. + + // remove the timer from object list + eventOS_scheduler_mutex_wait(); + int timer_count = timer_impl_list.size(); + for (int index = 0; index < timer_count; index++) { + const M2MTimerPimpl* timer = timer_impl_list[index]; + if (timer->get_timer_id() == _timer_id) { + timer_impl_list.erase(index); + break; + } + } + eventOS_scheduler_mutex_release(); +} + +void M2MTimerPimpl::start_timer( uint64_t interval, + M2MTimerObserver::Type type, + bool single_shot) +{ + _dtls_type = false; + _intermediate_interval = 0; + _total_interval = 0; + _status = 0; + _single_shot = single_shot; + _interval = interval; + _type = type; + _still_left = 0; + start(); +} + +void M2MTimerPimpl::start_dtls_timer(uint64_t intermediate_interval, uint64_t total_interval, M2MTimerObserver::Type type) +{ + _dtls_type = true; + _intermediate_interval = intermediate_interval; + _total_interval = total_interval; + _interval = _intermediate_interval; + _status = 0; + _single_shot = false; + _type = type; + start(); +} + +void M2MTimerPimpl::start() +{ + int status; + if(_interval > INT32_MAX) { + _still_left = _interval - INT32_MAX; + status = eventOS_event_timer_request(_timer_id, MBED_CLIENT_TIMER_EVENT, + M2MTimerPimpl::_tasklet_id, + INT32_MAX); + } + else { + status = eventOS_event_timer_request(_timer_id, MBED_CLIENT_TIMER_EVENT, + M2MTimerPimpl::_tasklet_id, + _interval); + } + assert(status == 0); +} + +void M2MTimerPimpl::cancel() +{ + eventOS_event_timer_cancel(_timer_id, M2MTimerPimpl::_tasklet_id); +} + +void M2MTimerPimpl::stop_timer() +{ + _interval = 0; + _single_shot = true; + _still_left = 0; + cancel(); +} + +void M2MTimerPimpl::timer_expired() +{ + _status++; + _observer.timer_expired(_type); + + if ((!_dtls_type) && (!_single_shot)) { + // start next round of periodic timer + start(); + } else if ((_dtls_type) && (!is_total_interval_passed())) { + // if only the intermediate time has passed, we need still wait up to total time + _interval = _total_interval - _intermediate_interval; + start(); + } +} + +bool M2MTimerPimpl::is_intermediate_interval_passed() +{ + if (_status > 0) { + return true; + } + return false; +} + +bool M2MTimerPimpl::is_total_interval_passed() +{ + if (_status > 1) { + return true; + } + return false; +} + +uint64_t M2MTimerPimpl::get_still_left_time() const +{ + return _still_left; +} + +void M2MTimerPimpl::start_still_left_timer() +{ + if (_still_left > 0) { + int status; + if( _still_left > INT32_MAX) { + _still_left = _still_left - INT32_MAX; + status = eventOS_event_timer_request(_timer_id, MBED_CLIENT_TIMER_EVENT, + M2MTimerPimpl::_tasklet_id, + INT32_MAX); + } + else { + status = eventOS_event_timer_request(_timer_id, MBED_CLIENT_TIMER_EVENT, + M2MTimerPimpl::_tasklet_id, + _still_left); + _still_left = 0; + } + assert(status == 0); + } else { + _observer.timer_expired(_type); + if(!_single_shot) { + start_timer(_interval, _type, _single_shot); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,23 @@ +#scan for folders having "Makefile" in them and remove 'this' to prevent loop +ifeq ($(OS),Windows_NT) +all: +clean: +else +DIRS := $(filter-out ./, $(sort $(dir $(shell find . -name 'Makefile')))) + +all: + for dir in $(DIRS); do \ + cd $$dir; make gcov; cd ..;\ + done + +clean: + for dir in $(DIRS); do \ + cd $$dir; make clean; cd ..;\ + done + rm -rf stubs/*gcov stubs/*gcda stubs/*o + rm -rf results/* + rm -rf coverages/* + rm -rf results + rm -rf coverages + +endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/MakefileWorker.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,562 @@ +#--------- +# +# MakefileWorker.mk +# +# Include this helper file in your makefile +# It makes +# A static library +# A test executable +# +# See this example for parameter settings +# examples/Makefile +# +#---------- +# Inputs - these variables describe what to build +# +# INCLUDE_DIRS - Directories used to search for include files. +# This generates a -I for each directory +# SRC_DIRS - Directories containing source file to built into the library +# SRC_FILES - Specific source files to build into library. Helpful when not all code +# in a directory can be built for test (hopefully a temporary situation) +# TEST_SRC_DIRS - Directories containing unit test code build into the unit test runner +# These do not go in a library. They are explicitly included in the test runner +# TEST_SRC_FILES - Specific source files to build into the unit test runner +# These do not go in a library. They are explicitly included in the test runner +# MOCKS_SRC_DIRS - Directories containing mock source files to build into the test runner +# These do not go in a library. They are explicitly included in the test runner +#---------- +# You can adjust these variables to influence how to build the test target +# and where to put and name outputs +# See below to determine defaults +# COMPONENT_NAME - the name of the thing being built +# TEST_TARGET - name the test executable. By default it is +# $(COMPONENT_NAME)_tests +# Helpful if you want 1 > make files in the same directory with different +# executables as output. +# CPPUTEST_HOME - where CppUTest home dir found +# TARGET_PLATFORM - Influences how the outputs are generated by modifying the +# CPPUTEST_OBJS_DIR and CPPUTEST_LIB_DIR to use a sub-directory under the +# normal objs and lib directories. Also modifies where to search for the +# CPPUTEST_LIB to link against. +# CPPUTEST_OBJS_DIR - a directory where o and d files go +# CPPUTEST_LIB_DIR - a directory where libs go +# CPPUTEST_ENABLE_DEBUG - build for debug +# CPPUTEST_USE_MEM_LEAK_DETECTION - Links with overridden new and delete +# CPPUTEST_USE_STD_CPP_LIB - Set to N to keep the standard C++ library out +# of the test harness +# CPPUTEST_USE_GCOV - Turn on coverage analysis +# Clean then build with this flag set to Y, then 'make gcov' +# CPPUTEST_MAPFILE - generate a map file +# CPPUTEST_WARNINGFLAGS - overly picky by default +# OTHER_MAKEFILE_TO_INCLUDE - a hook to use this makefile to make +# other targets. Like CSlim, which is part of fitnesse +# CPPUTEST_USE_VPATH - Use Make's VPATH functionality to support user +# specification of source files and directories that aren't below +# the user's Makefile in the directory tree, like: +# SRC_DIRS += ../../lib/foo +# It defaults to N, and shouldn't be necessary except in the above case. +#---------- +# +# Other flags users can initialize to sneak in their settings +# CPPUTEST_CXXFLAGS - flags for the C++ compiler +# CPPUTEST_CPPFLAGS - flags for the C++ AND C preprocessor +# CPPUTEST_CFLAGS - flags for the C complier +# CPPUTEST_LDFLAGS - Linker flags +#---------- + +# Some behavior is weird on some platforms. Need to discover the platform. + +# Platforms +UNAME_OUTPUT = "$(shell uname -a)" +MACOSX_STR = Darwin +MINGW_STR = MINGW +CYGWIN_STR = CYGWIN +LINUX_STR = Linux +SUNOS_STR = SunOS +UNKNWOWN_OS_STR = Unknown + +# Compilers +CC_VERSION_OUTPUT ="$(shell $(CXX) -v 2>&1)" +CLANG_STR = clang +SUNSTUDIO_CXX_STR = SunStudio + +UNAME_OS = $(UNKNWOWN_OS_STR) + +ifeq ($(findstring $(MINGW_STR),$(UNAME_OUTPUT)),$(MINGW_STR)) + UNAME_OS = $(MINGW_STR) +endif + +ifeq ($(findstring $(CYGWIN_STR),$(UNAME_OUTPUT)),$(CYGWIN_STR)) + UNAME_OS = $(CYGWIN_STR) +endif + +ifeq ($(findstring $(LINUX_STR),$(UNAME_OUTPUT)),$(LINUX_STR)) + UNAME_OS = $(LINUX_STR) +endif + +ifeq ($(findstring $(MACOSX_STR),$(UNAME_OUTPUT)),$(MACOSX_STR)) + UNAME_OS = $(MACOSX_STR) +#lion has a problem with the 'v' part of -a + UNAME_OUTPUT = "$(shell uname -pmnrs)" +endif + +ifeq ($(findstring $(SUNOS_STR),$(UNAME_OUTPUT)),$(SUNOS_STR)) + UNAME_OS = $(SUNOS_STR) + + SUNSTUDIO_CXX_ERR_STR = CC -flags +ifeq ($(findstring $(SUNSTUDIO_CXX_ERR_STR),$(CC_VERSION_OUTPUT)),$(SUNSTUDIO_CXX_ERR_STR)) + CC_VERSION_OUTPUT ="$(shell $(CXX) -V 2>&1)" + COMPILER_NAME = $(SUNSTUDIO_CXX_STR) +endif +endif + +ifeq ($(findstring $(CLANG_STR),$(CC_VERSION_OUTPUT)),$(CLANG_STR)) + COMPILER_NAME = $(CLANG_STR) +endif + +#Kludge for mingw, it does not have cc.exe, but gcc.exe will do +ifeq ($(UNAME_OS),$(MINGW_STR)) + CC := gcc +endif + +#And another kludge. Exception handling in gcc 4.6.2 is broken when linking the +# Standard C++ library as a shared library. Unbelievable. +ifeq ($(UNAME_OS),$(MINGW_STR)) + CPPUTEST_LDFLAGS += -static +endif +ifeq ($(UNAME_OS),$(CYGWIN_STR)) + CPPUTEST_LDFLAGS += -static +endif + + +#Kludge for MacOsX gcc compiler on Darwin9 who can't handle pendantic +ifeq ($(UNAME_OS),$(MACOSX_STR)) +ifeq ($(findstring Version 9,$(UNAME_OUTPUT)),Version 9) + CPPUTEST_PEDANTIC_ERRORS = N +endif +endif + +ifndef COMPONENT_NAME + COMPONENT_NAME = name_this_in_the_makefile +endif + +# Debug on by default +ifndef CPPUTEST_ENABLE_DEBUG + CPPUTEST_ENABLE_DEBUG = Y +endif + +# new and delete for memory leak detection on by default +ifndef CPPUTEST_USE_MEM_LEAK_DETECTION + CPPUTEST_USE_MEM_LEAK_DETECTION = Y +endif + +# Use the standard C library +ifndef CPPUTEST_USE_STD_C_LIB + CPPUTEST_USE_STD_C_LIB = Y +endif + +# Use the standard C++ library +ifndef CPPUTEST_USE_STD_CPP_LIB + CPPUTEST_USE_STD_CPP_LIB = Y +endif + +# Use gcov, off by default +ifndef CPPUTEST_USE_GCOV + CPPUTEST_USE_GCOV = Y +endif + +ifndef CPPUTEST_PEDANTIC_ERRORS + CPPUTEST_PEDANTIC_ERRORS = Y +endif + +# Default warnings +ifndef CPPUTEST_WARNINGFLAGS + CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion +ifeq ($(CPPUTEST_PEDANTIC_ERRORS), Y) +# CPPUTEST_WARNINGFLAGS += -pedantic-errors + CPPUTEST_WARNINGFLAGS += -pedantic +endif +ifeq ($(UNAME_OS),$(LINUX_STR)) + CPPUTEST_WARNINGFLAGS += -Wsign-conversion +endif + CPPUTEST_CXX_WARNINGFLAGS = -Woverloaded-virtual + CPPUTEST_C_WARNINGFLAGS = -Wstrict-prototypes +endif + +#Wonderful extra compiler warnings with clang +ifeq ($(COMPILER_NAME),$(CLANG_STR)) +# -Wno-disabled-macro-expansion -> Have to disable the macro expansion warning as the operator new overload warns on that. +# -Wno-padded -> I sort-of like this warning but if there is a bool at the end of the class, it seems impossible to remove it! (except by making padding explicit) +# -Wno-global-constructors Wno-exit-time-destructors -> Great warnings, but in CppUTest it is impossible to avoid as the automatic test registration depends on the global ctor and dtor +# -Wno-weak-vtables -> The TEST_GROUP macro declares a class and will automatically inline its methods. Thats ok as they are only in one translation unit. Unfortunately, the warning can't detect that, so it must be disabled. + CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables + CPPUTEST_C_WARNINGFLAGS += -Weverything -Wno-padded +endif + +# Uhm. Maybe put some warning flags for SunStudio here? +ifeq ($(COMPILER_NAME),$(SUNSTUDIO_CXX_STR)) + CPPUTEST_CXX_WARNINGFLAGS = + CPPUTEST_C_WARNINGFLAGS = +endif + +# Default dir for temporary files (d, o) +ifndef CPPUTEST_OBJS_DIR +ifndef TARGET_PLATFORM + CPPUTEST_OBJS_DIR = objs +else + CPPUTEST_OBJS_DIR = objs/$(TARGET_PLATFORM) +endif +endif + +# Default dir for the outout library +ifndef CPPUTEST_LIB_DIR +ifndef TARGET_PLATFORM + CPPUTEST_LIB_DIR = lib +else + CPPUTEST_LIB_DIR = lib/$(TARGET_PLATFORM) +endif +endif + +# No map by default +ifndef CPPUTEST_MAP_FILE + CPPUTEST_MAP_FILE = N +endif + +# No extentions is default +ifndef CPPUTEST_USE_EXTENSIONS + CPPUTEST_USE_EXTENSIONS = N +endif + +# No VPATH is default +ifndef CPPUTEST_USE_VPATH + CPPUTEST_USE_VPATH := N +endif +# Make empty, instead of 'N', for usage in $(if ) conditionals +ifneq ($(CPPUTEST_USE_VPATH), Y) + CPPUTEST_USE_VPATH := +endif + +ifndef TARGET_PLATFORM +#CPPUTEST_LIB_LINK_DIR = $(CPPUTEST_HOME)/lib +CPPUTEST_LIB_LINK_DIR = /usr/lib/x86_64-linux-gnu +else +CPPUTEST_LIB_LINK_DIR = $(CPPUTEST_HOME)/lib/$(TARGET_PLATFORM) +endif + +# -------------------------------------- +# derived flags in the following area +# -------------------------------------- + +# Without the C library, we'll need to disable the C++ library and ... +ifeq ($(CPPUTEST_USE_STD_C_LIB), N) + CPPUTEST_USE_STD_CPP_LIB = N + CPPUTEST_USE_MEM_LEAK_DETECTION = N + CPPUTEST_CPPFLAGS += -DCPPUTEST_STD_C_LIB_DISABLED + CPPUTEST_CPPFLAGS += -nostdinc +endif + +CPPUTEST_CPPFLAGS += -DCPPUTEST_COMPILATION + +ifeq ($(CPPUTEST_USE_MEM_LEAK_DETECTION), N) + CPPUTEST_CPPFLAGS += -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED +else + ifndef CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE + CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE = -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorNewMacros.h + endif + ifndef CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE + CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE = -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorMallocMacros.h + endif +endif + +ifeq ($(CPPUTEST_ENABLE_DEBUG), Y) + CPPUTEST_CXXFLAGS += -g + CPPUTEST_CFLAGS += -g + CPPUTEST_LDFLAGS += -g +endif + +ifeq ($(CPPUTEST_USE_STD_CPP_LIB), N) + CPPUTEST_CPPFLAGS += -DCPPUTEST_STD_CPP_LIB_DISABLED +ifeq ($(CPPUTEST_USE_STD_C_LIB), Y) + CPPUTEST_CXXFLAGS += -nostdinc++ +endif +endif + +ifdef $(GMOCK_HOME) + GTEST_HOME = $(GMOCK_HOME)/gtest + CPPUTEST_CPPFLAGS += -I$(GMOCK_HOME)/include + GMOCK_LIBRARY = $(GMOCK_HOME)/lib/.libs/libgmock.a + LD_LIBRARIES += $(GMOCK_LIBRARY) + CPPUTEST_CPPFLAGS += -DINCLUDE_GTEST_TESTS + CPPUTEST_WARNINGFLAGS = + CPPUTEST_CPPFLAGS += -I$(GTEST_HOME)/include -I$(GTEST_HOME) + GTEST_LIBRARY = $(GTEST_HOME)/lib/.libs/libgtest.a + LD_LIBRARIES += $(GTEST_LIBRARY) +endif + + +ifeq ($(CPPUTEST_USE_GCOV), Y) + CPPUTEST_CXXFLAGS += -fprofile-arcs -ftest-coverage + CPPUTEST_CFLAGS += -fprofile-arcs -ftest-coverage +endif + +CPPUTEST_CXXFLAGS += $(CPPUTEST_WARNINGFLAGS) $(CPPUTEST_CXX_WARNINGFLAGS) +CPPUTEST_CPPFLAGS += $(CPPUTEST_WARNINGFLAGS) +CPPUTEST_CXXFLAGS += $(CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE) +CPPUTEST_CPPFLAGS += $(CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE) +CPPUTEST_CFLAGS += $(CPPUTEST_C_WARNINGFLAGS) + +TARGET_MAP = $(COMPONENT_NAME).map.txt +ifeq ($(CPPUTEST_MAP_FILE), Y) + CPPUTEST_LDFLAGS += -Wl,-map,$(TARGET_MAP) +endif + +# Link with CppUTest lib +CPPUTEST_LIB = $(CPPUTEST_LIB_LINK_DIR)/libCppUTest.a + +ifeq ($(CPPUTEST_USE_EXTENSIONS), Y) +CPPUTEST_LIB += $(CPPUTEST_LIB_LINK_DIR)/libCppUTestExt.a +endif + +ifdef CPPUTEST_STATIC_REALTIME + LD_LIBRARIES += -lrt +endif + +TARGET_LIB = \ + $(CPPUTEST_LIB_DIR)/lib$(COMPONENT_NAME).a + +ifndef TEST_TARGET + ifndef TARGET_PLATFORM + TEST_TARGET = $(COMPONENT_NAME)_tests + else + TEST_TARGET = $(COMPONENT_NAME)_$(TARGET_PLATFORM)_tests + endif +endif + +#Helper Functions +get_src_from_dir = $(wildcard $1/*.cpp) $(wildcard $1/*.cc) $(wildcard $1/*.c) +get_dirs_from_dirspec = $(wildcard $1) +get_src_from_dir_list = $(foreach dir, $1, $(call get_src_from_dir,$(dir))) +__src_to = $(subst .c,$1, $(subst .cc,$1, $(subst .cpp,$1,$(if $(CPPUTEST_USE_VPATH),$(notdir $2),$2)))) +src_to = $(addprefix $(CPPUTEST_OBJS_DIR)/,$(call __src_to,$1,$2)) +src_to_o = $(call src_to,.o,$1) +src_to_d = $(call src_to,.d,$1) +src_to_gcda = $(call src_to,.gcda,$1) +src_to_gcno = $(call src_to,.gcno,$1) +time = $(shell date +%s) +delta_t = $(eval minus, $1, $2) +debug_print_list = $(foreach word,$1,echo " $(word)";) echo; + +#Derived +STUFF_TO_CLEAN += $(TEST_TARGET) $(TEST_TARGET).exe $(TARGET_LIB) $(TARGET_MAP) + +SRC += $(call get_src_from_dir_list, $(SRC_DIRS)) $(SRC_FILES) +OBJ = $(call src_to_o,$(SRC)) + +STUFF_TO_CLEAN += $(OBJ) + +TEST_SRC += $(call get_src_from_dir_list, $(TEST_SRC_DIRS)) $(TEST_SRC_FILES) +TEST_OBJS = $(call src_to_o,$(TEST_SRC)) +STUFF_TO_CLEAN += $(TEST_OBJS) + + +MOCKS_SRC += $(call get_src_from_dir_list, $(MOCKS_SRC_DIRS)) +MOCKS_OBJS = $(call src_to_o,$(MOCKS_SRC)) +STUFF_TO_CLEAN += $(MOCKS_OBJS) + +ALL_SRC = $(SRC) $(TEST_SRC) $(MOCKS_SRC) + +# If we're using VPATH +ifeq ($(CPPUTEST_USE_VPATH), Y) +# gather all the source directories and add them + VPATH += $(sort $(dir $(ALL_SRC))) +# Add the component name to the objs dir path, to differentiate between same-name objects + CPPUTEST_OBJS_DIR := $(addsuffix /$(COMPONENT_NAME),$(CPPUTEST_OBJS_DIR)) +endif + +#Test coverage with gcov +GCOV_OUTPUT = gcov_output.txt +GCOV_REPORT = gcov_report.txt +GCOV_ERROR = gcov_error.txt +GCOV_GCDA_FILES = $(call src_to_gcda, $(ALL_SRC)) +GCOV_GCNO_FILES = $(call src_to_gcno, $(ALL_SRC)) +TEST_OUTPUT = $(TEST_TARGET).txt +STUFF_TO_CLEAN += \ + $(GCOV_OUTPUT)\ + $(GCOV_REPORT)\ + $(GCOV_REPORT).html\ + $(GCOV_ERROR)\ + $(GCOV_GCDA_FILES)\ + $(GCOV_GCNO_FILES)\ + $(TEST_OUTPUT) + +#The gcda files for gcov need to be deleted before each run +#To avoid annoying messages. +GCOV_CLEAN = $(SILENCE)rm -f $(GCOV_GCDA_FILES) $(GCOV_OUTPUT) $(GCOV_REPORT) $(GCOV_ERROR) +RUN_TEST_TARGET = $(SILENCE) $(GCOV_CLEAN) ; echo "Running $(TEST_TARGET)"; ./$(TEST_TARGET) $(CPPUTEST_EXE_FLAGS) -ojunit + +ifeq ($(CPPUTEST_USE_GCOV), Y) + + ifeq ($(COMPILER_NAME),$(CLANG_STR)) + LD_LIBRARIES += --coverage + else + LD_LIBRARIES += -lgcov + endif +endif + + +INCLUDES_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(INCLUDE_DIRS)) +INCLUDES += $(foreach dir, $(INCLUDES_DIRS_EXPANDED), -I$(dir)) +MOCK_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(MOCKS_SRC_DIRS)) +INCLUDES += $(foreach dir, $(MOCK_DIRS_EXPANDED), -I$(dir)) + +CPPUTEST_CPPFLAGS += $(INCLUDES) $(CPPUTESTFLAGS) + +DEP_FILES = $(call src_to_d, $(ALL_SRC)) +STUFF_TO_CLEAN += $(DEP_FILES) $(PRODUCTION_CODE_START) $(PRODUCTION_CODE_END) +STUFF_TO_CLEAN += $(STDLIB_CODE_START) $(MAP_FILE) cpputest_*.xml junit_run_output + +# We'll use the CPPUTEST_CFLAGS etc so that you can override AND add to the CppUTest flags +CFLAGS = $(CPPUTEST_CFLAGS) $(CPPUTEST_ADDITIONAL_CFLAGS) +CPPFLAGS = $(CPPUTEST_CPPFLAGS) $(CPPUTEST_ADDITIONAL_CPPFLAGS) +CXXFLAGS = $(CPPUTEST_CXXFLAGS) $(CPPUTEST_ADDITIONAL_CXXFLAGS) +LDFLAGS = $(CPPUTEST_LDFLAGS) $(CPPUTEST_ADDITIONAL_LDFLAGS) + +# Don't consider creating the archive a warning condition that does STDERR output +ARFLAGS := $(ARFLAGS)c + +DEP_FLAGS=-MMD -MP + +# Some macros for programs to be overridden. For some reason, these are not in Make defaults +RANLIB = ranlib + +# Targets + +.PHONY: all +all: start $(TEST_TARGET) + $(RUN_TEST_TARGET) + +.PHONY: start +start: $(TEST_TARGET) + $(SILENCE)START_TIME=$(call time) + +.PHONY: all_no_tests +all_no_tests: $(TEST_TARGET) + +.PHONY: flags +flags: + @echo + @echo "OS ${UNAME_OS}" + @echo "Compile C and C++ source with CPPFLAGS:" + @$(call debug_print_list,$(CPPFLAGS)) + @echo "Compile C++ source with CXXFLAGS:" + @$(call debug_print_list,$(CXXFLAGS)) + @echo "Compile C source with CFLAGS:" + @$(call debug_print_list,$(CFLAGS)) + @echo "Link with LDFLAGS:" + @$(call debug_print_list,$(LDFLAGS)) + @echo "Link with LD_LIBRARIES:" + @$(call debug_print_list,$(LD_LIBRARIES)) + @echo "Create libraries with ARFLAGS:" + @$(call debug_print_list,$(ARFLAGS)) + +TEST_DEPS = $(TEST_OBJS) $(MOCKS_OBJS) $(PRODUCTION_CODE_START) $(TARGET_LIB) $(USER_LIBS) $(PRODUCTION_CODE_END) $(CPPUTEST_LIB) $(STDLIB_CODE_START) +test-deps: $(TEST_DEPS) + +$(TEST_TARGET): $(TEST_DEPS) + @echo Linking $@ + $(SILENCE)$(CXX) -o $@ $^ $(LD_LIBRARIES) $(LDFLAGS) + +$(TARGET_LIB): $(OBJ) + @echo Building archive $@ + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(AR) $(ARFLAGS) $@ $^ + $(SILENCE)$(RANLIB) $@ + +test: $(TEST_TARGET) + $(RUN_TEST_TARGET) | tee $(TEST_OUTPUT) + +vtest: $(TEST_TARGET) + $(RUN_TEST_TARGET) -v | tee $(TEST_OUTPUT) + +$(CPPUTEST_OBJS_DIR)/%.o: %.cc + @echo compiling $(notdir $<) + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + +$(CPPUTEST_OBJS_DIR)/%.o: %.cpp + @echo compiling $(notdir $<) + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + +$(CPPUTEST_OBJS_DIR)/%.o: %.c + @echo compiling $(notdir $<) + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(COMPILE.c) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + +ifneq "$(MAKECMDGOALS)" "clean" +-include $(DEP_FILES) +endif + +.PHONY: clean +clean: + @echo Making clean + $(SILENCE)$(RM) $(STUFF_TO_CLEAN) + $(SILENCE)rm -rf gcov objs #$(CPPUTEST_OBJS_DIR) + $(SILENCE)rm -rf $(CPPUTEST_LIB_DIR) + $(SILENCE)find . -name "*.gcno" | xargs rm -f + $(SILENCE)find . -name "*.gcda" | xargs rm -f + +#realclean gets rid of all gcov, o and d files in the directory tree +#not just the ones made by this makefile +.PHONY: realclean +realclean: clean + $(SILENCE)rm -rf gcov + $(SILENCE)find . -name "*.gdcno" | xargs rm -f + $(SILENCE)find . -name "*.[do]" | xargs rm -f + +gcov: test +ifeq ($(CPPUTEST_USE_VPATH), Y) + $(SILENCE)gcov --object-directory $(CPPUTEST_OBJS_DIR) $(SRC) >> $(GCOV_OUTPUT) 2>> $(GCOV_ERROR) +else + $(SILENCE)for d in $(SRC_DIRS) ; do \ + gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$d $$d/*.c $$d/*.cpp >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ + done + $(SILENCE)for f in $(SRC_FILES) ; do \ + gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$f $$f >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ + done +endif +# $(CPPUTEST_HOME)/scripts/filterGcov.sh $(GCOV_OUTPUT) $(GCOV_ERROR) $(GCOV_REPORT) $(TEST_OUTPUT) + /usr/share/cpputest/scripts/filterGcov.sh $(GCOV_OUTPUT) $(GCOV_ERROR) $(GCOV_REPORT) $(TEST_OUTPUT) + $(SILENCE)cat $(GCOV_REPORT) + $(SILENCE)mkdir -p gcov + $(SILENCE)mv *.gcov gcov + $(SILENCE)mv gcov_* gcov + @echo "See gcov directory for details" + +.PHONEY: format +format: + $(CPPUTEST_HOME)/scripts/reformat.sh $(PROJECT_HOME_DIR) + +.PHONEY: debug +debug: + @echo + @echo "Target Source files:" + @$(call debug_print_list,$(SRC)) + @echo "Target Object files:" + @$(call debug_print_list,$(OBJ)) + @echo "Test Source files:" + @$(call debug_print_list,$(TEST_SRC)) + @echo "Test Object files:" + @$(call debug_print_list,$(TEST_OBJS)) + @echo "Mock Source files:" + @$(call debug_print_list,$(MOCKS_SRC)) + @echo "Mock Object files:" + @$(call debug_print_list,$(MOCKS_OBJS)) + @echo "All Input Dependency files:" + @$(call debug_print_list,$(DEP_FILES)) + @echo Stuff to clean: + @$(call debug_print_list,$(STUFF_TO_CLEAN)) + @echo Includes: + @$(call debug_print_list,$(INCLUDES)) + +-include $(OTHER_MAKEFILE_TO_INCLUDE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/common/alltests.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/common/mbed.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef MBED_H +#define MBED_H + +#include <cstdio> +#include <cstring> + +#endif // MBED_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerimpl_classic/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,16 @@ +include ../makefile_defines.txt + +COMPONENT_NAME = m2mconnectionhandlerimpl_classic_unit +SRC_FILES = \ + ../../../../source/m2mconnectionhandler.cpp \ + +TEST_SRC_FILES = \ + main.cpp \ + m2mconnectionhandlerimpl_classic_test.cpp \ + test_m2mconnectionhandlerimpl_classic.cpp \ + ../stub/m2mconnectionhandlerpimpl_stub.cpp \ + ../stub/m2mconnectionsecurity_stub.cpp \ + ../stub/m2mstring_stub.cpp \ + +include ../MakefileWorker.mk +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerimpl_classic/m2mconnectionhandlerimpl_classic_test.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionhandlerimpl_classic.h" + +TEST_GROUP(M2MConnectionHandler_classic) +{ + Test_M2MConnectionHandler_classic* handler; + + void setup() + { + handler = new Test_M2MConnectionHandler_classic(); + } + void teardown() + { + delete handler; + } +}; + + +TEST(M2MConnectionHandler_classic, create) +{ + CHECK(handler != NULL); +} + +TEST(M2MConnectionHandler_classic, test_bind_connection) +{ + handler->test_bind_connection(); +} + +TEST(M2MConnectionHandler_classic, test_resolve_server_address) +{ + handler->test_resolve_server_address(); +} + +TEST(M2MConnectionHandler_classic, test_start_listening_for_data) +{ + handler->test_start_listening_for_data(); +} + +TEST(M2MConnectionHandler_classic, test_send_data) +{ + handler->test_send_data(); +} + +TEST(M2MConnectionHandler_classic, test_stop_listening) +{ + handler->test_stop_listening(); +} + +TEST(M2MConnectionHandler_classic, test_send_to_socket) +{ + handler->test_send_to_socket(); +} + +TEST(M2MConnectionHandler_classic, test_receive_from_socket) +{ + handler->test_receive_from_socket(); +} + +TEST(M2MConnectionHandler_classic, test_handle_connection_error) +{ + handler->test_handle_connection_error(); +} + +TEST(M2MConnectionHandler_classic, test_set_platform_network_handler) +{ + handler->test_set_platform_network_handler(); +} + +TEST(M2MConnectionHandler_classic, test_claim_mutex) +{ + handler->test_claim_mutex(); +} + +TEST(M2MConnectionHandler_classic, test_release_mutex) +{ + handler->test_release_mutex(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerimpl_classic/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MConnectionHandler_classic);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerimpl_classic/test_m2mconnectionhandlerimpl_classic.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionhandlerimpl_classic.h" +#include "m2mconnectionhandlerpimpl_stub.h" +#include "m2mconnectionobserver.h" + +class M2MConnection_TestObserver : public M2MConnectionObserver { + +public: + M2MConnection_TestObserver(){} + + virtual ~M2MConnection_TestObserver(){} + + void set_class_object(M2MConnectionHandler *impl) {} + void data_available(uint8_t*, + uint16_t, + const M2MConnectionObserver::SocketAddress &){ + dataAvailable = true; + } + + void socket_error(uint8_t error_code, bool retry){error = true;} + + void address_ready(const M2MConnectionObserver::SocketAddress &, + M2MConnectionObserver::ServerType, + const uint16_t){addressReady = true;} + + void data_sent(){dataSent = true;} + + bool dataAvailable; + bool error; + bool addressReady; + bool dataSent; +}; + +Test_M2MConnectionHandler_classic::Test_M2MConnectionHandler_classic() +{ + observer = new M2MConnection_TestObserver(); + handler = new M2MConnectionHandler(*observer, NULL ,M2MInterface::NOT_SET,M2MInterface::Uninitialized); +} + +Test_M2MConnectionHandler_classic::~Test_M2MConnectionHandler_classic() +{ + delete handler; + delete observer; +} + +void Test_M2MConnectionHandler_classic::test_bind_connection() +{ + m2mconnectionhandlerpimpl_stub::bool_value = true; + CHECK( handler->bind_connection(7) == true); +} + +void Test_M2MConnectionHandler_classic::test_resolve_server_address() +{ + m2mconnectionhandlerpimpl_stub::bool_value = true; + CHECK(handler->resolve_server_address("10", 7, M2MConnectionObserver::LWM2MServer, NULL) == true); + + CHECK(handler->resolve_server_address("10", 7, M2MConnectionObserver::LWM2MServer, NULL) == true); + + m2mconnectionhandlerpimpl_stub::bool_value = false; + CHECK(handler->resolve_server_address("10", 7, M2MConnectionObserver::LWM2MServer, NULL) == false); +} + +void Test_M2MConnectionHandler_classic::test_send_data() +{ + sn_nsdl_addr_s* addr = (sn_nsdl_addr_s*)malloc(sizeof(sn_nsdl_addr_s)); + + memset(addr, 0, sizeof(sn_nsdl_addr_s)); + m2mconnectionhandlerpimpl_stub::bool_value = false; + CHECK(false == handler->send_data(NULL, 0 , NULL)); + + m2mconnectionhandlerpimpl_stub::bool_value = true; + CHECK(true == handler->send_data(NULL, 0 , addr)); + + m2mconnectionhandlerpimpl_stub::bool_value = false; + CHECK(false == handler->send_data(NULL, 0 , addr)); + + free(addr); +} + +void Test_M2MConnectionHandler_classic::test_start_listening_for_data() +{ + handler->start_listening_for_data(); +} + + + +void Test_M2MConnectionHandler_classic::test_stop_listening() +{ + + handler->stop_listening(); + +} + +void Test_M2MConnectionHandler_classic::test_send_to_socket() +{ + const char buf[] = "hello"; + handler->send_to_socket((unsigned char *)&buf, 5); +} + +void Test_M2MConnectionHandler_classic::test_receive_from_socket() +{ + unsigned char *buf = (unsigned char *)malloc(6); + handler->receive_from_socket(buf, 5); + free(buf); +} + +void Test_M2MConnectionHandler_classic::test_handle_connection_error() +{ + // To manage code coverage + handler->handle_connection_error(5); +} + +void Test_M2MConnectionHandler_classic::test_set_platform_network_handler() +{ + // To manage code coverage + handler->set_platform_network_handler(NULL); +} + +void Test_M2MConnectionHandler_classic::test_claim_mutex() +{ + // To manage code coverage + handler->claim_mutex(); +} + +void Test_M2MConnectionHandler_classic::test_release_mutex() +{ + // To manage code coverage + handler->release_mutex(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerimpl_classic/test_m2mconnectionhandlerimpl_classic.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_CONNECTION_HANDLER_IMPL_CLASSIC_H +#define TEST_M2M_CONNECTION_HANDLER_IMPL_CLASSIC_H + +#include "m2mconnectionhandler.h" + +class M2MConnection_TestObserver; + +class Test_M2MConnectionHandler_classic +{ +public: + Test_M2MConnectionHandler_classic(); + + virtual ~Test_M2MConnectionHandler_classic(); + + void test_bind_connection(); + + void test_resolve_server_address(); + + void test_send_data(); + + void test_start_listening_for_data(); + + void test_stop_listening(); + + void test_receive_from_socket(); + + void test_send_to_socket(); + + void test_handle_connection_error(); + + void test_set_platform_network_handler(); + + void test_claim_mutex(); + + void test_release_mutex(); + + M2MConnectionHandler* handler; + M2MConnection_TestObserver *observer; +}; + +#endif // TEST_M2M_CONNECTION_HANDLER_IMPL_CLASSIC_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerpimpl_classic/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +include ../makefile_defines.txt + +COMPONENT_NAME = m2mconnectionhandlerpimpl_classic_unit +SRC_FILES = \ + ../../../../source/m2mconnectionhandlerpimpl.cpp \ + +TEST_SRC_FILES = \ + main.cpp \ + m2mconnectionhandlerpimpl_classic_test.cpp \ + test_m2mconnectionhandlerpimpl_classic.cpp \ + ../stub/m2msecurity_stub.cpp \ + ../stub/m2mconnectionsecurity_stub.cpp \ + ../stub/m2mstring_stub.cpp \ + ../stub/m2mobject_stub.cpp \ + ../stub/m2mresource_stub.cpp \ + ../stub/m2mresourceinstance_stub.cpp \ + ../stub/m2mbase_stub.cpp \ + ../stub/m2mconnectionsecurity_stub.cpp \ + ../stub/pal_network_stub.cpp \ + ../stub/eventOS_stub.cpp \ + ../stub/pal_stub.cpp \ + + + +include ../MakefileWorker.mk +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerpimpl_classic/m2mconnectionhandlerpimpl_classic_test.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionhandlerpimpl_classic.h" + +TEST_GROUP(M2MConnectionHandlerPimpl_classic) +{ + Test_M2MConnectionHandlerPimpl_classic* handler; + + void setup() + { + handler = new Test_M2MConnectionHandlerPimpl_classic(); + } + void teardown() + { + delete handler; + } +}; + + +TEST(M2MConnectionHandlerPimpl_classic, create) +{ + CHECK(handler != NULL); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_bind_connection) +{ + handler->test_bind_connection(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_resolve_server_address) +{ + handler->test_resolve_server_address(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_dns_handler) +{ + handler->test_dns_handler(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_start_listening_for_data) +{ + handler->test_start_listening_for_data(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_receive_handler) +{ + handler->test_receive_handler(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_send_data) +{ + handler->test_send_data(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_send_socket_data) +{ + handler->test_send_socket_data(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_stop_listening) +{ + handler->test_stop_listening(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_send_to_socket) +{ + handler->test_send_to_socket(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_receive_from_socket) +{ + handler->test_receive_from_socket(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_handle_connection_error) +{ + handler->test_handle_connection_error(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_connection_event_handler) +{ + handler->test_connection_event_handler(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_set_platform_network_handler) +{ + handler->test_set_platform_network_handler(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_receive_handshake_handler) +{ + handler->test_receive_handshake_handler(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_claim_mutex) +{ + handler->test_claim_mutex(); +} + +TEST(M2MConnectionHandlerPimpl_classic, test_release_mutex) +{ + handler->test_release_mutex(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerpimpl_classic/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MConnectionHandlerPimpl_classic);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerpimpl_classic/test_m2mconnectionhandlerpimpl_classic.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,629 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionhandlerpimpl_classic.h" +#include "mbed-client-classic/m2mconnectionhandlerpimpl.h" +#include "mbed-client/m2mconnectionhandler.h" +#include "m2mconnectionobserver.h" +#include "m2msecurity.h" +#include "m2mconnectionsecurity_stub.h" +#include "m2msecurity_stub.h" +#include "eventOS_stub.h" +#include "pal_network_stub.h" +#include "eventOS_event.h" +#include <limits.h> + +class M2MConnection_TestObserver : public M2MConnectionObserver { + +public: + M2MConnection_TestObserver(): + obj(NULL){} + + virtual ~M2MConnection_TestObserver(){} + + void set_class_object(M2MConnectionHandlerPimpl *impl) {obj = impl;} + void data_available(uint8_t*, + uint16_t, + const M2MConnectionObserver::SocketAddress &){ + dataAvailable = true; + if(obj) { + //obj->_receive_data = false; + } + + } + + void socket_error(uint8_t error_code, bool retry){error = true;} + + void address_ready(const M2MConnectionObserver::SocketAddress &, + M2MConnectionObserver::ServerType, + const uint16_t){addressReady = true;} + + void data_sent(){dataSent = true;} + + bool dataAvailable; + bool error; + bool addressReady; + bool dataSent; + M2MSecurity* sec; + + M2MConnectionHandlerPimpl *obj; + +}; + +Test_M2MConnectionHandlerPimpl_classic::Test_M2MConnectionHandlerPimpl_classic() +{ + observer = new M2MConnection_TestObserver(); + m2mconnectionsecurityimpl_stub::clear(); + pal_network_stub::void_value = NULL; + pal_network_stub::change_status_count = 0; + + handler = new M2MConnectionHandlerPimpl(NULL, *observer, NULL , M2MInterface::NOT_SET, M2MInterface::Uninitialized); + + sec = new M2MSecurity(M2MSecurity::M2MServer); + M2MConnectionSecurity* sec1 = new M2MConnectionSecurity(M2MConnectionSecurity::TLS); + M2MConnectionSecurity* sec2 = new M2MConnectionSecurity(M2MConnectionSecurity::TLS); + M2MConnectionSecurity* sec3 = new M2MConnectionSecurity(M2MConnectionSecurity::TLS); + M2MConnectionSecurity* sec4 = new M2MConnectionSecurity(M2MConnectionSecurity::TLS); + + udp4_unsec = new M2MConnectionHandlerPimpl(NULL, *observer, NULL , M2MInterface::UDP, M2MInterface::LwIP_IPv4); + udp4_sec = new M2MConnectionHandlerPimpl(NULL, *observer, sec1 , M2MInterface::UDP, M2MInterface::LwIP_IPv4); + tcp4_unsec = new M2MConnectionHandlerPimpl(NULL, *observer, NULL , M2MInterface::TCP, M2MInterface::LwIP_IPv4); + tcp4_sec = new M2MConnectionHandlerPimpl(NULL, *observer, sec2 , M2MInterface::TCP, M2MInterface::LwIP_IPv4); + udp6_unsec = new M2MConnectionHandlerPimpl(NULL, *observer, NULL , M2MInterface::UDP, M2MInterface::LwIP_IPv6); + udp6_sec = new M2MConnectionHandlerPimpl(NULL, *observer, sec3 , M2MInterface::UDP, M2MInterface::LwIP_IPv6); + tcp6_unsec = new M2MConnectionHandlerPimpl(NULL, *observer, NULL , M2MInterface::TCP, M2MInterface::LwIP_IPv6); + tcp6_sec = new M2MConnectionHandlerPimpl(NULL, *observer, sec4 , M2MInterface::TCP, M2MInterface::LwIP_IPv6); + +} + +Test_M2MConnectionHandlerPimpl_classic::~Test_M2MConnectionHandlerPimpl_classic() +{ + delete handler; + delete observer; + delete udp4_unsec; + delete tcp4_unsec; + delete udp6_unsec; + delete tcp6_unsec; + delete udp4_sec; + delete tcp4_sec; + delete udp6_sec; + delete tcp6_sec; + delete sec; +} + +void Test_M2MConnectionHandlerPimpl_classic::test_bind_connection() +{ + CHECK( handler->bind_connection(7) == true); +} + +void Test_M2MConnectionHandlerPimpl_classic::test_resolve_server_address() +{ + + eventOS_stub::int8_value = 1; + CHECK(handler->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL) == false); + eventOS_stub::int8_value = 0; + CHECK(handler->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL) == true); + +} + +void Test_M2MConnectionHandlerPimpl_classic::test_dns_handler() +{ + + pal_network_stub::status = PAL_SUCCESS; + observer->addressReady = false; + pal_network_stub::uint32_value = 1; + + udp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp4_unsec->dns_handler(); + CHECK(observer->addressReady == true); + + observer->addressReady = false; + udp6_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp6_unsec->dns_handler(); + CHECK(observer->addressReady == true); + + observer->addressReady = false; + tcp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + tcp4_unsec->dns_handler(); + CHECK(observer->addressReady == true); + + observer->addressReady = false; + tcp6_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + tcp6_unsec->dns_handler(); + CHECK(observer->addressReady == true); + + observer->addressReady = false; + m2msecurity_stub::int_value = M2MSecurity::Psk; + m2mconnectionsecurityimpl_stub::use_inc_int = true; + m2mconnectionsecurityimpl_stub::inc_int_value = 0; + udp4_sec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, sec); + udp4_sec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(udp4_sec->is_handshake_ongoing()); + + /* error cases */ + + observer->addressReady = false; + observer->error = false; + m2msecurity_stub::int_value = M2MSecurity::Psk; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = 0; + m2mconnectionsecurityimpl_stub::int_value2 = -123; + udp4_sec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, sec); + udp4_sec->dns_handler(); + CHECK(observer->error); + CHECK(observer->addressReady == false); + CHECK(!udp4_sec->is_handshake_ongoing()); + + M2MConnectionSecurity *connection_security; + + observer->error = false; + observer->addressReady = false; + m2msecurity_stub::int_value = M2MSecurity::Psk; + connection_security = udp4_sec->_security_impl; + udp4_sec->_security_impl = NULL; + udp4_sec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, sec); + udp4_sec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + udp4_sec->_security_impl = connection_security; + + observer->error = false; + observer->addressReady = false; + m2msecurity_stub::int_value = M2MSecurity::Psk; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = 1; + udp4_sec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, sec); + udp4_sec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + pal_network_stub::uint32_value = 0; + + observer->error = false; + udp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp4_unsec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + pal_network_stub::uint32_value = 1; + + udp4_unsec->_network_stack = (M2MInterface::NetworkStack)123; + udp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp4_unsec->dns_handler(); + CHECK(observer->addressReady == false); + udp4_unsec->_network_stack = M2MInterface::LwIP_IPv4; + + observer->error = false; + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_GENERIC_FAILURE; + pal_network_stub::change_status_count = 1; + udp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp4_unsec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + observer->error = false; + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_GENERIC_FAILURE; + pal_network_stub::change_status_count = 2; + udp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp4_unsec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + observer->error = false; + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_GENERIC_FAILURE; + pal_network_stub::change_status_count = 3; + udp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp4_unsec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + observer->error = false; + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_GENERIC_FAILURE; + pal_network_stub::change_status_count = 4; + udp4_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + udp4_unsec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + observer->error = false; + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_GENERIC_FAILURE; + pal_network_stub::change_status_count = 3; + tcp6_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + tcp6_unsec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + observer->error = false; + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_GENERIC_FAILURE; + pal_network_stub::change_status_count = 8; + tcp6_unsec->resolve_server_address("1", 12345, M2MConnectionObserver::LWM2MServer, NULL); + tcp6_unsec->dns_handler(); + CHECK(observer->addressReady == false); + CHECK(observer->error); + + pal_network_stub::change_status_count = 0; + +} + +void Test_M2MConnectionHandlerPimpl_classic::test_send_data() +{ + sn_nsdl_addr_s* addr = (sn_nsdl_addr_s*)malloc(sizeof(sn_nsdl_addr_s)); + memset(addr, 0, sizeof(sn_nsdl_addr_s)); + uint8_t* data = (uint8_t*)malloc(5); + + eventOS_stub::int8_value = 0; + CHECK(false == handler->send_data(data, 5 , NULL)); + + CHECK(false == handler->send_data(data, 0 , addr)); + + CHECK(false == handler->send_data(NULL, 5 , addr)); + + handler->_running = false; + CHECK(false == handler->send_data(data, 5 , addr)); + handler->_running = true; + + CHECK(true == handler->send_data(data, 5 , addr)); + + eventOS_stub::int8_value = 1; + CHECK(false == handler->send_data(data, 5 , addr)); + + free(data); + free(addr); +} + +void Test_M2MConnectionHandlerPimpl_classic::test_send_socket_data() +{ + + uint8_t data[5] = {1}; + + pal_network_stub::status = PAL_SUCCESS; + + udp4_unsec->_running = true; + tcp4_unsec->_running = true; + udp4_sec->_running = true; + tcp4_sec->_running = true; + + observer->dataSent = false; + udp4_unsec->send_socket_data(data, sizeof(data)); + CHECK(observer->dataSent); + + observer->dataSent = false; + tcp4_unsec->send_socket_data(data, sizeof(data)); + CHECK(observer->dataSent); + + + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = 5; + + observer->dataSent = false; + tcp4_sec->_use_secure_connection = true; + tcp4_sec->send_socket_data(data, sizeof(data)); + CHECK(observer->dataSent); + + pal_network_stub::status = PAL_ERR_GENERIC_FAILURE; + + observer->dataSent = false; + udp4_unsec->send_socket_data(data, sizeof(data)); + CHECK(!observer->dataSent); + + observer->dataSent = false; + tcp4_unsec->send_socket_data(data, sizeof(data)); + CHECK(!observer->dataSent); + + pal_network_stub::status = PAL_SUCCESS; + + observer->dataSent = false; + tcp4_unsec->send_socket_data(NULL, sizeof(data)); + CHECK(!observer->dataSent); + + observer->dataSent = false; + tcp4_unsec->send_socket_data(data, 0); + CHECK(!observer->dataSent); + + udp4_unsec->_running = false; + observer->dataSent = false; + udp4_unsec->send_socket_data(data, sizeof(data)); + CHECK(!observer->dataSent); + udp4_unsec->_running = true; + +} + +void Test_M2MConnectionHandlerPimpl_classic::test_start_listening_for_data() +{ + handler->start_listening_for_data(); +} + +void Test_M2MConnectionHandlerPimpl_classic::test_receive_handler() +{ + + uint8_t data[5] = {0,0,0,1,123}; + pal_network_stub::size = 5; + + udp4_unsec->_running = true; + tcp4_unsec->_running = true; + udp4_sec->_running = true; + tcp4_sec->_running = true; + + udp4_unsec->start_listening_for_data(); + tcp4_unsec->start_listening_for_data(); + + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_SOCKET_WOULD_BLOCK; + pal_network_stub::change_status_count = 1; + observer->dataAvailable = false; + udp4_unsec->receive_handler(); + CHECK(observer->dataAvailable); + + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_SOCKET_WOULD_BLOCK; + pal_network_stub::change_status_count = 1; + observer->dataAvailable = false; + pal_network_stub::void_value = data; + tcp4_unsec->receive_handler(); + CHECK(observer->dataAvailable); + + pal_network_stub::status = PAL_ERR_GENERIC_FAILURE; + observer->dataAvailable = false; + observer->error = 0; + udp4_unsec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(observer->error); + + pal_network_stub::status = PAL_ERR_SOCKET_WOULD_BLOCK; + observer->dataAvailable = false; + observer->error = 0; + udp4_unsec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(!observer->error); + + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_SOCKET_WOULD_BLOCK; + pal_network_stub::change_status_count = 1; + observer->error = 0; + pal_network_stub::size = 3; + observer->dataAvailable = false; + pal_network_stub::void_value = data; + tcp4_unsec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(observer->error); + + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::new_status = PAL_ERR_SOCKET_WOULD_BLOCK; + pal_network_stub::change_status_count = 1; + observer->dataAvailable = false; + data[3] = 2; + tcp4_unsec->receive_handler(); + CHECK(!observer->dataAvailable); + + udp4_sec->_use_secure_connection = true; + observer->error = 0; + observer->dataAvailable = false; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + udp4_sec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(!observer->error); + + udp4_sec->_use_secure_connection = true; + observer->error = 0; + observer->dataAvailable = false; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = (-123); + udp4_sec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(observer->error); + + udp4_sec->_is_handshaking = true; + observer->error = 0; + observer->dataAvailable = false; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + udp4_sec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(!observer->error); + + udp4_sec->_is_handshaking = false; + udp4_sec->_running = true; + observer->error = 0; + observer->dataAvailable = false; + m2mconnectionsecurityimpl_stub::use_inc_int = true; + m2mconnectionsecurityimpl_stub::inc_int_value = INT_MAX; + udp4_sec->receive_handler(); + CHECK(observer->dataAvailable); + CHECK(observer->error); + + udp4_sec->_is_handshaking = false; + udp4_sec->_listening = false; + observer->error = 0; + observer->dataAvailable = false; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + udp4_sec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(!observer->error); + udp4_sec->_listening = true; + + udp4_sec->_is_handshaking = false; + udp4_sec->_running = false; + observer->error = 0; + observer->dataAvailable = false; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + udp4_sec->receive_handler(); + CHECK(!observer->dataAvailable); + CHECK(!observer->error); + udp4_sec->_running = true; + +} + + +void Test_M2MConnectionHandlerPimpl_classic::test_stop_listening() +{ + handler->stop_listening(); +} + +void Test_M2MConnectionHandlerPimpl_classic::test_send_to_socket() +{ + const char buf[] = "hello"; + handler->send_to_socket((unsigned char *)&buf, 5); + + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::size = 5; + + udp4_unsec->_running = true; + tcp4_unsec->_running = true; + + CHECK(udp4_unsec->send_to_socket((unsigned char *)&buf, 5) == 5); + + CHECK(tcp4_unsec->send_to_socket((unsigned char *)&buf, 5) == 5); + + udp4_unsec->_running = false; + CHECK(udp4_unsec->send_to_socket((unsigned char *)&buf, 5) < 0); + udp4_unsec->_running = true; + + pal_network_stub::status = PAL_ERR_GENERIC_FAILURE; + + CHECK(udp4_unsec->send_to_socket((unsigned char *)&buf, 5) < 0); + + CHECK(tcp4_unsec->send_to_socket((unsigned char *)&buf, 5) < 0); + +} + +void Test_M2MConnectionHandlerPimpl_classic::test_receive_from_socket() +{ + unsigned char *buf = (unsigned char *)malloc(6); + + pal_network_stub::status = PAL_SUCCESS; + pal_network_stub::size = 5; + + udp4_unsec->_running = true; + tcp4_unsec->_running = true; + + CHECK(udp4_unsec->receive_from_socket(buf, 5) == 5); + + CHECK(tcp4_unsec->receive_from_socket(buf, 5) == 5); + + udp4_unsec->_running = false; + CHECK(udp4_unsec->receive_from_socket(buf, 5) < 0); + udp4_unsec->_running = true; + + pal_network_stub::status = PAL_ERR_GENERIC_FAILURE; + + CHECK(udp4_unsec->receive_from_socket(buf, 5) < 0); + + CHECK(tcp4_unsec->receive_from_socket(buf, 5) < 0); + + pal_network_stub::status = PAL_ERR_SOCKET_WOULD_BLOCK; + + CHECK(udp4_unsec->receive_from_socket(buf, 5) == M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ); + + CHECK(tcp4_unsec->receive_from_socket(buf, 5) == M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ); + + free(buf); +} + +void Test_M2MConnectionHandlerPimpl_classic::test_handle_connection_error() +{ + handler->handle_connection_error(4); + CHECK(observer->error == true); +} + +extern "C" void connection_event_handler(arm_event_s *event); + +void Test_M2MConnectionHandlerPimpl_classic::test_connection_event_handler() +{ + arm_event_s event; + + event.data_ptr = malloc(1); + event.event_data = 1; + + event.event_type = M2MConnectionHandlerPimpl::ESocketReadytoRead; + connection_event_handler(&event); + + event.event_type = M2MConnectionHandlerPimpl::ESocketDnsHandler; + connection_event_handler(&event); + + event.event_type = M2MConnectionHandlerPimpl::ESocketSend; + connection_event_handler(&event); + + event.event_type = 1234; + connection_event_handler(&event); + +} + +void Test_M2MConnectionHandlerPimpl_classic::test_set_platform_network_handler() +{ + pal_network_stub::status = PAL_SUCCESS; + handler->set_platform_network_handler((void*)1); + + pal_network_stub::status = PAL_ERR_GENERIC_FAILURE; + handler->set_platform_network_handler((void*)1); +} + +void Test_M2MConnectionHandlerPimpl_classic::test_receive_handshake_handler() +{ + + udp4_sec->_is_handshaking = true; + observer->error = 0; + observer->addressReady = 0; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + udp4_sec->receive_handshake_handler(); + CHECK(!observer->error); + CHECK(!observer->addressReady); + + udp4_sec->_is_handshaking = true; + observer->error = 0; + observer->addressReady = 0; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = 0; + udp4_sec->receive_handshake_handler(); + CHECK(!observer->error); + CHECK(observer->addressReady); + + udp4_sec->_is_handshaking = true; + observer->error = 0; + observer->addressReady = 0; + m2mconnectionsecurityimpl_stub::use_inc_int = false; + m2mconnectionsecurityimpl_stub::int_value = (-123); + udp4_sec->receive_handshake_handler(); + CHECK(observer->error); + CHECK(!observer->addressReady); + +} + +void Test_M2MConnectionHandlerPimpl_classic::test_claim_mutex() +{ + + handler->claim_mutex(); + +} + +void Test_M2MConnectionHandlerPimpl_classic::test_release_mutex() +{ + + handler->release_mutex(); + +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mconnectionhandlerpimpl_classic/test_m2mconnectionhandlerpimpl_classic.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_CONNECTION_HANDLER_PIMPL_CLASSIC_H +#define TEST_M2M_CONNECTION_HANDLER_PIMPL_CLASSIC_H + +#include "mbed-client-classic/m2mconnectionhandlerpimpl.h" + +class M2MConnection_TestObserver; + +class Test_M2MConnectionHandlerPimpl_classic +{ +public: + Test_M2MConnectionHandlerPimpl_classic(); + + virtual ~Test_M2MConnectionHandlerPimpl_classic(); + + void test_bind_connection(); + + void test_resolve_server_address(); + + void test_dns_handler(); + + void test_send_data(); + + void test_send_socket_data(); + + void test_start_listening_for_data(); + + void test_data_receive(); + + void test_receive_from_socket(); + + void test_stop_listening(); + + void test_send_to_socket(); + + void test_receive_handler(); + + void test_handle_connection_error(); + + void test_connection_event_handler(); + + void test_set_platform_network_handler(); + + void test_receive_handshake_handler(); + + void test_claim_mutex(); + + void test_release_mutex(); + + M2MConnectionHandlerPimpl* handler; + M2MConnection_TestObserver *observer; + + M2MConnectionHandlerPimpl *udp4_unsec; + M2MConnectionHandlerPimpl *udp4_sec; + M2MConnectionHandlerPimpl *tcp4_unsec; + M2MConnectionHandlerPimpl *tcp4_sec; + M2MConnectionHandlerPimpl *udp6_unsec; + M2MConnectionHandlerPimpl *udp6_sec; + M2MConnectionHandlerPimpl *tcp6_unsec; + M2MConnectionHandlerPimpl *tcp6_sec; + M2MSecurity* sec; + +}; + +#endif // TEST_M2M_CONNECTION_HANDLER_PIMPL_CLASSIC_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimer_classic/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,13 @@ +include ../makefile_defines.txt + +COMPONENT_NAME = m2mtimer_classic_unit +SRC_FILES = \ + ../../../../source/m2mtimer.cpp + +TEST_SRC_FILES = \ + main.cpp \ + m2mtimertest.cpp \ + test_m2mtimer.cpp \ + ../stub/m2mtimerpimpl_stub.cpp \ + +include ../MakefileWorker.mk
Binary file mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimer_classic/m2mtimer_linux_unit_tests has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimer_classic/m2mtimertest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mtimer.h" + +TEST_GROUP(M2MTimer) +{ + Test_M2MTimer* m2m_timer; + + void setup() + { + m2m_timer = new Test_M2MTimer(); + } + void teardown() + { + delete m2m_timer; + } +}; + +TEST(M2MTimer, Create) +{ + CHECK(m2m_timer != NULL); +} + +TEST(M2MTimer, start_timer) +{ + m2m_timer->test_start_timer(); +} + +TEST(M2MTimer, stop_timer) +{ + m2m_timer->test_stop_timer(); +} + +TEST(M2MTimer, test_start_dtls_timer) +{ + m2m_timer->test_start_dtls_timer(); +} + +TEST(M2MTimer, test_is_intermediate_interval_passed) +{ + m2m_timer->test_is_intermediate_interval_passed(); +} + +TEST(M2MTimer, test_is_total_interval_passed) +{ + m2m_timer->test_is_total_interval_passed(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimer_classic/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MTimer);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimer_classic/test_m2mtimer.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mtimer.h" +#include "m2mtimerpimpl_stub.h" + +class TestObserver : public M2MTimerObserver { + +public: + TestObserver(){} + virtual ~TestObserver(){} + void timer_expired(M2MTimerObserver::Type){ + visited = true; + } + bool visited; + +}; + +Test_M2MTimer::Test_M2MTimer() +{ + observer = new TestObserver(); + timer = new M2MTimer(*observer); +} + +Test_M2MTimer::~Test_M2MTimer() +{ + m2mtimerpimpl_stub::clear(); + delete observer; + delete timer; +} + +void Test_M2MTimer::test_start_timer() +{ + timer->start_timer(100, M2MTimerObserver::Notdefined,true); + CHECK(m2mtimerpimpl_stub::visited == true); +} + +void Test_M2MTimer::test_stop_timer() +{ + timer->stop_timer(); + CHECK(m2mtimerpimpl_stub::visited == true); +} + +void Test_M2MTimer::test_start_dtls_timer() +{ + timer->start_dtls_timer(100, 110); + CHECK(m2mtimerpimpl_stub::visited == true); +} + +void Test_M2MTimer::test_is_intermediate_interval_passed() +{ + m2mtimerpimpl_stub::bool_value = true; + CHECK(true == timer->is_intermediate_interval_passed()); +} + +void Test_M2MTimer::test_is_total_interval_passed() +{ + m2mtimerpimpl_stub::bool_value = true; + CHECK(true == timer->is_total_interval_passed()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimer_classic/test_m2mtimer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_TIMER_H +#define TEST_M2M_TIMER_H + +#include "m2mtimer.h" + +class TestObserver; + +class Test_M2MTimer +{ +public: + Test_M2MTimer(); + + virtual ~Test_M2MTimer(); + + void test_start_timer(); + + void test_stop_timer(); + + void test_start_dtls_timer(); + + void test_is_intermediate_interval_passed(); + + void test_is_total_interval_passed(); + + M2MTimer* timer; + TestObserver* observer; +}; + +#endif // TEST_M2M_TIMER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimerpimpl_classic/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +include ../makefile_defines.txt + +COMPONENT_NAME = m2mtimerimpl_linux_unit +SRC_FILES = \ + ../../../../source/m2mtimerpimpl.cpp + +TEST_SRC_FILES = \ + main.cpp \ + m2mtimerpimpl_classic_test.cpp \ + test_m2mtimerpimpl_classic.cpp \ + ../stub/ns_hal_init_stub.cpp \ + ../stub/eventOS_stub.cpp \ + +include ../MakefileWorker.mk +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimerpimpl_classic/m2mtimerpimpl_classic_test.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mtimerpimpl_classic.h" + +TEST_GROUP(M2MTimerPimpl_classic) +{ + Test_M2MTimerPimpl_classic* m2m_timer; + + void setup() + { + m2m_timer = new Test_M2MTimerPimpl_classic(); + } + void teardown() + { + delete m2m_timer; + } +}; + +TEST(M2MTimerPimpl_classic, Create) +{ + CHECK(m2m_timer != NULL); +} + +TEST(M2MTimerPimpl_classic, start_timer) +{ + m2m_timer->test_start_timer(); +} + +TEST(M2MTimerPimpl_classic, stop_timer) +{ + m2m_timer->test_stop_timer(); +} + +TEST(M2MTimerPimpl_classic, timer_expired) +{ + m2m_timer->test_timer_expired(); +} + +TEST(M2MTimerPimpl_classic, test_start_dtls_timer) +{ + m2m_timer->test_start_dtls_timer(); +} + +TEST(M2MTimerPimpl_classic, test_is_intermediate_interval_passed) +{ + m2m_timer->test_is_intermediate_interval_passed(); +} + +TEST(M2MTimerPimpl_classic, test_is_total_interval_passed) +{ + m2m_timer->test_is_total_interval_passed(); +} + +TEST(M2MTimerPimpl_classic, tasklet_func) +{ + m2m_timer->test_tasklet_func(); +} + +TEST(M2MTimerPimpl_classic, start_still_left_timer) +{ + m2m_timer->test_start_still_left_timer(); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimerpimpl_classic/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MTimerPimpl_classic);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimerpimpl_classic/test_m2mtimerpimpl_classic.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mtimerpimpl_classic.h" +#include "eventOS_event.h" +#include <unistd.h> + +extern void expired(union sigval sigval); +class TestObserver : public M2MTimerObserver { + +public: + TestObserver(){} + virtual ~TestObserver(){} + void timer_expired(M2MTimerObserver::Type){ + visited = true; + } + bool visited; + +}; + +Test_M2MTimerPimpl_classic::Test_M2MTimerPimpl_classic() +{ + observer = new TestObserver(); + timer = new M2MTimerPimpl(*observer); +} + +Test_M2MTimerPimpl_classic::~Test_M2MTimerPimpl_classic() +{ + delete observer; + delete timer; +} + +void Test_M2MTimerPimpl_classic::test_start_timer() +{ + timer->start_timer(100,M2MTimerObserver::Notdefined,true); + CHECK(!timer->_still_left); + timer->start_timer(10000000000,M2MTimerObserver::Notdefined,true); + CHECK(timer->_still_left); +} + +void Test_M2MTimerPimpl_classic::test_stop_timer() +{ + //common_stub::int_value = 0; + timer->start_timer(100,M2MTimerObserver::Notdefined,true); + timer->stop_timer(); + timer->start_timer(100,M2MTimerObserver::Notdefined,false); + timer->stop_timer(); + //CHECK(timer->_timer_specs.it_value.tv_sec == 0); + //CHECK(timer->_timer_specs.it_value.tv_nsec == 0); +} + +void Test_M2MTimerPimpl_classic::test_timer_expired() +{ + observer->visited = false; + timer->timer_expired(); + CHECK(observer->visited == true); + + timer->_single_shot = false; + timer->timer_expired(); + CHECK(observer->visited == true); +} + +void Test_M2MTimerPimpl_classic::test_start_dtls_timer() +{ + timer->start_dtls_timer(10, 100, M2MTimerObserver::Dtls); +} + +void Test_M2MTimerPimpl_classic::test_is_intermediate_interval_passed() +{ + timer->start_dtls_timer(2500, 10000, M2MTimerObserver::Dtls); + CHECK(false == timer->is_intermediate_interval_passed()); + timer->timer_expired(); + CHECK(true == timer->is_intermediate_interval_passed()); +} + +void Test_M2MTimerPimpl_classic::test_is_total_interval_passed() +{ + timer->start_dtls_timer(250, 2000, M2MTimerObserver::Dtls); + timer->timer_expired(); + CHECK(false == timer->is_total_interval_passed()); + timer->timer_expired(); + CHECK(true == timer->is_total_interval_passed()); +} + +extern "C" void tasklet_func(arm_event_s *event); + +void Test_M2MTimerPimpl_classic::test_tasklet_func() +{ + arm_event_s event; + + event.event_type = 10; + event.event_id = (-1); + + observer->visited = false; + tasklet_func(&event); + CHECK(!observer->visited); + + event.event_id = timer->get_timer_id(); + + tasklet_func(&event); + CHECK(observer->visited); + + observer->visited = false; + timer->_still_left = 1; + tasklet_func(&event); + CHECK(!observer->visited); +} + +void Test_M2MTimerPimpl_classic::test_start_still_left_timer() +{ + observer->visited = false; + timer->_still_left = (uint64_t)INT32_MAX + 1; + timer->start_still_left_timer(); + CHECK(!observer->visited); + CHECK(timer->_still_left); + + timer->start_still_left_timer(); + CHECK(!observer->visited); + CHECK(!timer->_still_left); + + timer->_still_left = 0; + timer->_single_shot = false; + timer->start_still_left_timer(); + CHECK(observer->visited); + +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/m2mtimerpimpl_classic/test_m2mtimerpimpl_classic.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_TIMER_IMPL_CLASSIC_H +#define TEST_M2M_TIMER_IMPL_CLASSIC_H + +#include "mbed-client-classic/m2mtimerpimpl.h" + +class TestObserver; + +class Test_M2MTimerPimpl_classic +{ +public: + Test_M2MTimerPimpl_classic(); + + virtual ~Test_M2MTimerPimpl_classic(); + + void test_start_timer(); + + void test_stop_timer(); + + void test_timer_expired(); + + void test_start_dtls_timer(); + + void test_is_intermediate_interval_passed(); + + void test_is_total_interval_passed(); + + void test_tasklet_func(); + void test_start_still_left_timer(); + + M2MTimerPimpl* timer; + TestObserver* observer; +}; + +#endif // TEST_M2M_TIMER_IMPL_CLASSIC_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/makefile_defines.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +#--- Inputs ----# +CPPUTEST_HOME = /usr +CPPUTEST_USE_EXTENSIONS = Y +CPPUTEST_USE_VPATH = Y +CPPUTEST_USE_GCOV = Y +CPP_PLATFORM = gcc +INCLUDE_DIRS =\ + .\ + ../common\ + ../stub\ + ../../../../source/include\ + ../../../../source\ + ../../../../\ + ../../../../test_modules/\ + ../../../../test_modules/mbed-client-pal/Source/PAL-Impl/Services-API/\ + ../../../../test_modules/mbed-client/mbed-client\ + ../../../../test_modules/mbed-client\ + ../../../../test_modules/mbed-client/source\ + ../../../../test_modules/mbed-client/source/include\ + ../../../../test_modules/mbed-client-c\ + ../../../../test_modules/mbed-client-c/source/libNsdl\ + ../../../../test_modules/mbed-client-c/source/libNsdl/src/include\ + ../../../../test_modules/nanostack-libservice\ + ../../../../test_modules/nanostack-libservice/mbed-client-libservice\ + ../../../../test_modules/sal-stack-nanostack-eventloop/nanostack-event-loop/\ + ../../../../test_modules/mbed-trace\ + ../../../../test_modules/mbed-os/features/FEATURE_COMMON_PAL/nanostack-hal-mbed-cmsis-rtos\ + /usr/include\ + $(CPPUTEST_HOME)/include\ + +CPPUTESTFLAGS = -D__thumb2__ -w
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/eventOS_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "eventOS_scheduler.h" +#include "eventOS_event.h" +#include "eventOS_stub.h" + +int8_t eventOS_stub::int8_value; + +void eventOS_scheduler_mutex_wait(void){} + +void eventOS_scheduler_mutex_release(void){} + +int8_t eventOS_event_handler_create(void (*handler_func_ptr)(arm_event_s *), uint8_t init_event_type) +{ + return eventOS_stub::int8_value; +} + +int8_t eventOS_event_send(arm_event_s *event) +{ + if(event->data_ptr && !eventOS_stub::int8_value) + { + free(event->data_ptr); + } + return eventOS_stub::int8_value; +} + +extern "C" int8_t eventOS_event_timer_request(uint8_t snmessage, uint8_t event_type, int8_t tasklet_id, uint32_t time) +{ + return eventOS_stub::int8_value; +} + +extern "C" int8_t eventOS_event_timer_cancel(uint8_t snmessage, int8_t tasklet_id) +{ + return eventOS_stub::int8_value; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/eventOS_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef EVENTOS_STUB_H +#define EVENTOS_STUB_H + +namespace eventOS_stub +{ + extern int8_t int8_value; +} + +#endif // EVENTOS_STUB_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mbase_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mbase_stub.h" + +#include <assert.h> + +uint8_t m2mbase_stub::uint8_value; +uint16_t m2mbase_stub::uint16_value; +uint32_t m2mbase_stub::uint32_value; +uint16_t m2mbase_stub::int_value; +int32_t m2mbase_stub::name_id_value; + +bool m2mbase_stub::bool_value; +String *m2mbase_stub::string_value; + +M2MBase::BaseType m2mbase_stub::base_type; +M2MBase::Operation m2mbase_stub::operation; +M2MBase::Mode m2mbase_stub::mode_value; +M2MBase::Observation m2mbase_stub::observation_level_value; + +void *m2mbase_stub::void_value; +M2MObservationHandler *m2mbase_stub::observe; +M2MReportHandler *m2mbase_stub::report; +bool m2mbase_stub::is_value_updated_function_set; + + +void m2mbase_stub::clear() +{ + int_value = 0; + uint8_value = 0; + uint16_value = 0; + uint32_value = 0; + string_value = NULL; + name_id_value = -1; + mode_value = M2MBase::Static; + base_type = M2MBase::Object; + observation_level_value = M2MBase::None; + bool_value = false; + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + void_value = NULL; + observe = NULL; + report = NULL; + is_value_updated_function_set = false; +} + +M2MBase::M2MBase(const String &/*resource_name*/, + M2MBase::Mode /*mode*/) +{ +} + +M2MBase& M2MBase::operator=(const M2MBase& other) +{ + if (this != &other) { // protect against invalid self-assignment + } + return *this; +} + +M2MBase::M2MBase(const M2MBase& other) +{ + this->operator=(other); +} + +M2MBase::~M2MBase() +{ +} + +void M2MBase::set_operation(M2MBase::Operation opr) +{ + m2mbase_stub::operation = opr; +} + +void M2MBase::set_interface_description(const String &/*desc*/) +{ +} + +void M2MBase::set_resource_type(const String &/*res_type*/) +{ +} + +void M2MBase::set_coap_content_type(const uint8_t /*con_type*/) +{ +} + +void M2MBase::set_instance_id(const uint16_t /*inst_id*/) +{ +} + +void M2MBase::set_observation_number(const uint16_t /*observation_number*/) +{ +} + +void M2MBase::set_max_age(const uint32_t /*max_age*/) +{ +} + +M2MBase::Operation M2MBase::operation() const +{ + return m2mbase_stub::operation; +} + +const String& M2MBase::name() const +{ + return *m2mbase_stub::string_value; +} + +int32_t M2MBase::name_id() const +{ + return m2mbase_stub::name_id_value; +} + +uint16_t M2MBase::instance_id() const +{ + return m2mbase_stub::int_value; +} + +const String& M2MBase::interface_description() const +{ + return *m2mbase_stub::string_value; +} + +const String& M2MBase::resource_type() const +{ + return *m2mbase_stub::string_value; +} + +uint8_t M2MBase::coap_content_type() const +{ + return m2mbase_stub::uint8_value; +} + +uint32_t M2MBase::max_age() const +{ + return m2mbase_stub::uint32_value; +} + +void M2MBase::set_observable(bool /*observable*/) +{ +} + +void M2MBase::add_observation_level(M2MBase::Observation) +{ +} + +void M2MBase::remove_observation_level(M2MBase::Observation) +{ +} + +void M2MBase::set_under_observation(bool /*observed*/, + M2MObservationHandler */*handler*/) +{ +} + +void M2MBase::set_observation_token(const uint8_t */*token*/, + const uint8_t /*length*/) +{ +} + +bool M2MBase::is_observable() const +{ + return m2mbase_stub::bool_value; +} + +M2MBase::Observation M2MBase::observation_level() const +{ + return m2mbase_stub::observation_level_value; +} + +void M2MBase::get_observation_token(uint8_t *&/*token*/, + uint32_t &/*length*/) +{ +} + +void M2MBase::set_base_type(M2MBase::BaseType /*type*/) +{ +} + +M2MBase::BaseType M2MBase::base_type() const +{ + return m2mbase_stub::base_type; +} + +M2MBase::Mode M2MBase::mode() const +{ + return m2mbase_stub::mode_value; +} + +uint16_t M2MBase::observation_number() const +{ + return m2mbase_stub::uint16_value; +} + +void M2MBase::remove_resource_from_coap(const String &) +{ +} + +void M2MBase::remove_object_from_coap() +{ +} + +bool M2MBase::handle_observation_attribute(char *&query) +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::observation_to_be_sent(m2m::Vector<uint16_t>, bool) +{ +} + +void *M2MBase::memory_alloc(uint32_t size) +{ + if(size) + return malloc(size); + else + return 0; +} + +void M2MBase::memory_free(void *ptr) +{ + if(ptr) + free(ptr); +} + +uint8_t* M2MBase::alloc_string_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size + 1); + if (result) { + memcpy(result, source, size); + result[size] = '\0'; + } + return result; +} + +uint8_t* M2MBase::alloc_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size); + if (result) { + memcpy(result, source, size); + } + return result; +} + +M2MReportHandler* M2MBase::report_handler() +{ + return m2mbase_stub::report; +} + +M2MObservationHandler* M2MBase::observation_handler() +{ + return m2mbase_stub::observe; +} + +sn_coap_hdr_s* M2MBase::handle_get_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_put_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &execute_value_updated) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_post_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &, sn_nsdl_addr_s *address) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +void M2MBase::set_register_uri( bool register_uri) +{ +} + +bool M2MBase::register_uri() +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::set_uri_path(const String &uri_path) +{ +} + +const String& M2MBase::uri_path() const +{ + return *m2mbase_stub::string_value; +} + +bool M2MBase::is_under_observation() const +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::set_value_updated_function(value_updated_callback callback) +{ + +} + +void M2MBase::set_value_updated_function(value_updated_callback2 callback) +{ + +} + +bool M2MBase::is_value_updated_function_set() +{ + return m2mbase_stub::is_value_updated_function_set; +} + +void M2MBase::execute_value_updated(const String& name) +{ + +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mbase_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_BASE_STUB_H +#define M2M_BASE_STUB_H + +#include "m2mbase.h" + +//some internal test related stuff +namespace m2mbase_stub +{ + extern uint8_t uint8_value; + extern uint16_t uint16_value; + extern uint32_t uint32_value; + extern uint16_t int_value; + extern int32_t name_id_value; + extern String *string_value; + extern bool bool_value; + extern M2MBase::BaseType base_type; + extern M2MBase::Mode mode_value; + extern M2MBase::Operation operation; + extern void *void_value; + extern M2MObservationHandler *observe; + extern M2MReportHandler *report; + extern M2MBase::Observation observation_level_value; + extern bool is_value_updated_function_set; + void clear(); +} + +#endif // M2M_BASE_STUB_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mconnectionhandlerpimpl_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mconnectionhandlerpimpl_stub.h" +#include "mbed-client-classic/m2mconnectionhandlerpimpl.h" +#include "m2mconnectionsecurity.h" + +int m2mconnectionhandlerpimpl_stub::int_value; +uint16_t m2mconnectionhandlerpimpl_stub::uint_value; +bool m2mconnectionhandlerpimpl_stub::bool_value; + +void m2mconnectionhandlerpimpl_stub::clear() +{ + int_value = -1; + uint_value = 0; + bool_value = false; +} + +M2MConnectionHandlerPimpl::M2MConnectionHandlerPimpl(M2MConnectionHandler* base, M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode, + M2MInterface::NetworkStack) +:_observer(observer) +{ + if( sec ){ + delete sec; + sec = NULL; + } +} + +M2MConnectionHandlerPimpl::~M2MConnectionHandlerPimpl() +{ +} + +bool M2MConnectionHandlerPimpl::bind_connection(const uint16_t) +{ + return m2mconnectionhandlerpimpl_stub::bool_value; +} + +bool M2MConnectionHandlerPimpl::resolve_server_address(const String&, + const uint16_t, + M2MConnectionObserver::ServerType, + const M2MSecurity* ) +{ + return m2mconnectionhandlerpimpl_stub::bool_value; +} + +bool M2MConnectionHandlerPimpl::start_listening_for_data() +{ + return m2mconnectionhandlerpimpl_stub::bool_value; +} + +bool M2MConnectionHandlerPimpl::send_data(uint8_t *, + uint16_t , + sn_nsdl_addr_s *) +{ + return m2mconnectionhandlerpimpl_stub::bool_value; +} + +void M2MConnectionHandlerPimpl::stop_listening() +{ +} + +int M2MConnectionHandlerPimpl::send_to_socket(const unsigned char *, size_t ){ + return m2mconnectionhandlerpimpl_stub::int_value; +} + +int M2MConnectionHandlerPimpl::receive_from_socket(unsigned char *buf, size_t len){ + return m2mconnectionhandlerpimpl_stub::int_value; +} +//void M2MConnectionHandlerPimpl::data_receive(void *object) +//{ +// +//} + +void M2MConnectionHandlerPimpl::handle_connection_error(int ) +{ + +} + +void M2MConnectionHandlerPimpl::claim_mutex(void){} + +void M2MConnectionHandlerPimpl::release_mutex(void){} + +void M2MConnectionHandlerPimpl::set_platform_network_handler(void*){} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mconnectionhandlerpimpl_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_HANDLER_PIMPL_STUB_H +#define M2M_CONNECTION_HANDLER_PIMPL_STUB_H + +#include "m2mconnectionhandler.h" + +//some internal test related stuff +namespace m2mconnectionhandlerpimpl_stub +{ + extern int int_value; + extern uint16_t uint_value; + extern bool bool_value; + void clear(); +} + +#endif // M2M_CONNECTION_HANDLER_PIMPL_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mconnectionsecurity_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "m2mconnectionhandler.h" +#include "m2mconnectionsecurity.h" +#include "m2mtimer.h" +#include "m2msecurity.h" +#include <string.h> +#include "m2mconnectionsecurity_stub.h" + +bool m2mconnectionsecurityimpl_stub::use_inc_int; +int m2mconnectionsecurityimpl_stub::inc_int_value; +int m2mconnectionsecurityimpl_stub::int_value; +int m2mconnectionsecurityimpl_stub::int_value2; + +void m2mconnectionsecurityimpl_stub::clear() +{ + int_value = -1; + use_inc_int = false; + inc_int_value = 0; + int_value2 = 0; +} + +M2MConnectionSecurity::M2MConnectionSecurity(M2MConnectionSecurity::SecurityMode mode) +{ + +} + +M2MConnectionSecurity::~M2MConnectionSecurity(){ +} + +void M2MConnectionSecurity::reset(){ +} + +int M2MConnectionSecurity::init(const M2MSecurity *security){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::connect(M2MConnectionHandler* connHandler){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::start_connecting_non_blocking(M2MConnectionHandler* connHandler) +{ + + if(m2mconnectionsecurityimpl_stub::int_value2) + { + return m2mconnectionsecurityimpl_stub::int_value2; + } + + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::continue_connecting() +{ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::send_message(unsigned char *message, int len){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::read(unsigned char* buffer, uint16_t len){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mconnectionsecurity_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_SECURITY_IMPL_STUB_H +#define M2M_CONNECTION_SECURITY_IMPL_STUB_H + +//some internal test related stuff +namespace m2mconnectionsecurityimpl_stub +{ + extern int int_value; + extern int int_value2; + extern bool use_inc_int; + extern int inc_int_value; + void clear(); +} + +#endif // M2M_CONNECTION_SECURITY_IMPL_STUB_H + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mobject_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mobject_stub.h" + +u_int16_t m2mobject_stub::int_value; +bool m2mobject_stub::bool_value; +M2MObjectInstance* m2mobject_stub::inst; + +// The statically initialized object list must be bigh enough to cater +// for all the tests, or the utest framework will complain for memory leak. +M2MObjectInstanceList m2mobject_stub::instance_list(12); + +M2MBase::BaseType m2mobject_stub::base_type; +sn_coap_hdr_s *m2mobject_stub::header; + +void m2mobject_stub::clear() +{ + int_value = 0; + bool_value = false; + m2mobject_stub::base_type = M2MBase::Object; + instance_list.clear(); + header = NULL; +} + +M2MObject::M2MObject(const String &object_name) +: M2MBase(object_name,M2MBase::Dynamic) +{ +} + +M2MObject::~M2MObject() +{ +} + +M2MObject& M2MObject::operator=(const M2MObject& ) +{ + return *this; +} + +M2MObject::M2MObject(const M2MObject& other) +: M2MBase(other) +{ + *this = other; +} + +M2MObjectInstance* M2MObject::create_object_instance(uint16_t instance_id) +{ + return m2mobject_stub::inst; +} + +bool M2MObject::remove_object_instance(uint16_t) +{ + return m2mobject_stub::bool_value; +} + +M2MObjectInstance* M2MObject::object_instance(uint16_t) const +{ + return m2mobject_stub::inst; +} + +const M2MObjectInstanceList& M2MObject::instances() const +{ + return m2mobject_stub::instance_list; +} + +uint16_t M2MObject::instance_count() const +{ + return m2mobject_stub::int_value; +} + +M2MBase::BaseType M2MObject::base_type() const +{ + return m2mobject_stub::base_type; +} + +void M2MObject::add_observation_level(M2MBase::Observation) +{ + +} + +void M2MObject::remove_observation_level(M2MBase::Observation) +{ + +} + +sn_coap_hdr_s* M2MObject::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mobject_stub::header; +} + +sn_coap_hdr_s* M2MObject::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &execute) +{ + execute = m2mobject_stub::bool_value; + return m2mobject_stub::header; +} + +sn_coap_hdr_s* M2MObject::handle_post_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &, + sn_nsdl_addr_s *) +{ + return m2mobject_stub::header; +} + +void M2MObject::notification_update(uint16_t obj_instance_id) +{ +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mobject_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_OBJECT_STUB_H +#define M2M_OBJECT_STUB_H + +#include "m2mobject.h" +#include "m2mobjectinstance.h" + +//some internal test related stuff +namespace m2mobject_stub +{ + extern u_int16_t int_value; + extern M2MObjectInstance* inst; + extern bool bool_value; + extern M2MObjectInstanceList instance_list; + extern M2MBase::BaseType base_type; + extern sn_coap_hdr_s *header; + void clear(); +} + +#endif // M2M_OBJECT_STUB_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mresource_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mresource_stub.h" + +uint32_t m2mresource_stub::int_value; +uint8_t* m2mresource_stub::delayed_token; +uint8_t m2mresource_stub::delayed_token_len; +bool m2mresource_stub::bool_value; + +// The statically initialized list must be bigh enough to cater +// for all the tests, or the utest framework will complain for memory leak. +M2MResourceInstanceList m2mresource_stub::list(12); + +M2MResourceInstance *m2mresource_stub::instance; +sn_coap_hdr_s *m2mresource_stub::header; +void m2mresource_stub::clear() +{ + int_value = 0; + delayed_token = NULL; + delayed_token_len = 0; + bool_value = false; + list.clear(); + instance = NULL; +} + +M2MResource& M2MResource::operator=(const M2MResource& other) +{ + return *this; +} + +M2MResource::M2MResource(const M2MResource& other) +: M2MResourceInstance(other) +{ + *this = other; +} + +M2MResource::M2MResource(M2MObjectInstanceCallback &object_instance_callback, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + const uint16_t object_instance_id, + const String &object_name, + bool) +: M2MResourceInstance(resource_name, resource_type, type, value, value_length, + object_instance_callback, object_instance_id, object_name) +{ +} + +M2MResource::M2MResource(M2MObjectInstanceCallback &object_instance_callback, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool, + const uint16_t object_instance_id, + const String &object_name, + bool) +: M2MResourceInstance(resource_name, resource_type, type, + object_instance_callback, object_instance_id, object_name) +{ +} + +M2MResource::~M2MResource() +{ +} + +bool M2MResource::supports_multiple_instances() const +{ + return m2mresource_stub::bool_value; +} + +void M2MResource::get_delayed_token(unsigned char *&token, unsigned char &token_len) +{ + token_len = 0; + if(token) { + free(token); + token = NULL; + } + token = (uint8_t *)malloc(m2mresource_stub::delayed_token_len); + if(token) { + token_len = m2mresource_stub::delayed_token_len; + memcpy((uint8_t *)token, (uint8_t *)m2mresource_stub::delayed_token, token_len); + } +} + +bool M2MResource::remove_resource_instance(uint16_t inst_id) +{ + return m2mresource_stub::bool_value; +} + +M2MResourceInstance* M2MResource::resource_instance(uint16_t inst_id) const +{ + return m2mresource_stub::instance; +} + +const M2MResourceInstanceList& M2MResource::resource_instances() const +{ + return m2mresource_stub::list; +} + +uint16_t M2MResource::resource_instance_count() const +{ + return m2mresource_stub::int_value; +} + +bool M2MResource::handle_observation_attribute(char *&query) +{ + return m2mresource_stub::bool_value; +} + +void M2MResource::add_resource_instance(M2MResourceInstance *) +{ +} + +void M2MResource::add_observation_level(M2MBase::Observation) +{ +} + +void M2MResource::remove_observation_level(M2MBase::Observation) +{ +} + +void M2MResource::notification_update() +{ +} + +sn_coap_hdr_s* M2MResource::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mresource_stub::header; +} + +sn_coap_hdr_s* M2MResource::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &) +{ + return m2mresource_stub::header; +} + +sn_coap_hdr_s* M2MResource::handle_post_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &, sn_nsdl_addr_s *) +{ + return m2mresource_stub::header; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mresource_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_RESOURCE_STUB_H +#define M2M_RESOURCE_STUB_H + +#include "m2mresource.h" + +//some internal test related stuff +namespace m2mresource_stub +{ + extern uint32_t int_value; + extern uint8_t* delayed_token; + extern uint8_t delayed_token_len; + extern bool bool_value; + extern M2MResourceInstanceList list; + extern M2MResourceInstance *instance; + void clear(); + extern sn_coap_hdr_s *header; +} + +#endif // M2M_RESOURCE_STUB_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mresourceinstance_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mresourceinstance_stub.h" + +uint32_t m2mresourceinstance_stub::int_value; +bool m2mresourceinstance_stub::bool_value; +String *m2mresourceinstance_stub::string_value; +M2MResourceInstance::ResourceType m2mresourceinstance_stub::resource_type; +sn_coap_hdr_s *m2mresourceinstance_stub::header; +uint8_t* m2mresourceinstance_stub::value; +M2MBase::BaseType m2mresourceinstance_stub::base_type; + + +void m2mresourceinstance_stub::clear() +{ + int_value = 0; + bool_value = false; + resource_type = M2MResourceInstance::STRING; + header = NULL; + value = NULL; + base_type = M2MBase::ResourceInstance; + string_value = NULL; +} + +M2MResourceInstance& M2MResourceInstance::operator=(const M2MResourceInstance&) +{ + return *this; +} + +M2MResourceInstance::M2MResourceInstance(const M2MResourceInstance& other) +: M2MBase(other), + _object_instance_callback(other._object_instance_callback)/*, + _object_instance_id(other._object_instance_id), + _object_name(other._object_name)*/ +{ + this->operator=(other); +} + +M2MResourceInstance::M2MResourceInstance(const String &res_name, + const String &, + M2MResourceInstance::ResourceType, + M2MObjectInstanceCallback &object_instance_callback, + const uint16_t /*object_instance_id*/, + const String &/*object_name*/) +: M2MBase(res_name, + M2MBase::Dynamic), + _object_instance_callback(object_instance_callback)/*, +_object_instance_id(object_instance_id), +_object_name(object_name)*/ +{ + m2mresourceinstance_stub::base_type = M2MBase::ResourceInstance; +} + +M2MResourceInstance::M2MResourceInstance(const String &res_name, + const String &, + M2MResourceInstance::ResourceType, + const uint8_t *, + const uint8_t, + M2MObjectInstanceCallback &object_instance_callback, + const uint16_t/* object_instance_id*/, + const String &/*object_name*/) +: M2MBase(res_name, + M2MBase::Static), +_object_instance_callback(object_instance_callback)/*, + _object_instance_id(object_instance_id), + _object_name(object_name)*/ +{ +} + +M2MResourceInstance::~M2MResourceInstance() +{ +} + +M2MBase::BaseType M2MResourceInstance::base_type() const +{ + return m2mresourceinstance_stub::base_type; +} + +M2MResourceInstance::ResourceType M2MResourceInstance::resource_instance_type() const +{ + return m2mresourceinstance_stub::resource_type; +} + +bool M2MResourceInstance::handle_observation_attribute(char *&) +{ + return m2mresourceinstance_stub::bool_value; +} + +void M2MResourceInstance::set_execute_function(execute_callback) +{ +} + +bool M2MResourceInstance::set_value(const uint8_t *, + const uint32_t ) +{ + return m2mresourceinstance_stub::bool_value; +} + +bool M2MResourceInstance::set_value(int64_t value) +{ + return m2mresourceinstance_stub::bool_value; +} + + +void M2MResourceInstance::clear_value() +{ + if (m2mresourceinstance_stub::value) { + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + m2mresourceinstance_stub::int_value = 0; + } +} + +void M2MResourceInstance::execute(void *) +{ +} + +void M2MResourceInstance::get_value(uint8_t *&value, uint32_t &value_length) +{ + value_length = 0; + if(value) { + free(value); + value = NULL; + } + value = (uint8_t *)malloc(m2mresourceinstance_stub::int_value); + if(value) { + value_length = m2mresourceinstance_stub::int_value; + memcpy((uint8_t *)value, (uint8_t *)m2mresourceinstance_stub::value, value_length); + } +} + +int M2MResourceInstance::get_value_int() +{ + // Note: this is a copy-paste from the original version, as the tests + // set only m2mresourceinstance_stub::value. + + int value_int = 0; + // Get the value and convert it into integer. This is not the most + // efficient way, as it takes pointless heap copy to get the zero termination. + uint8_t* buffer = NULL; + uint32_t length; + get_value(buffer,length); + if(buffer) { + value_int = atoi((const char*)buffer); + free(buffer); + } + return value_int; +} + +String M2MResourceInstance::get_value_string() const +{ + // XXX: do a better constructor to avoid pointless malloc + String value; + if (m2mresourceinstance_stub::value) { + value.append_raw((char*)m2mresourceinstance_stub::value, m2mresourceinstance_stub::int_value); + } + + return value; +} + +uint8_t* M2MResourceInstance::value() const +{ + return m2mresourceinstance_stub::value; +} + +uint32_t M2MResourceInstance::value_length() const +{ + return m2mresourceinstance_stub::int_value; +} + +sn_coap_hdr_s* M2MResourceInstance::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mresourceinstance_stub::header; +} + +sn_coap_hdr_s* M2MResourceInstance::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &) +{ + return m2mresourceinstance_stub::header; +} + +void M2MResourceInstance::set_resource_observer(M2MResourceCallback *callback) +{ + +} +const String& M2MResourceInstance::object_name() const +{ + return *m2mresourceinstance_stub::string_value; +} + +uint16_t M2MResourceInstance::object_instance_id() const +{ + return m2mresourceinstance_stub::int_value; +} + +void M2MResourceInstance::set_execute_function(execute_callback_2 callback) +{ +} + +M2MBlockMessage* M2MResourceInstance::block_message() const +{ + +} + +void M2MResourceInstance::set_incoming_block_message_callback(incoming_block_message_callback callback) +{ +} + +void M2MResourceInstance::set_outgoing_block_message_callback(outgoing_block_message_callback callback) +{ + +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mresourceinstance_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_RESOURCE_INSTANCE_STUB_H +#define M2M_RESOURCE_INSTANCE_STUB_H + +#include "m2mresourceinstance.h" + +//some internal test related stuff +namespace m2mresourceinstance_stub +{ + extern uint32_t int_value; + extern uint8_t* value; + extern bool bool_value; + extern String *string_value; + extern M2MResourceInstance::ResourceType resource_type; + extern M2MBase::BaseType base_type; + extern sn_coap_hdr_s *header; + void clear(); +} + +#endif // M2M_RESOURCE_INSTANCE_STUB_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2msecurity_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2msecurity_stub.h" + +bool m2msecurity_stub::has_value; +uint32_t m2msecurity_stub::int_value; +bool m2msecurity_stub::bool_value; +String *m2msecurity_stub::string_value; +M2MResource* m2msecurity_stub::resource; + +void m2msecurity_stub::clear() +{ + has_value = false; + int_value = -1; + bool_value = false; + string_value = NULL; + resource = NULL; +} + +M2MSecurity::M2MSecurity(ServerType ser_type) +: M2MObject("0"), + _server_type(ser_type), + _server_instance(NULL) +{ +} + +M2MSecurity::~M2MSecurity() +{ +} + +M2MResource* M2MSecurity::create_resource(SecurityResource, uint32_t) +{ + return m2msecurity_stub::resource; +} + +bool M2MSecurity::delete_resource(SecurityResource) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + const String &) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + uint32_t) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + const uint8_t *, + const uint16_t) +{ + return m2msecurity_stub::bool_value; +} + +String M2MSecurity::resource_value_string(SecurityResource) const +{ + return *m2msecurity_stub::string_value; +} + +uint32_t M2MSecurity::resource_value_buffer(SecurityResource, + uint8_t *&value) const +{ + if( m2msecurity_stub::has_value ){ + value = (uint8_t *)malloc(5); + return 5; + } + return m2msecurity_stub::int_value; +} + + +uint32_t M2MSecurity::resource_value_int(SecurityResource) const +{ + return m2msecurity_stub::int_value; +} + +bool M2MSecurity::is_resource_present(SecurityResource) const +{ + return m2msecurity_stub::bool_value; +} + +uint16_t M2MSecurity::total_resource_count() const +{ + return (uint16_t)m2msecurity_stub::int_value; +} + +M2MSecurity::ServerType M2MSecurity::server_type() const +{ + return _server_type; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2msecurity_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_SECURITY_STUB_H +#define M2M_SECURITY_STUB_H + +#include "m2msecurity.h" + +//some internal test related stuff +namespace m2msecurity_stub +{ + extern bool has_value; + extern uint32_t int_value; + extern bool bool_value; + extern String *string_value; + extern M2MResource* resource; + void clear(); +} + +#endif // M2M_SECURITY_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mstring_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mstring.h" +#include <string.h> // strlen +#include <stdlib.h> // malloc, realloc +#include <assert.h> +#include <algorithm> // min + +namespace m2m { + +const String::size_type String::npos = static_cast<size_t>(-1); + +char* String::strdup(const char* s) +{ + const size_t len = strlen(s)+1; + char *p2 = static_cast<char*>(malloc(len)); + memcpy(p2, s, len); + allocated_ = len; + size_ = len-1; + return p2; +} + +String::String() + : p( strdup("") ) +{ +} + +String::~String() +{ + free(p); + p = 0; +} + +String::String(const String& s) + : p(0) +{ + if( &s != NULL ) { + p = static_cast<char*>(malloc(s.size_ + 1)); + + allocated_ = s.size_ + 1; + size_ = s.size_; + memcpy(p, s.p, size_ + 1); + } +} + +String::String(const char* s) + : p(strdup(s)) +{ +} + +String::String(const char* str, size_t n) +{ + p = static_cast<char*>(malloc(n + 1)); + + allocated_ = n + 1; + size_ = n; + memcpy(p, str, n); + p[n] = 0; +} + +String& String::operator=(const char* s) +{ + if ( p != s ) { + // s could point into our own string, so we have to allocate a new string + const size_t len = strlen(s); + char* copy = (char*) malloc( len + 1); + memmove(copy, s, len+1); // trailing 0 + free( p ); + p = copy; + size_ = len; + allocated_ = len+1; + } + return *this; +} + +String& String::operator=(const String& s) +{ + return operator=(s.p); +} + +String& String::operator+=(const String& s) +{ + if (s.size_ > 0) { + this->reserve(size_ + s.size_); + memmove(p+size_, s.p, s.size_+1); // trailing 0 + size_ += s.size_; + } + return *this; +} + +// since p and s may overlap, we have to copy our own string first +String& String::operator+=(const char* s) +{ + const size_type lens = strlen(s); + if (lens > 0) { + if (size_ + lens + 1 <= allocated_) { + memmove(p+size_, s, lens+1); // trailing 0 + size_ += lens; + } else { + String s2( *this ); // copy own data + s2.reserve(size_ + lens); + memmove(s2.p+size_, s, lens+1); // trailing 0 + s2.size_ = size_ + lens; + this->swap( s2 ); + } + } + return *this; +} + +String& String::operator+=(const char c) +{ + push_back(c); + return *this; +} + +void String::push_back(const char c) { + + if (size_ == allocated_ - 1) { + size_t more = (allocated_* 3) / 2; // factor 1.5 + if ( more < 4 ) more = 4; + reserve( size_ + more ); + } + + p[size_] = c; + size_++; + p[size_] = 0; +} + +bool String::operator==(const char* s) const +{ + if( s == NULL ) { + if( p == NULL ) { + return true; + } + return false; + } + bool ret = strcmp(p, s); + return !ret; +} + +bool String::operator==(const String& s) const +{ + bool ret = strcmp(p, s.p); + return !ret; +} + +void String::clear() +{ + size_ = 0; + p[0] = 0; +} + +String String::substr(const size_type pos, size_type length) const +{ + String s; + const size_type len = size_; + + if ( pos <= len ) { + + size_type remain = len - pos; + + if ( length > remain ) + length = remain; + + s.reserve( length ); + + memcpy(s.p, p + pos, length); + s.p[length] = '\0'; + s.size_ = length; + } + return s; +} + + +// checked access, accessing the NUL at end is allowed +char String::at(const size_type i) const +{ + if ( i <= strlen(p) ) { + return p[i]; + } else { + return '\0'; + } +} + +String& String::erase(size_type pos, size_type len) +{ + if (len > 0) { + + if ( pos < size_ ) { // user must not remove trailing 0 + + size_type s2 = size_; + size_type remain = s2 - pos - len; + + if (remain > 0) { + // erase by overwriting + memmove(p + pos, p + pos + len, remain); + } + + //if ( remain < 0 ) remain = 0; + + // remove unused space + this->resize( pos+remain ); + + } + } + return *this; +} + +String& String::append( const char* str, size_type n) { + if (str && n > 0) { + size_t lens = strlen(str); + if (n > lens) + n = lens; + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +String& String::append_raw( const char* str, size_type n) { + if (str && n > 0) { + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +void String::append_int(int param) { + + // max len of "-9223372036854775808" plus zero termination + char conv_buff[20+1]; + + int len = itoa_c(param, conv_buff); + append_raw(conv_buff, len); +} + +int String::compare( size_type pos, size_type len, const String& str ) const { + int r = -1; + if (pos <= size_) { + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = str.size(); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str.p, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::compare( size_type pos, size_type len, const char* str ) const { + int r = -1; + if (pos <= size_) { + + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = strlen(str); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::find_last_of(char c) const { + int r = -1; + char *v; + v = strrchr(p,c); + if (v != NULL) { + r = 0; + char* i = p; + while (v != i) { + i++; + r++; + } + } + return r; +} + +void String::new_realloc( size_type n) { + if (n > 0 ) { + char* pnew = static_cast<char*>(realloc(p, n)); // could return NULL + if (pnew) + p = pnew; + } +} + +void String::reserve( const size_type n) { + if (n >= allocated_ ) { + this->new_realloc(n + 1); + allocated_ = n + 1; + } +} + +void String::resize( const size_type n) { + this->resize( n, 0 ); +} + +void String::resize( const size_type n, const char c) { + if (n < size_ ) { + p[n] = 0; + size_ = n; + } + else if (n > size_ ) { + this->reserve( n ); + for (size_type i=size_; i < n; ++i ) + p[i] = c; + p[n] = 0; + size_ = n; + } +} + +void String::swap( String& s ) { + std::swap( allocated_, s.allocated_ ); + std::swap( size_, s.size_ ); + std::swap( p, s.p ); +} + + +// Comparison +bool operator<( const String& s1, const String& s2 ) { + return strcmp( s1.c_str(), s2.c_str() ) < 0; +} + +void reverse(char s[], uint32_t length) +{ + uint32_t i, j; + char c; + + for (i = 0, j = length-1; i<j; i++, j--) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } +} + +uint32_t itoa_c (int64_t n, char s[]) +{ + int64_t sign; + uint32_t i; + + if ((sign = n) < 0) + n = -n; + + i = 0; + + do { + s[i++] = n % 10 + '0'; + } + while ((n /= 10) > 0); + + if (sign < 0) + s[i++] = '-'; + + s[i] = '\0'; + + m2m::reverse(s, i); + return i; +} + +uint8_t* String::convert_integer_to_array(int64_t value, uint8_t &size, uint8_t *array, uint32_t array_size) +{ + uint8_t* buffer = NULL; + size = 0; + if (array) { + value = String::convert_array_to_integer(array, array_size); + } + + if(value < 0xFF) { + size = 1; + } else if(value < 0xFFFF) { + size = 2; + } else if(value < 0xFFFFFF) { + size = 3; + } else if(value < 0xFFFFFFFF) { + size = 4; + } else if(value < 0xFFFFFFFFFF) { + size = 5; + } else if(value < 0xFFFFFFFFFFFF) { + size = 6; + } else if(value < 0xFFFFFFFFFFFFFF) { + size = 7; + } else { + size = 8; + } + + buffer = (uint8_t*)malloc(size); + if (buffer) { + for (int i = 0; i < size; i++) { + buffer[i] = (value >> ((size - i - 1) * 8)); + } + } else { + size = 0; + } + return buffer; +} + +int64_t String::convert_array_to_integer(uint8_t *value, uint32_t size) +{ + int64_t temp_64 = 0; + for (int i = size - 1; i >= 0; i--) { + temp_64 += (uint64_t)(*value++) << i * 8; + } + return temp_64; +} + +} // namespace
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mtimer_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mtimer_stub.h" + +bool m2mtimer_stub::bool_value; +bool m2mtimer_stub::total_bool_value; + +void m2mtimer_stub::clear() +{ + bool_value = false; + total_bool_value = false; +} + +// Prevents the use of assignment operator +M2MTimer& M2MTimer::operator=(const M2MTimer& /*other*/) +{ + return *this; +} + +// Prevents the use of copy constructor +M2MTimer::M2MTimer(const M2MTimer& other) +: _observer(other._observer) +{ + *this = other; +} + +M2MTimer::M2MTimer(M2MTimerObserver& observer) +: _observer(observer) +{ +} + +M2MTimer::~M2MTimer() +{ +} + +void M2MTimer::start_timer(uint64_t /*interval*/, + M2MTimerObserver::Type /*type*/, + bool /*single_shot*/) +{ +} + +void M2MTimer::start_dtls_timer(uint64_t , uint64_t , M2MTimerObserver::Type ) +{ +} + +void M2MTimer::stop_timer() +{ +} + + +bool M2MTimer::is_intermediate_interval_passed(){ + return m2mtimer_stub::bool_value; +} + +bool M2MTimer::is_total_interval_passed(){ + return m2mtimer_stub::total_bool_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mtimer_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TIMER_STUB_H +#define M2M_TIMER_STUB_H + +#include "m2mtimer.h" + +//some internal test related stuff +namespace m2mtimer_stub +{ + extern bool bool_value; + extern bool total_bool_value; + void clear(); +} + +#endif // M2M_TIMER_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mtimerpimpl_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "m2mtimerpimpl_stub.h" +bool m2mtimerpimpl_stub::bool_value; +bool m2mtimerpimpl_stub::visited; + +void m2mtimerpimpl_stub::clear() +{ + bool_value = false; + visited = false; +} + +M2MTimerPimpl::M2MTimerPimpl(M2MTimerObserver& observer) +: _observer(observer) +{ + +} + +M2MTimerPimpl::~M2MTimerPimpl() +{ +} + +void M2MTimerPimpl::start_timer( uint64_t interval, + M2MTimerObserver::Type type, + bool single_shot) +{ + + m2mtimerpimpl_stub::visited = true; + +} + + + +void M2MTimerPimpl::start_dtls_timer(uint64_t intermediate_interval, uint64_t total_interval, M2MTimerObserver::Type type) +{ + + m2mtimerpimpl_stub::visited = true; + +} + +void M2MTimerPimpl::stop_timer() +{ + m2mtimerpimpl_stub::visited = true; + +} + +void M2MTimerPimpl::timer_expired() +{ +} + +bool M2MTimerPimpl::is_intermediate_interval_passed() +{ + return m2mtimerpimpl_stub::bool_value; +} + +bool M2MTimerPimpl::is_total_interval_passed() +{ + return m2mtimerpimpl_stub::bool_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/m2mtimerpimpl_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TIMER_PIMPL_STUB_H +#define M2M_TIMER_PIMPL_STUB_H + +#include "mbed-client-classic/m2mtimerpimpl.h" + +//some internal test related stuff +namespace m2mtimerpimpl_stub +{ + extern bool bool_value; + extern bool visited; + void clear(); +} + +#endif // M2M_TIMER_IMPL_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/ns_hal_init_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "ns_hal_init.h" + +void ns_hal_init(void *heap, size_t h_size, void (*passed_fptr)(heap_fail_t), mem_stat_t *info_ptr){}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/pal_network_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include <string.h> +#include "pal_network_stub.h" + +palStatus_t pal_network_stub::status; +palStatus_t pal_network_stub::new_status; +uint32_t pal_network_stub::change_status_count; + +palSocket_t pal_network_stub::socket; +palSocketAddress_t pal_network_stub::socket_address; +palIpV4Addr_t pal_network_stub::ipv4_address; +palIpV6Addr_t pal_network_stub::ipv6_address; +size_t pal_network_stub::size; +uint32_t pal_network_stub::uint32_value; +void *pal_network_stub::void_value; + +static palStatus_t get_pal_status(void) +{ + palStatus_t status_to_return; + + status_to_return = pal_network_stub::status; + + if(pal_network_stub::change_status_count){ + + pal_network_stub::change_status_count--; + + if(!pal_network_stub::change_status_count){ + pal_network_stub::status = pal_network_stub::new_status; + } + } + + return status_to_return; + +} + +palStatus_t pal_registerNetworkInterface(void* networkInterfaceContext, uint32_t* interfaceIndex) +{ + *interfaceIndex = pal_network_stub::uint32_value; + return get_pal_status(); +} + +palStatus_t pal_setSockAddrPort(palSocketAddress_t* address, uint16_t port) +{ + return get_pal_status(); +} + +palStatus_t pal_setSockAddrIPV4Addr(palSocketAddress_t* address, palIpV4Addr_t ipV4Addr) +{ + return get_pal_status(); +} + +palStatus_t pal_setSockAddrIPV6Addr(palSocketAddress_t* address, palIpV6Addr_t ipV6Addr) +{ + return get_pal_status(); +} + +palStatus_t pal_getSockAddrIPV4Addr(const palSocketAddress_t* address, palIpV4Addr_t ipV4Addr) +{ + memcpy(ipV4Addr, pal_network_stub::ipv4_address, sizeof(pal_network_stub::ipv4_address)); + return get_pal_status(); +} + +palStatus_t pal_getSockAddrIPV6Addr(const palSocketAddress_t* address, palIpV6Addr_t ipV6Addr) +{ + memcpy(ipV6Addr, pal_network_stub::ipv6_address, sizeof(pal_network_stub::ipv6_address)); + return get_pal_status(); +} + +palStatus_t pal_getSockAddrPort(const palSocketAddress_t* address, uint16_t* port) +{ + return get_pal_status(); +} + +palStatus_t pal_socket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palSocket_t* socket) +{ + memcpy(socket, pal_network_stub::socket, sizeof(pal_network_stub::socket)); + return get_pal_status(); +} + +palStatus_t pal_getSocketOptions(palSocket_t socket, palSocketOptionName_t optionName, void* optionValue, palSocketLength_t* optionLength) +{ + return get_pal_status(); +} + +palStatus_t pal_setSocketOptions(palSocket_t socket, int optionName, const void* optionValue, palSocketLength_t optionLength) +{ + return get_pal_status(); +} + +palStatus_t pal_bind(palSocket_t socket, palSocketAddress_t* myAddress, palSocketLength_t addressLength) +{ + return get_pal_status(); +} + +palStatus_t pal_receiveFrom(palSocket_t socket, void* buffer, size_t length, palSocketAddress_t* from, palSocketLength_t* fromLength, size_t* bytesReceived) +{ + if(pal_network_stub::void_value){ + memcpy(buffer, pal_network_stub::void_value, pal_network_stub::size); + } + *bytesReceived = pal_network_stub::size; + return get_pal_status(); +} + +palStatus_t pal_sendTo(palSocket_t socket, const void* buffer, size_t length, const palSocketAddress_t* to, palSocketLength_t toLength, size_t* bytesSent) +{ + *bytesSent = pal_network_stub::size; + return get_pal_status(); +} + +palStatus_t pal_close(palSocket_t* socket) +{ + return get_pal_status(); +} + +palStatus_t pal_getNumberOfNetInterfaces(uint32_t* numInterfaces) +{ + *numInterfaces = pal_network_stub::uint32_value; + return get_pal_status(); +} + +palStatus_t pal_getNetInterfaceInfo(uint32_t interfaceNum, palNetInterfaceInfo_t* interfaceInfo) +{ + return get_pal_status(); +} + +palStatus_t pal_socketMiniSelect(const palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t numberOfSockets, pal_timeVal_t* timeout, + uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t* numberOfSocketsSet) +{ + return get_pal_status(); +} + +palStatus_t pal_listen(palSocket_t socket, int backlog) +{ + return get_pal_status(); +} + +palStatus_t pal_accept(palSocket_t socket, palSocketAddress_t* address, palSocketLength_t* addressLen, palSocket_t* acceptedSocket) +{ + return get_pal_status(); +} + +palStatus_t pal_connect(palSocket_t socket, const palSocketAddress_t* address, palSocketLength_t addressLen) +{ + return get_pal_status(); +} + +palStatus_t pal_recv(palSocket_t socket, void* buf, size_t len, size_t* recievedDataSize) +{ + if(pal_network_stub::void_value){ + memcpy(buf, pal_network_stub::void_value, pal_network_stub::size); + } + *recievedDataSize = pal_network_stub::size; + return get_pal_status(); +} + +palStatus_t pal_send(palSocket_t socket, const void* buf, size_t len, size_t* sentDataSize) +{ + *sentDataSize = pal_network_stub::size; + return get_pal_status(); +} + +palStatus_t pal_asynchronousSocket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palAsyncSocketCallback_t callback, palSocket_t* socket) +{ + //memcpy(socket, pal_network_stub::socket, sizeof(pal_network_stub::socket)); + callback(); + return get_pal_status(); +} + +palStatus_t pal_getAddressInfo(const char* url, palSocketAddress_t* address, palSocketLength_t* addressLength) +{ + memcpy(address, &pal_network_stub::socket_address, sizeof(pal_network_stub::socket_address)); + *addressLength = sizeof(pal_network_stub::socket_address); + return get_pal_status(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/pal_network_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef PAL_NETWORK_STUB_H +#define PAL_NETWORK_STUB_H + +#include "pal_network.h" + +namespace pal_network_stub +{ + extern palStatus_t status; + extern palStatus_t new_status; + extern uint32_t change_status_count; //status changed to new_status after this turns to 0 + + extern palSocket_t socket; + extern palSocketAddress_t socket_address; + extern palIpV4Addr_t ipv4_address; + extern palIpV6Addr_t ipv6_address; + extern size_t size; + extern uint32_t uint32_value; + extern void *void_value; + +} + +#endif // PAL_NETWORK_STUB_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/pal_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "pal_stub.h" + +palStatus_t pal_stub::status; + +palStatus_t pal_init() +{ + return pal_stub::status; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/test/mbed-client-classic/unittest/stub/pal_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef PAL_STUB_H +#define PAL_STUB_H + +#include "pal.h" + +namespace pal_stub +{ + extern palStatus_t status; +} + +#endif // PAL_STUB_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-classic/xsl_script.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (c) 2015 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. + +echo +echo "Creating report" +echo + +echo '<?xml version="1.0" encoding="UTF-8" ?> +<?xml-stylesheet type="text/xsl" href="junit_xsl.xslt"?> +<list>' >> lcov/index.xml + +for f in lcov/results/*.xml +do +name=${f##*/} +echo '<entry name="results/'"$name"'" />'>> lcov/index.xml +done + +echo '</list>' >> lcov/index.xml + +echo +echo "Report created to lcov/index.xml (outputs html)" +echo \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-client-mbed-tls/#7e1b6d81503843ee98192e11f31df12508938c9d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +0205be29fcfcbeb729fbdac52c30d726d34c9160 not-for-merge branch 'cert-expiration-verify' of https://github.com/ARMmbed/mbed-client-mbed-tls +eaf04f0792a7820fea833f48d7c870b44366fe49 not-for-merge branch 'cert_parse_fix' of https://github.com/ARMmbed/mbed-client-mbed-tls +0e12068b07f1a700536a9d28816bdd3a80450743 not-for-merge branch 'cert_parsing_fix' of https://github.com/ARMmbed/mbed-client-mbed-tls +e5ac927acf771a7e2b38928f0aff88c66eeaa1b4 not-for-merge branch 'compiler_warning_fixes' of https://github.com/ARMmbed/mbed-client-mbed-tls +88fb05322b85baf730446ccffbb75d59b785add4 not-for-merge branch 'demo_port' of https://github.com/ARMmbed/mbed-client-mbed-tls +4d2bbea0f3c70fb7b258c835c742aafb36f18211 not-for-merge branch 'fix_armcc' of https://github.com/ARMmbed/mbed-client-mbed-tls +4a2759500c587ab01f5f00f5584d5439ed1a9c81 not-for-merge branch 'fix_compiling_errors' of https://github.com/ARMmbed/mbed-client-mbed-tls +621cbdfc9ffcc299bbaf531bf9c1d59bbb2f88ef not-for-merge branch 'fix_entropy_init' of https://github.com/ARMmbed/mbed-client-mbed-tls +8f9feda2361ce19db54ea03c9186c8337f0bb201 not-for-merge branch 'fix_unittests_ip6tos' of https://github.com/ARMmbed/mbed-client-mbed-tls +cd30631df5df484dc71af366c537d8653b9f46a2 not-for-merge branch 'handle_mbedtls_handshake_errors' of https://github.com/ARMmbed/mbed-client-mbed-tls +2c3594709ee52d45dc1cc2c5eca7db0628b1585e not-for-merge branch 'handshake_continue_event' of https://github.com/ARMmbed/mbed-client-mbed-tls +4b47e994ee65f224d2362a40a6eee8b83a231857 not-for-merge branch 'handshake_while_loop' of https://github.com/ARMmbed/mbed-client-mbed-tls +fbc90ed9d4a3b115fc5b4f857c47eb2779c30b51 not-for-merge branch 'makefile_compilation' of https://github.com/ARMmbed/mbed-client-mbed-tls +60a6d56e4ebd30fd3fba8375037e3a8ef0017f28 not-for-merge branch 'master' of https://github.com/ARMmbed/mbed-client-mbed-tls +7550b75a46bd3af0d2ac3ea95157acbab08360d8 not-for-merge branch 'mbed-cloud-client-rel1.2' of https://github.com/ARMmbed/mbed-client-mbed-tls +fb730ea6bff1c05c2c1bcbed1fe18253d2539ae9 not-for-merge branch 'mbed-cloud-client-rel1.2-int' of https://github.com/ARMmbed/mbed-client-mbed-tls +c3c89081866aa12f8f01af2b1a9e712d19b218bb not-for-merge branch 'remove_extra_operation' of https://github.com/ARMmbed/mbed-client-mbed-tls +6bc45c737df0412b0798337e5b583002ad759a73 not-for-merge branch 'template' of https://github.com/ARMmbed/mbed-client-mbed-tls +85326677a89dbb9238357520cd38a8c88af71d81 not-for-merge branch 'valid_from_valid_to_pal_parsing' of https://github.com/ARMmbed/mbed-client-mbed-tls +3ec557e640dbaad858d08a684f3b336dd6468701 not-for-merge branch 'weak-entropy-poll-seed' of https://github.com/ARMmbed/mbed-client-mbed-tls +f50ae52b848371530242a9dd7259dfb1e7aeab39 not-for-merge tag 'RR1.2.0-EA' of https://github.com/ARMmbed/mbed-client-mbed-tls +e45c668551dd520a78975c9fb16777ec17bdad04 not-for-merge tag 'RR1.2.0-RC10' of https://github.com/ARMmbed/mbed-client-mbed-tls +5b0aadef5a3ecf1b70802b3856a7c835cae464fc not-for-merge tag 'RR1.2.0-RC11' of https://github.com/ARMmbed/mbed-client-mbed-tls +bf0234aabf5442178497b6b9f6ae8d85f60e0145 not-for-merge tag 'RR1.2.0-RC6' of https://github.com/ARMmbed/mbed-client-mbed-tls +e66280c1aaf5f9df2887ffd7540ac46255883f2c not-for-merge tag 'RR1.2.0-RC7' of https://github.com/ARMmbed/mbed-client-mbed-tls +14571751b439ad114902a13a01329b5ba43b8428 not-for-merge tag 'RR1.2.0-RC8' of https://github.com/ARMmbed/mbed-client-mbed-tls +931823bf99c44734f2e907fbd3162309c96d53d8 not-for-merge tag 'RR1.2.0-RC9' of https://github.com/ARMmbed/mbed-client-mbed-tls +30eb8cf376a8ae788c490fb85cb9a7fad7719775 not-for-merge tag 'v3.0.4' of https://github.com/ARMmbed/mbed-client-mbed-tls +7ead3ef2f0b2c9c24afe7ad79f1d83ade4d1ab2f not-for-merge tag 'RR1.2.0-RC1' of https://github.com/ARMmbed/mbed-client-mbed-tls +8a308c16f217ca82987c64d3fe176a26757e9d2c not-for-merge tag 'RR1.2.0-RC2' of https://github.com/ARMmbed/mbed-client-mbed-tls +89155b1544f82857a782a60b6c26a17d6600c22b not-for-merge tag 'RR1.2.0-RC3' of https://github.com/ARMmbed/mbed-client-mbed-tls +476cb540331a6c7e598dd2e620f5f4e0ecc12373 not-for-merge tag 'RR1.2.0-RC4' of https://github.com/ARMmbed/mbed-client-mbed-tls +e3188ab7c2bd27d2cbfd3f16d6bf680075e3a4cb not-for-merge tag 'RR1.2.0-RC5' of https://github.com/ARMmbed/mbed-client-mbed-tls
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7e1b6d81503843ee98192e11f31df12508938c9d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +cf4587ec55ca1f63d72dcc35581d8922d1a4043f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/mbed-client-mbed-tls/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file mbed-client/mbed-client-mbed-tls/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 cf4587ec55ca1f63d72dcc35581d8922d1a4043f www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189607 +0000 clone: from https://github.com/ARMmbed/mbed-client-mbed-tls/ +cf4587ec55ca1f63d72dcc35581d8922d1a4043f 7e1b6d81503843ee98192e11f31df12508938c9d www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189608 +0000 checkout: moving from master to 7e1b6d81503843ee98192e11f31df12508938c9d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 cf4587ec55ca1f63d72dcc35581d8922d1a4043f www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189607 +0000 clone: from https://github.com/ARMmbed/mbed-client-mbed-tls/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 cf4587ec55ca1f63d72dcc35581d8922d1a4043f www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189607 +0000 clone: from https://github.com/ARMmbed/mbed-client-mbed-tls/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/cert-expiration-verify Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 0205be29fcfcbeb729fbdac52c30d726d34c9160 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/cert_parsing_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 0e12068b07f1a700536a9d28816bdd3a80450743 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/fix_armcc Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4d2bbea0f3c70fb7b258c835c742aafb36f18211 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/fix_compiling_errors Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 4a2759500c587ab01f5f00f5584d5439ed1a9c81 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/fix_entropy_init Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 621cbdfc9ffcc299bbaf531bf9c1d59bbb2f88ef www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/handshake_continue_event Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 2c3594709ee52d45dc1cc2c5eca7db0628b1585e www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +cf4587ec55ca1f63d72dcc35581d8922d1a4043f 60a6d56e4ebd30fd3fba8375037e3a8ef0017f28 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/mbed-cloud-client-rel1.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +cf4587ec55ca1f63d72dcc35581d8922d1a4043f 7550b75a46bd3af0d2ac3ea95157acbab08360d8 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/mbed-cloud-client-rel1.2-int Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 fb730ea6bff1c05c2c1bcbed1fe18253d2539ae9 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/remove_extra_operation Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 c3c89081866aa12f8f01af2b1a9e712d19b218bb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/template Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 6bc45c737df0412b0798337e5b583002ad759a73 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/logs/refs/remotes/origin/valid_from_valid_to_pal_parsing Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 85326677a89dbb9238357520cd38a8c88af71d81 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787097 +0000 fetch --append origin: storing head
Binary file mbed-client/mbed-client-mbed-tls/.git/objects/pack/pack-abdec6ea92c228b4264f9e8e986b2d81062574b4.idx has changed
Binary file mbed-client/mbed-client-mbed-tls/.git/objects/pack/pack-abdec6ea92c228b4264f9e8e986b2d81062574b4.pack has changed
Binary file mbed-client/mbed-client-mbed-tls/.git/objects/pack/pack-cd2489719b7eb01fddf976d917b0217a1c5d1426.idx has changed
Binary file mbed-client/mbed-client-mbed-tls/.git/objects/pack/pack-cd2489719b7eb01fddf976d917b0217a1c5d1426.pack has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,108 @@ +# pack-refs with: peeled +eaf04f0792a7820fea833f48d7c870b44366fe49 refs/remotes/origin/cert_parse_fix +e5ac927acf771a7e2b38928f0aff88c66eeaa1b4 refs/remotes/origin/compiler_warning_fixes +88fb05322b85baf730446ccffbb75d59b785add4 refs/remotes/origin/demo_port +8f9feda2361ce19db54ea03c9186c8337f0bb201 refs/remotes/origin/fix_unittests_ip6tos +cd30631df5df484dc71af366c537d8653b9f46a2 refs/remotes/origin/handle_mbedtls_handshake_errors +4b47e994ee65f224d2362a40a6eee8b83a231857 refs/remotes/origin/handshake_while_loop +fbc90ed9d4a3b115fc5b4f857c47eb2779c30b51 refs/remotes/origin/makefile_compilation +cf4587ec55ca1f63d72dcc35581d8922d1a4043f refs/remotes/origin/master +cf4587ec55ca1f63d72dcc35581d8922d1a4043f refs/remotes/origin/mbed-cloud-client-rel1.2 +da088ef1e4d3cf0b4ca341bbb2c0d781c8a42841 refs/remotes/origin/pal_tls +3ec557e640dbaad858d08a684f3b336dd6468701 refs/remotes/origin/weak-entropy-poll-seed +aeca1b39e3b376b62be0f55bbb7fb01dcf4c012f refs/tags/beta-release +69780251dd8f06815a39362aa459b2181494c3a8 refs/tags/mbed-os-5.0-rc1 +^68f93f7834e9cdd377239b2889d137771afb8d2b +5c83a440973257defca5e143aceb6334477eed36 refs/tags/mbedCloudClient-R1.1 +^7e1b6d81503843ee98192e11f31df12508938c9d +de8ec3fab9fbe6a113330d48a420cf31ab27179e refs/tags/mbedCloudClient-R1.1-RC1 +^7e1b6d81503843ee98192e11f31df12508938c9d +2e75b84730a1a2a0820cee9ea7dac83144768dc4 refs/tags/mbedCloudClient-R1.1-RC2 +^7e1b6d81503843ee98192e11f31df12508938c9d +83b64ad35a08a4f939b132e810d4e97ba021b389 refs/tags/mbedCloudClient-R1.1-RC3 +^7e1b6d81503843ee98192e11f31df12508938c9d +b3e626c7c5fb88f6f601ab7d4a62fbede24d810e refs/tags/mbedCloudClient-r0.8 +^7e1b6d81503843ee98192e11f31df12508938c9d +f0b800e7737478fe17a3a98725749b825831d759 refs/tags/mbedCloudClient-r0.8.1 +^7e1b6d81503843ee98192e11f31df12508938c9d +49beb573e2409a7b3103643784ebbe80c0f23864 refs/tags/mbedCloudClient-r0.8.2 +^7e1b6d81503843ee98192e11f31df12508938c9d +7759d149fa043a8a9cca8376c7c5c34972415d10 refs/tags/mbedCloudClient-r1.0 +^7e1b6d81503843ee98192e11f31df12508938c9d +052b58aaa9e72e527d34bafcd692145107ff6cc9 refs/tags/mbedos-16.01-release +052b58aaa9e72e527d34bafcd692145107ff6cc9 refs/tags/mbedos-16.03-release +6e953a9eed8c8aa671b764fbfad0ce05d9cf224e refs/tags/mbedos-2016q1-oob1 +f765c211ac01547db7cad4a8b9c2e4cdb287a418 refs/tags/mbedos-2016q1-oob2 +052b58aaa9e72e527d34bafcd692145107ff6cc9 refs/tags/mbedos-2016q1-oob3 +cbbe7eda147eb8bedb357023d03131cebaefe3a0 refs/tags/mbedos-release-15-11 +c56688c277c1b1d41980217b42cf76048e6da5cf refs/tags/mbedos-techcon-oob2 +c16e6b50e8bbde6b44ad2b40aaf9a03a9f737107 refs/tags/test_tag +^7e1b6d81503843ee98192e11f31df12508938c9d +7cc99c9d2e0abfd7bd066e1c8d52c84a34011672 refs/tags/v0.0.1 +5a7d89354d813b4921d128ced42b0170b46fcd16 refs/tags/v0.0.2 +d923e15c5505667b20e6719ad15111de502fd8e0 refs/tags/v0.0.3 +d8290bbc0c78b6e64f76b2b13c4ce45d4969a935 refs/tags/v0.0.4 +^944ef6ef4944b8b53211a24623d480cce50840fe +f60c61bfbbab73469379bbf2a183f98d90011c0a refs/tags/v0.0.5 +e8b04b601f579d94d71681d90e515a52cecfab99 refs/tags/v0.0.6 +^c94ebf1cde19b326b86ab3a5be4a7c4320248525 +f43f899562b32ddc2731c1f9266661ba0131c343 refs/tags/v0.0.7 +^bdb3facc2028d53d5e9eeaea0ca5f4ec7a0b1e8e +3b5e2b4c08e344e81e1f2fc476f8ed600f015276 refs/tags/v0.0.8 +^502b69f17c219d20a3c420a17d49dc3153bbfe34 +7d7925dc98acbf66883c82df2387e5d5ee69b2f0 refs/tags/v0.0.9 +^aeca1b39e3b376b62be0f55bbb7fb01dcf4c012f +469ffd2475d24c56aa810b9da4508dbdc5c62ced refs/tags/v1.0.0 +^256a44848330a3c3ddb302ba84cdf986cfcb69a6 +1e66949394fce422162ba1e7ee258c41cb11214d refs/tags/v1.0.1 +^62eaf487a231b72855ba72d414a0c0c94e8dd3b8 +d8c16010f086ddae1c7e11afbdc018b3100fd6ac refs/tags/v1.0.10 +^d28c25b2e43fe1ede245ff91ae037ddd6a0c99dc +6cdc330888a3dccc1a16d5226670ae57adf2b887 refs/tags/v1.0.11 +^ae5879c8a3e9daa54d5d405f0be7a09998bea500 +84c5c555e4ea822844a887e9cdb596f00b9ba0f5 refs/tags/v1.0.12 +^46d100873514ef2b48d0407c99ec485574651acf +be053c81d00281e96765ced2457215ac7baf418c refs/tags/v1.0.13 +^de67583dfcca78d0e328ec9fd5941abf3eee5526 +07690963e3456e63cc26ad937f61160fe1cfb4fb refs/tags/v1.0.14 +^69c090233405850a03de59bc58dafc0ad0564b57 +d8811341fe0981223187ebad29502c4267c2fc0f refs/tags/v1.0.15 +^6e953a9eed8c8aa671b764fbfad0ce05d9cf224e +3e69a2fb57457c6419d31fb231a2bcf3d06399a4 refs/tags/v1.0.16 +^f765c211ac01547db7cad4a8b9c2e4cdb287a418 +de0faecd1cc70ba02225bcbf061efd3ba4fec1dd refs/tags/v1.0.3 +^5789be88a7b80637d2babc1d10e3109f4ef9efe6 +29bf6e5daebc49896791c2e96b749d6c88797835 refs/tags/v1.0.4 +^303463e1572f84a7a73f82b54e38ae01a88cae0d +ff43aec6271c1b5e99d38ea0fe99da3500a1d46f refs/tags/v1.0.5 +^7197b53fcff0521443bd1eb9a18b5392c9f36a89 +fec25ae90986273562fc117f16d5bdb01b98b73a refs/tags/v1.0.6 +^c56688c277c1b1d41980217b42cf76048e6da5cf +ea6a8b2c0a46608c886e4aacd92d802250971a1d refs/tags/v1.0.7 +^ed28ab48a3fe29bc4d19f152f1a9c6dd003bbd97 +ac71cb016865a175439a282232b871b28ee1f2ab refs/tags/v1.0.8 +^605de2ac0bf403169c3fac47bcdb027845f833c4 +afee50f739db099a6e7198bb0e4847a792a8050a refs/tags/v1.0.9 +^cbbe7eda147eb8bedb357023d03131cebaefe3a0 +e9b8916f65719bd91a82dc5fa405a3168e35dfe4 refs/tags/v1.1.0 +^052b58aaa9e72e527d34bafcd692145107ff6cc9 +39ce25b16e8c2c5ee3058b2dbd3549d44365672d refs/tags/v1.1.1 +^fc28b2d69e9a4db7f0f6de751902561f9dddda6f +06265a694db03d77c9e0c00da1733b03cc1b5c02 refs/tags/v1.1.2 +^036b6838c74acfb082e535948a718cbc4f8c7c4a +1ef8b3ad76c6e68b305f9308bbf776df92f36fea refs/tags/v1.1.3 +^ad50b398741b753b70820d5c80ff038e890ca00d +110ff673f8d54cde2b8305238b00c1a806f112f6 refs/tags/v1.1.4 +^dea553cc8746f7d26cec52748c6445345a643fc4 +bc5a94a7e81f84b3dcfd88f96e42d42e2aadb892 refs/tags/v2.0.0 +^3d471daf27e7536584702877b4ec6657c53261db +4003024ac14ba8f3e6801ebc6fcfea3dda0c8957 refs/tags/v2.0.1 +^a6803a62c24097ed19dbbf6464331aed1a9fd011 +5da185f6de7978e53c8a284b3d7f42563bd9a7f1 refs/tags/v3.0.0 +^ba2d65d2bf0d9f9194f297817e30e87f35f19cf9 +0680b78f0850abcc0e6d9c9f368f9d5878ca9afc refs/tags/v3.0.1 +^3854aab04b21732f81993342065cbf6b3721eaac +b80195a4cf61bdb6caa2cf8bbc44331672679194 refs/tags/v3.0.2 +^9f96f8bef8a8ca1a0f0815ef0a655add2c18abcb +72679bdab4444e8dc7235bbf42f7f46d0d3607cc refs/tags/v3.0.3 +^68f93f7834e9cdd377239b2889d137771afb8d2b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +cf4587ec55ca1f63d72dcc35581d8922d1a4043f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/cert-expiration-verify Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0205be29fcfcbeb729fbdac52c30d726d34c9160
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/cert_parsing_fix Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0e12068b07f1a700536a9d28816bdd3a80450743
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/fix_armcc Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4d2bbea0f3c70fb7b258c835c742aafb36f18211
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/fix_compiling_errors Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4a2759500c587ab01f5f00f5584d5439ed1a9c81
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/fix_entropy_init Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +621cbdfc9ffcc299bbaf531bf9c1d59bbb2f88ef
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/handshake_continue_event Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +2c3594709ee52d45dc1cc2c5eca7db0628b1585e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +60a6d56e4ebd30fd3fba8375037e3a8ef0017f28
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/mbed-cloud-client-rel1.2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7550b75a46bd3af0d2ac3ea95157acbab08360d8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/mbed-cloud-client-rel1.2-int Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +fb730ea6bff1c05c2c1bcbed1fe18253d2539ae9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/remove_extra_operation Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +c3c89081866aa12f8f01af2b1a9e712d19b218bb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/template Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +6bc45c737df0412b0798337e5b583002ad759a73
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/remotes/origin/valid_from_valid_to_pal_parsing Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +85326677a89dbb9238357520cd38a8c88af71d81
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-EA Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +f50ae52b848371530242a9dd7259dfb1e7aeab39
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC1 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +7ead3ef2f0b2c9c24afe7ad79f1d83ade4d1ab2f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC10 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e45c668551dd520a78975c9fb16777ec17bdad04
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC11 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +5b0aadef5a3ecf1b70802b3856a7c835cae464fc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +8a308c16f217ca82987c64d3fe176a26757e9d2c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC3 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +89155b1544f82857a782a60b6c26a17d6600c22b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC4 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +476cb540331a6c7e598dd2e620f5f4e0ecc12373
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC5 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e3188ab7c2bd27d2cbfd3f16d6bf680075e3a4cb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC6 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +bf0234aabf5442178497b6b9f6ae8d85f60e0145
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC7 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +e66280c1aaf5f9df2887ffd7540ac46255883f2c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC8 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +14571751b439ad114902a13a01329b5ba43b8428
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/RR1.2.0-RC9 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +931823bf99c44734f2e907fbd3162309c96d53d8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.git/refs/tags/v3.0.4 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +30eb8cf376a8ae788c490fb85cb9a7fad7719775
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.gitignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,7 @@ +.yotta.json +coverage/ +lcov/ +yotta_modules/ +yotta_targets/ +upload.tar.gz +build/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/.mbedignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +test/*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/LICENSE Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +Unless specifically indicated otherwise in a file, files are licensed +under the Apache 2.0 license, as can be found in: apache-2.0.txt \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,73 @@ +# +# Makefile for running unit tests +# +# List of subdirectories to build +TEST_FOLDER := ./test/ + +LIB = libmbed-client-mbedtls.a + +# List of unit test directories for libraries +UNITTESTS := $(sort $(dir $(wildcard $(TEST_FOLDER)*/unittest/*))) +TESTDIRS := $(UNITTESTS:%=build-%) +CLEANTESTDIRS := $(UNITTESTS:%=clean-%) +COVERAGEFILE := ./lcov/coverage.info + +include sources.mk +include include_dirs.mk + +override CFLAGS += $(addprefix -I,$(INCLUDE_DIRS)) +override CFLAGS += $(addprefix -D,$(FLAGS)) +ifeq ($(DEBUG),1) +override CFLAGS += -DHAVE_DEBUG +endif + +# +# Define compiler toolchain +# +include toolchain_rules.mk + +$(eval $(call generate_rules,$(LIB),$(SRCS))) + +# Extend default clean rule +clean: clean-extra + +$(TESTDIRS): + @yotta target frdm-k64f-gcc + @yotta install mbed-client + @yotta install mbed-client-mbed-os + @make -C $(@:build-%=%) + +$(CLEANDIRS): + @make -C $(@:clean-%=%) clean + +$(CLEANTESTDIRS): + @make -C $(@:clean-%=%) clean + +.PHONY: test +test: $(TESTDIRS) + @rm -rf ./lcov + @rm -rf ./coverage + @mkdir -p lcov + @mkdir -p lcov/results + @mkdir coverage + @find ./test -name '*.xml' | xargs cp -t ./lcov/results/ + @rm -f lcov/index.xml + @./xsl_script.sh + @cp junit_xsl.xslt lcov/. + @xsltproc -o lcov/testresults.html lcov/junit_xsl.xslt lcov/index.xml + @rm -f lcov/junit_xsl.xslt + @rm -f lcov/index.xml + @find ./ -name '*.gcno' | xargs cp --backup=numbered -t ./coverage/ + @find ./ -name '*.gcda' | xargs cp --backup=numbered -t ./coverage/ + gcovr --object-directory ./coverage --exclude-unreachable-branches --exclude '/usr' --exclude '.*mbed-client-mbed-tls_unit_tests_master*.' --exclude '.*mbed-client-mbed-os*.' --exclude '.*common*.' --exclude '.*mbed-net-sockets.v0*.' --exclude '.*stub*.' --exclude '/yotta_modules/' -x -o ./lcov/gcovr.xml + @lcov -d test/. -c -o $(COVERAGEFILE) + @lcov -q -r $(COVERAGEFILE) "/usr*" -o $(COVERAGEFILE) + @lcov -q -r $(COVERAGEFILE) "/test*" -o $(COVERAGEFILE) + @lcov -q -r $(COVERAGEFILE) "/mbed-client/*" -o $(COVERAGEFILE) + @genhtml -q $(COVERAGEFILE) --show-details --output-directory lcov/html + @yotta uninstall mbed-client + @yotta uninstall mbed-client-mbed-os + @echo mbed-client-mbed-tls module unit tests built + +clean-extra: $(CLEANDIRS) \ + $(CLEANTESTDIRS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# mbed-client-mbedtls +Mbedtls specific implementation, which can be used by mbed clients
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/apache-2.0.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/include_dirs.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +INCLUDE_DIRS := \ + ../ \ + . \ + ../../nsdl-c \ + ../../libService/libService \ + ../../libService/exported-libs/mbed-client-libservice \ + ../../libService \ + ../../mbedtls/include \ + ../lwm2m-client \ + ../lwm2m-client/mbed-client \ + ../lwm2m-client-linux/source \ + ../lwm2m-client-mbedtls \ + source \ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/junit_xsl.xslt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + +<xsl:output encoding="UTF-8" indent="yes" method="html"/> +<xsl:strip-space elements="*"/> + +<xsl:variable name="list" + select="document('index.xml')/list" /> + +<xsl:template match="/"> + <h1> + Unittest report + </h1> + + <p> + <b> + Total tests run <xsl:value-of select="sum(document($list/entry/@name)/testsuite/@tests)"/> + , failures: <xsl:value-of select="sum(document($list/entry/@name)/testsuite/@failures) + sum(document($list/entry/@name)/testsuite/@errors)"/> + </b> + + <xsl:for-each select="document($list/entry/@name)" > + <xsl:apply-templates select="testsuite"/> + </xsl:for-each> + </p> +</xsl:template> + +<xsl:template match="testsuite"> + <h2> + <xsl:value-of select="@name" /> + </h2> + <table border="1" cellSpacing="0" cellPadding="10" > + <tr> + <th>Tests run</th> + <th>Tests failed</th> + <th>Other errors</th> + </tr> + <tr> + <td><xsl:value-of select="@tests"/></td> + <td><xsl:value-of select="@failures"/></td> + <td><xsl:value-of select="@errors"/></td> + </tr> + </table> + <br/> + <table border="1" cellSpacing="0" cellPadding="10" > + <tr> + <th>Tests name</th> + <th>PASS/FAIL</th> + <th>Failing case</th> + <th>Reason</th> + </tr> + <xsl:apply-templates select="testcase"/> + </table> +</xsl:template> + +<xsl:template match="testcase"> + <xsl:choose> + <xsl:when test="failure"> + <tr><td><font color="#FF0000"><xsl:value-of select="@name" /></font></td><xsl:apply-templates select="failure"/></tr> + </xsl:when> + <xsl:when test="error"> + <tr><td><font color="#FF0000"><xsl:value-of select="@name" /></font></td><xsl:apply-templates select="error"/></tr> + </xsl:when> + <xsl:otherwise> + <tr><td><xsl:value-of select="@name" /></td><td><font color="#00FF00">PASS</font></td><td></td><td></td></tr> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="failure"> + <td> + <b><font color="#FF0000">FAIL</font></b> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@message" /> + </font> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@type" /> + </font> + </td> +</xsl:template> + +<xsl:template match="error"> + <td> + <b><font color="#FF0000">FAIL</font></b> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@message" /> + </font> + </td> + <td> + <font color="#ff0000"> + <xsl:value-of select="@type" /> + </font> + </td> +</xsl:template> + +</xsl:stylesheet> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/mbed-client-mbedtls/m2mconnectionsecuritypimpl.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef __M2M_CONNECTION_SECURITY_PIMPL_H__ +#define __M2M_CONNECTION_SECURITY_PIMPL_H__ + +#include "mbed-client/m2mconnectionsecurity.h" +#include "mbed-client/m2mtimerobserver.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2msecurity.h" + +#include "mbedtls/config.h" +#include "mbedtls/platform.h" +#include "mbedtls/debug.h" +#include "mbedtls/ssl.h" +#include "mbedtls/entropy.h" +#include "mbedtls/ctr_drbg.h" +#include "mbedtls/error.h" +#include "mbedtls/certs.h" +#include "mbedtls/entropy_poll.h" + +class M2MTimer; + +//TODO: Should we let application to select these or not?? +const static int PSK_SUITES[] = { + MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, + MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, + 0 +}; + + +/** + * @brief The M2MConnectionSecurityPimpl class + */ +class M2MConnectionSecurityPimpl : public M2MTimerObserver { + +private: + + // Prevents the use of assignment operator by accident. + M2MConnectionSecurityPimpl& operator=( const M2MConnectionSecurityPimpl& /*other*/ ); + // Prevents the use of copy constructor by accident + M2MConnectionSecurityPimpl( const M2MConnectionSecurityPimpl& /*other*/ ); + +public: + + /** + * @brief Constructor + */ + M2MConnectionSecurityPimpl(M2MConnectionSecurity::SecurityMode mode); + + /** + * @brief Destructor + */ + virtual ~M2MConnectionSecurityPimpl(); + + /** + * \brief Resets the socket connection states. + */ + void reset(); + + /** + * \brief Initiatlizes the socket connection states. + */ + int init(const M2MSecurity *security); + + /** + * \brief Starts the connection in non-blocking mode. + * \param connHandler The ConnectionHandler object that maintains the socket. + * \return Returns the state of the connection. Successful or not. + */ + int start_connecting_non_blocking(M2MConnectionHandler* connHandler); + + /** + * \brief Continues connectivity logic for secure connection. + * \return Returns an error code if any while continuing the connection sequence. + */ + int continue_connecting(); + + /** + * \brief Connects the client to the server. + * \param connHandler The ConnectionHandler object that maintains the socket. + * \return Returns the state of the connection. Successful or not. + */ + int connect(M2MConnectionHandler* connHandler); + + /** + * \brief Sends data to the server. + * \param message The data to be sent. + * \param len The length of the data. + * @return Indicates whether the data is sent successfully or not. + */ + int send_message(unsigned char *message, int len); + + /** + * \brief Reads the data received from the server. + * \param message The data to be read. + * \param len The length of the data. + * \return Indicates whether the data is read successfully or not. + */ + int read(unsigned char* buffer, uint16_t len); + + /** + * \brief Sets the function callback that will be called by mbed-client for + * fetching random number from application for ensuring strong entropy. + * \param random_callback A function pointer that will be called by mbed-client + * while performing secure handshake. + * Function signature should be uint32_t (*random_number_callback)(void); + */ + void set_random_number_callback(random_number_cb callback); + + /** + * \brief Sets the function callback that will be called by mbed-client for + * providing entropy source from application for ensuring strong entropy. + * \param entropy_callback A function pointer that will be called by mbed-client + * while performing secure handshake. + * Function signature , if using mbed-client-mbedtls should be + * int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, + * size_t len, size_t *olen); + */ + void set_entropy_callback(entropy_cb callback); + +protected: //From M2MTimerObserver + + virtual void timer_expired(M2MTimerObserver::Type type); + +private: + + int start_handshake(); + +private: + + bool _init_done; + mbedtls_ssl_config _conf; + mbedtls_ssl_context _ssl; + mbedtls_x509_crt _cacert; + mbedtls_x509_crt _owncert; + mbedtls_pk_context _pkey; + mbedtls_ctr_drbg_context _ctr_drbg; + mbedtls_entropy_context _entropy; + uint32_t _flags; + M2MTimer *_timer; + M2MConnectionSecurity::SecurityMode _sec_mode; + + friend class Test_M2MConnectionSecurityPimpl; +}; + +#endif //__M2M_CONNECTION_SECURITY_PIMPL_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/module.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,19 @@ +{ + "name": "mbed-client-mbedtls", + "version": "3.0.3", + "description": "Mbedtls specific implementation, which can be used by mbed client", + "keywords": [ + "mbed-client-mbedtls" + ], + "author": "Antti Kauppila", + "repository": { + "url": "git@github.com:ARMmbed/mbed-client-mbedtls.git", + "type": "git" + }, + "homepage": "https://github.com/ARMmbed/mbed-client-mbedtls", + "license": "Apache-2.0", + "dependencies": { + "mbedtls": "^2.0.0" + }, + "targetDependencies": {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/run_unit_tests_with_valgrind.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/bash +# Execute script with root path where to find binaries. +# For example ./run_unit_tests_with_valgrind.sh ./build/x86-linux-native-coverage/test/mbedclient/ + +input="binaries.txt" +valgrind_logs="valgrind_logs" +rm -rf $valgrind_logs +mkdir $valgrind_logs +find $1 -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print > $input +while file= read -r binary +do + valgrind --track-origins=yes --xml=yes --xml-file="${valgrind_logs}/valgrind_$(basename $binary).xml" "$binary" + +done < "$input"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/source/m2mconnectionsecurity.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include <string.h> +#include "mbed-client/m2mconnectionhandler.h" +#include "mbed-client/m2mconnectionsecurity.h" +#include "mbed-client/m2mtimer.h" +#include "mbed-client/m2msecurity.h" +#include "mbed-client-mbedtls/m2mconnectionsecuritypimpl.h" + +M2MConnectionSecurity::M2MConnectionSecurity(SecurityMode mode) +{ + _private_impl = new M2MConnectionSecurityPimpl(mode); +} + +M2MConnectionSecurity::~M2MConnectionSecurity(){ + delete _private_impl; +} + +void M2MConnectionSecurity::reset(){ + _private_impl->reset(); +} + +int M2MConnectionSecurity::init(const M2MSecurity *security){ + return _private_impl->init(security); +} + +int M2MConnectionSecurity::start_connecting_non_blocking(M2MConnectionHandler* connHandler) +{ + return _private_impl->start_connecting_non_blocking(connHandler); +} + +int M2MConnectionSecurity::continue_connecting() +{ + return _private_impl->continue_connecting(); +} + +int M2MConnectionSecurity::connect(M2MConnectionHandler* connHandler){ + return _private_impl->connect(connHandler); +} + +int M2MConnectionSecurity::send_message(unsigned char *message, int len){ + return _private_impl->send_message(message, len); +} + +int M2MConnectionSecurity::read(unsigned char* buffer, uint16_t len){ + return _private_impl->read(buffer, len); +} + +void M2MConnectionSecurity::set_random_number_callback(random_number_cb callback) +{ + _private_impl->set_random_number_callback(callback); +} + +void M2MConnectionSecurity::set_entropy_callback(entropy_cb callback) +{ + _private_impl->set_entropy_callback(callback); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/source/m2mconnectionsecuritypimpl.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,454 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbed-client/m2mconnectionhandler.h" +#include "mbed-client-mbedtls/m2mconnectionsecuritypimpl.h" +#include "mbed-client/m2mtimer.h" +#include "mbed-client/m2msecurity.h" +#include "mbed-trace/mbed_trace.h" +#include "mbedtls/debug.h" +#include <string.h> + +#define TRACE_GROUP "mClt" + +void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ); +int mbedtls_timing_get_delay( void *data ); +int entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ); +//Point these back to M2MConnectionHandler!!! +int f_send( void *ctx, const unsigned char *buf, size_t len ); +int f_recv(void *ctx, unsigned char *buf, size_t len); +int f_recv_timeout(void *ctx, unsigned char *buf, size_t len, uint32_t some); + +bool cancelled; +random_number_cb __random_number_callback; +entropy_cb __entropy_callback; + +//Comment out following define to enable tracing from mbedtls +//#define ENABLE_MBED_CLIENT_MBED_TLS_DEBUGS +#ifdef ENABLE_MBED_CLIENT_MBED_TLS_DEBUGS +static void mbedtls_debug( void *ctx, int level, + const char *file, int line, const char *str ) +{ + ((void) level); + tr_debug("%s", str); +} + +static int verify_cert_chains(void *data, mbedtls_x509_crt *crt, int depth, uint32_t *flags) +{ + char buf[1024]; + (void) data; + + printf("\nVerifying certificate at depth %d:\n", depth); + mbedtls_x509_crt_info(buf, sizeof (buf) - 1, " ", crt); + printf("%s", buf); + + if (*flags == 0) + printf("No verification issue for this certificate\n"); + else + { + mbedtls_x509_crt_verify_info(buf, sizeof (buf), " ! ", *flags); + printf("%s\n", buf); + } + + return 0; +} +#endif + +M2MConnectionSecurityPimpl::M2MConnectionSecurityPimpl(M2MConnectionSecurity::SecurityMode mode) + : _flags(0), + _sec_mode(mode) +{ + _init_done = false; + cancelled = true; + _timer = new M2MTimer(*this); + mbedtls_ssl_init( &_ssl ); + mbedtls_ssl_config_init( &_conf ); + mbedtls_x509_crt_init( &_cacert ); + mbedtls_x509_crt_init(&_owncert); + mbedtls_pk_init(&_pkey); + mbedtls_ctr_drbg_init( &_ctr_drbg ); + mbedtls_entropy_init( &_entropy ); +} + +M2MConnectionSecurityPimpl::~M2MConnectionSecurityPimpl(){ + mbedtls_ssl_config_free(&_conf); + mbedtls_ssl_free(&_ssl); + mbedtls_x509_crt_free(&_cacert); + mbedtls_x509_crt_free(&_owncert); + mbedtls_pk_free(&_pkey); + mbedtls_ctr_drbg_free( &_ctr_drbg ); + mbedtls_entropy_free( &_entropy ); + delete _timer; +} + +void M2MConnectionSecurityPimpl::timer_expired(M2MTimerObserver::Type type){ + tr_debug("M2MConnectionSecurityPimpl::timer_expired"); + if(type == M2MTimerObserver::Dtls && !cancelled){ + int error = continue_connecting(); + if(MBEDTLS_ERR_SSL_TIMEOUT == error || error == -1) { + tr_error("M2MConnectionSecurityPimpl::timer_expired - handshake timeout"); + if(_ssl.p_bio) { + M2MConnectionHandler* ptr = (M2MConnectionHandler*)_ssl.p_bio; + ptr->handle_connection_error(M2MConnectionHandler::SSL_HANDSHAKE_ERROR); + } + reset(); + } + } +} + +void M2MConnectionSecurityPimpl::reset(){ + _init_done = false; + cancelled = true; + mbedtls_ssl_config_free(&_conf); + mbedtls_ssl_free(&_ssl); + mbedtls_x509_crt_free(&_cacert); + mbedtls_x509_crt_free(&_owncert); + mbedtls_pk_free(&_pkey); + mbedtls_ctr_drbg_free( &_ctr_drbg ); + mbedtls_entropy_free( &_entropy ); + _timer->stop_timer(); +} + +int M2MConnectionSecurityPimpl::init(const M2MSecurity *security) +{ + tr_debug("M2MConnectionSecurityPimpl::init"); + int ret = -1; + if (security != NULL) { + const char *pers = "dtls_client"; + mbedtls_ssl_init( &_ssl ); + mbedtls_ssl_config_init( &_conf ); + mbedtls_x509_crt_init( &_cacert ); + mbedtls_x509_crt_init(&_owncert); + mbedtls_pk_init(&_pkey); + mbedtls_ctr_drbg_init( &_ctr_drbg ); + mbedtls_entropy_init( &_entropy ); + + int mode = MBEDTLS_SSL_TRANSPORT_DATAGRAM; + if( _sec_mode == M2MConnectionSecurity::TLS ){ + mode = MBEDTLS_SSL_TRANSPORT_STREAM; + } + + if( mbedtls_entropy_add_source( &_entropy, entropy_poll, NULL, + 128, 0 ) < 0 ){ + return -1; + } + if(__entropy_callback.entropy_source_ptr) { + if( mbedtls_entropy_add_source( &_entropy, __entropy_callback.entropy_source_ptr, + __entropy_callback.p_source,__entropy_callback.threshold, + __entropy_callback.strong ) < 0 ){ + return -1; + } + } + + if( mbedtls_ctr_drbg_seed( &_ctr_drbg, mbedtls_entropy_func, &_entropy, + (const unsigned char *) pers, + strlen( pers ) ) != 0 ) { + return -1; + } + + if( mbedtls_ssl_config_defaults( &_conf, + MBEDTLS_SSL_IS_CLIENT, + mode, 0 ) != 0 ) { + return -1; + } + + M2MSecurity::SecurityModeType cert_mode = + (M2MSecurity::SecurityModeType)security->resource_value_int(M2MSecurity::SecurityMode); + + // Note: these are relatively large buffers, no point to make copy of them here as mbedtls will make a copy of them. + const uint8_t *srv_public_key = NULL; + const uint8_t *public_key = NULL; + const uint8_t *sec_key = NULL; + + uint32_t srv_public_key_size = security->resource_value_buffer(M2MSecurity::ServerPublicKey, srv_public_key); + uint32_t public_key_size = security->resource_value_buffer(M2MSecurity::PublicKey, public_key); + uint32_t sec_key_size = security->resource_value_buffer(M2MSecurity::Secretkey, sec_key); + if( srv_public_key == NULL || public_key == NULL || sec_key == NULL || + srv_public_key_size == 0 || public_key_size == 0 || sec_key_size == 0 ){ + return -1; + } + + if( cert_mode == M2MSecurity::Certificate ){ + if ( mbedtls_x509_crt_parse( &_cacert, (const unsigned char *) srv_public_key, + srv_public_key_size + 1) < 0 || + mbedtls_x509_crt_parse( &_owncert, (const unsigned char *) public_key, + public_key_size + 1) < 0 || + mbedtls_pk_parse_key(&_pkey, (const unsigned char *) sec_key, + sec_key_size + 1, NULL, 0 ) < 0 ) { + ret = -1; + } else { + ret = 0; + } + + if ( ret == 0 ) { + mbedtls_ssl_conf_own_cert(&_conf, &_owncert, &_pkey); + mbedtls_ssl_conf_authmode( &_conf, MBEDTLS_SSL_VERIFY_REQUIRED ); + mbedtls_ssl_conf_ca_chain( &_conf, &_cacert, NULL ); + } + + } else if ( cert_mode == M2MSecurity::Psk ){ + if (mbedtls_ssl_conf_psk(&_conf, sec_key, sec_key_size, public_key, public_key_size) == 0) { + ret = 0; + } + mbedtls_ssl_conf_ciphersuites(&_conf, PSK_SUITES); + } else { + ret = -1; + } + +#ifdef ENABLE_MBED_CLIENT_MBED_TLS_DEBUGS + mbedtls_ssl_conf_dbg( &_conf, mbedtls_debug, stdout ); + mbedtls_debug_set_threshold(5); + mbedtls_ssl_conf_verify(&_conf, verify_cert_chains, NULL); +#endif + } + + if( ret == 0 ){ + _init_done = true; + } + tr_debug("M2MConnectionSecurityPimpl::init - ret %d", ret); + return ret; +} + + +int M2MConnectionSecurityPimpl::start_handshake(){ + tr_debug("M2MConnectionSecurityPimpl::start_handshake"); + int ret = -1; + do + { + ret = mbedtls_ssl_handshake( &_ssl ); + } + while( ret == MBEDTLS_ERR_SSL_WANT_READ || + ret == MBEDTLS_ERR_SSL_WANT_WRITE); + + if( ret != 0 ) { + ret = -1; + }else { + if( ( _flags = mbedtls_ssl_get_verify_result( &_ssl ) ) != 0 ) { + ret = -1; + } + } + tr_debug("M2MConnectionSecurityPimpl::start_handshake - OUT"); + return ret; +} + +int M2MConnectionSecurityPimpl::connect(M2MConnectionHandler* connHandler){ + + tr_debug("M2MConnectionSecurityPimpl::connect"); + int ret=-1; + if(!_init_done){ + return ret; + } + + mbedtls_ssl_conf_rng( &_conf, mbedtls_ctr_drbg_random, &_ctr_drbg ); + + if( ( ret = mbedtls_ssl_setup( &_ssl, &_conf ) ) != 0 ) { + return -1; + } + + mbedtls_ssl_set_bio( &_ssl, connHandler, + f_send, f_recv, f_recv_timeout ); + + mbedtls_ssl_set_timer_cb( &_ssl, _timer, mbedtls_timing_set_delay, + mbedtls_timing_get_delay ); + + ret = start_handshake(); + _timer->stop_timer(); + tr_debug("M2MConnectionSecurityPimpl::connect - handshake ret: %d, ssl state: %d", ret, _ssl.state); + return ret; +} + +int M2MConnectionSecurityPimpl::start_connecting_non_blocking(M2MConnectionHandler* connHandler) +{ + tr_debug("M2MConnectionSecurityPimpl::start_connecting_non_blocking"); + int ret=-1; + if(!_init_done){ + return ret; + } + + int mode = MBEDTLS_SSL_TRANSPORT_DATAGRAM; + if( _sec_mode == M2MConnectionSecurity::TLS ){ + mode = MBEDTLS_SSL_TRANSPORT_STREAM; + } + + if( ( ret = mbedtls_ssl_config_defaults( &_conf, + MBEDTLS_SSL_IS_CLIENT, + mode, 0 ) ) != 0 ) + { + return -1; + } + + // This is for non-blocking sockets total timeout is 1+2+4+8+16+29=60 seconds + mbedtls_ssl_conf_handshake_timeout( &_conf, 10000, 29000 ); + mbedtls_ssl_conf_rng( &_conf, mbedtls_ctr_drbg_random, &_ctr_drbg ); + + if( ( ret = mbedtls_ssl_setup( &_ssl, &_conf ) ) != 0 ) + { + return -1; + } + + mbedtls_ssl_set_bio( &_ssl, connHandler, + f_send, f_recv, f_recv_timeout ); + + mbedtls_ssl_set_timer_cb( &_ssl, _timer, mbedtls_timing_set_delay, + mbedtls_timing_get_delay ); + + ret = mbedtls_ssl_handshake_step( &_ssl ); + if( ret == 0 ){ + ret = mbedtls_ssl_handshake_step( &_ssl ); + } + + if( ret >= 0){ + ret = 1; + } else { + ret = -1; + } + tr_debug("M2MConnectionSecurityPimpl::start_connecting_non_blocking - handshake ret: %d, ssl state: %d", ret, _ssl.state); + return ret; +} + +int M2MConnectionSecurityPimpl::continue_connecting() +{ + tr_debug("M2MConnectionSecurityPimpl::continue_connecting"); + int ret=-1; + while( ret != M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ ){ + ret = mbedtls_ssl_handshake_step( &_ssl ); + if( MBEDTLS_ERR_SSL_WANT_READ == ret ){ + ret = M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + } + else if (ret != 0) { + break; + } + + if( _ssl.state == MBEDTLS_SSL_HANDSHAKE_OVER ){ + return 0; + } + } + tr_debug("M2MConnectionSecurityPimpl::continue_connecting, ret: %d", ret); + return ret; +} + +int M2MConnectionSecurityPimpl::send_message(unsigned char *message, int len){ + tr_debug("M2MConnectionSecurityPimpl::send_message"); + int ret=-1; + if(!_init_done){ + return ret; + } + + do ret = mbedtls_ssl_write( &_ssl, (unsigned char *) message, len ); + while( ret == MBEDTLS_ERR_SSL_WANT_READ || + ret == MBEDTLS_ERR_SSL_WANT_WRITE ); + + tr_debug("M2MConnectionSecurityPimpl::send_message - ret: %d", ret); + return ret; //bytes written +} + +int M2MConnectionSecurityPimpl::read(unsigned char* buffer, uint16_t len){ + int ret=-1; + if(!_init_done){ + tr_error("M2MConnectionSecurityPimpl::read - init not done!"); + return ret; + } + + memset( buffer, 0, len ); + do ret = mbedtls_ssl_read( &_ssl, buffer, len-1 ); + while( ret == MBEDTLS_ERR_SSL_WANT_READ || + ret == MBEDTLS_ERR_SSL_WANT_WRITE ); + + return ret; //bytes read +} + +int f_send( void *ctx, const unsigned char *buf, size_t len){ + M2MConnectionHandler* handler = ((M2MConnectionHandler *) ctx); + return handler->send_to_socket(buf, len); +} + +int f_recv(void *ctx, unsigned char *buf, size_t len){ + M2MConnectionHandler* handler = ((M2MConnectionHandler *) ctx); + return handler->receive_from_socket(buf, len); +} + +int f_recv_timeout(void *ctx, unsigned char *buf, size_t len, uint32_t /*some*/){ + return f_recv(ctx, buf, len); +} + +int entropy_poll( void *, unsigned char *output, size_t len, + size_t *olen ) +{ + uint32_t rdm = 0; + if(__random_number_callback) { + rdm = __random_number_callback(); + } else { + rdm = time(NULL); + } + for(uint16_t i=0; i < len; i++){ + srand(rdm); + output[i] = rand() % 256; + } + *olen = len; + + return( 0 ); +} + +void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ){ + tr_debug("mbedtls_timing_set_delay - intermediate: %d", int_ms); + tr_debug("mbedtls_timing_set_delay - final: %d", fin_ms); + M2MTimer* timer = static_cast<M2MTimer*> (data); + if(!timer) { + return; + } + if( int_ms > 0 && fin_ms > 0 ){ + tr_debug("mbedtls_timing_set_delay - start"); + cancelled = false; + timer->stop_timer(); + timer->start_dtls_timer(int_ms, fin_ms); + }else{ + tr_debug("mbedtls_timing_set_delay - stop"); + cancelled = true; + timer->stop_timer(); + } +} + +int mbedtls_timing_get_delay( void *data ){ + tr_debug("mbedtls_timing_get_delay"); + M2MTimer* timer = static_cast<M2MTimer*> (data); + if(!timer){ + return 0; + } + if(true == cancelled) { + tr_debug("mbedtls_timing_get_delay - ret -1"); + return -1; + } else if( timer->is_total_interval_passed() ){ + tr_debug("mbedtls_timing_get_delay - ret 2"); + return 2; + }else if( timer->is_intermediate_interval_passed() ){ + tr_debug("mbedtls_timing_get_delay - ret 1"); + return 1; + }else{ + tr_debug("mbedtls_timing_get_delay - ret 0"); + return 0; + } +} + +void M2MConnectionSecurityPimpl::set_random_number_callback(random_number_cb callback) +{ + __random_number_callback = callback; +} + +void M2MConnectionSecurityPimpl::set_entropy_callback(entropy_cb callback) +{ + __entropy_callback = callback; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/sources.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,7 @@ +SRCS += \ + source/m2mconnectionsecurity.cpp \ + source/m2mconnectionsecuritypimpl.cpp \ + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,23 @@ +#scan for folders having "Makefile" in them and remove 'this' to prevent loop +ifeq ($(OS),Windows_NT) +all: +clean: +else +DIRS := $(filter-out ./, $(sort $(dir $(shell find . -name 'Makefile')))) + +all: + for dir in $(DIRS); do \ + cd $$dir; make gcov; cd ..;\ + done + +clean: + for dir in $(DIRS); do \ + cd $$dir; make clean; cd ..;\ + done + rm -rf stubs/*gcov stubs/*gcda stubs/*o + rm -rf results/* + rm -rf coverages/* + rm -rf results + rm -rf coverages + +endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/MakefileWorker.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,562 @@ +#--------- +# +# MakefileWorker.mk +# +# Include this helper file in your makefile +# It makes +# A static library +# A test executable +# +# See this example for parameter settings +# examples/Makefile +# +#---------- +# Inputs - these variables describe what to build +# +# INCLUDE_DIRS - Directories used to search for include files. +# This generates a -I for each directory +# SRC_DIRS - Directories containing source file to built into the library +# SRC_FILES - Specific source files to build into library. Helpful when not all code +# in a directory can be built for test (hopefully a temporary situation) +# TEST_SRC_DIRS - Directories containing unit test code build into the unit test runner +# These do not go in a library. They are explicitly included in the test runner +# TEST_SRC_FILES - Specific source files to build into the unit test runner +# These do not go in a library. They are explicitly included in the test runner +# MOCKS_SRC_DIRS - Directories containing mock source files to build into the test runner +# These do not go in a library. They are explicitly included in the test runner +#---------- +# You can adjust these variables to influence how to build the test target +# and where to put and name outputs +# See below to determine defaults +# COMPONENT_NAME - the name of the thing being built +# TEST_TARGET - name the test executable. By default it is +# $(COMPONENT_NAME)_tests +# Helpful if you want 1 > make files in the same directory with different +# executables as output. +# CPPUTEST_HOME - where CppUTest home dir found +# TARGET_PLATFORM - Influences how the outputs are generated by modifying the +# CPPUTEST_OBJS_DIR and CPPUTEST_LIB_DIR to use a sub-directory under the +# normal objs and lib directories. Also modifies where to search for the +# CPPUTEST_LIB to link against. +# CPPUTEST_OBJS_DIR - a directory where o and d files go +# CPPUTEST_LIB_DIR - a directory where libs go +# CPPUTEST_ENABLE_DEBUG - build for debug +# CPPUTEST_USE_MEM_LEAK_DETECTION - Links with overridden new and delete +# CPPUTEST_USE_STD_CPP_LIB - Set to N to keep the standard C++ library out +# of the test harness +# CPPUTEST_USE_GCOV - Turn on coverage analysis +# Clean then build with this flag set to Y, then 'make gcov' +# CPPUTEST_MAPFILE - generate a map file +# CPPUTEST_WARNINGFLAGS - overly picky by default +# OTHER_MAKEFILE_TO_INCLUDE - a hook to use this makefile to make +# other targets. Like CSlim, which is part of fitnesse +# CPPUTEST_USE_VPATH - Use Make's VPATH functionality to support user +# specification of source files and directories that aren't below +# the user's Makefile in the directory tree, like: +# SRC_DIRS += ../../lib/foo +# It defaults to N, and shouldn't be necessary except in the above case. +#---------- +# +# Other flags users can initialize to sneak in their settings +# CPPUTEST_CXXFLAGS - flags for the C++ compiler +# CPPUTEST_CPPFLAGS - flags for the C++ AND C preprocessor +# CPPUTEST_CFLAGS - flags for the C complier +# CPPUTEST_LDFLAGS - Linker flags +#---------- + +# Some behavior is weird on some platforms. Need to discover the platform. + +# Platforms +UNAME_OUTPUT = "$(shell uname -a)" +MACOSX_STR = Darwin +MINGW_STR = MINGW +CYGWIN_STR = CYGWIN +LINUX_STR = Linux +SUNOS_STR = SunOS +UNKNWOWN_OS_STR = Unknown + +# Compilers +CC_VERSION_OUTPUT ="$(shell $(CXX) -v 2>&1)" +CLANG_STR = clang +SUNSTUDIO_CXX_STR = SunStudio + +UNAME_OS = $(UNKNWOWN_OS_STR) + +ifeq ($(findstring $(MINGW_STR),$(UNAME_OUTPUT)),$(MINGW_STR)) + UNAME_OS = $(MINGW_STR) +endif + +ifeq ($(findstring $(CYGWIN_STR),$(UNAME_OUTPUT)),$(CYGWIN_STR)) + UNAME_OS = $(CYGWIN_STR) +endif + +ifeq ($(findstring $(LINUX_STR),$(UNAME_OUTPUT)),$(LINUX_STR)) + UNAME_OS = $(LINUX_STR) +endif + +ifeq ($(findstring $(MACOSX_STR),$(UNAME_OUTPUT)),$(MACOSX_STR)) + UNAME_OS = $(MACOSX_STR) +#lion has a problem with the 'v' part of -a + UNAME_OUTPUT = "$(shell uname -pmnrs)" +endif + +ifeq ($(findstring $(SUNOS_STR),$(UNAME_OUTPUT)),$(SUNOS_STR)) + UNAME_OS = $(SUNOS_STR) + + SUNSTUDIO_CXX_ERR_STR = CC -flags +ifeq ($(findstring $(SUNSTUDIO_CXX_ERR_STR),$(CC_VERSION_OUTPUT)),$(SUNSTUDIO_CXX_ERR_STR)) + CC_VERSION_OUTPUT ="$(shell $(CXX) -V 2>&1)" + COMPILER_NAME = $(SUNSTUDIO_CXX_STR) +endif +endif + +ifeq ($(findstring $(CLANG_STR),$(CC_VERSION_OUTPUT)),$(CLANG_STR)) + COMPILER_NAME = $(CLANG_STR) +endif + +#Kludge for mingw, it does not have cc.exe, but gcc.exe will do +ifeq ($(UNAME_OS),$(MINGW_STR)) + CC := gcc +endif + +#And another kludge. Exception handling in gcc 4.6.2 is broken when linking the +# Standard C++ library as a shared library. Unbelievable. +ifeq ($(UNAME_OS),$(MINGW_STR)) + CPPUTEST_LDFLAGS += -static +endif +ifeq ($(UNAME_OS),$(CYGWIN_STR)) + CPPUTEST_LDFLAGS += -static +endif + + +#Kludge for MacOsX gcc compiler on Darwin9 who can't handle pendantic +ifeq ($(UNAME_OS),$(MACOSX_STR)) +ifeq ($(findstring Version 9,$(UNAME_OUTPUT)),Version 9) + CPPUTEST_PEDANTIC_ERRORS = N +endif +endif + +ifndef COMPONENT_NAME + COMPONENT_NAME = name_this_in_the_makefile +endif + +# Debug on by default +ifndef CPPUTEST_ENABLE_DEBUG + CPPUTEST_ENABLE_DEBUG = Y +endif + +# new and delete for memory leak detection on by default +ifndef CPPUTEST_USE_MEM_LEAK_DETECTION + CPPUTEST_USE_MEM_LEAK_DETECTION = Y +endif + +# Use the standard C library +ifndef CPPUTEST_USE_STD_C_LIB + CPPUTEST_USE_STD_C_LIB = Y +endif + +# Use the standard C++ library +ifndef CPPUTEST_USE_STD_CPP_LIB + CPPUTEST_USE_STD_CPP_LIB = Y +endif + +# Use gcov, off by default +ifndef CPPUTEST_USE_GCOV + CPPUTEST_USE_GCOV = N +endif + +ifndef CPPUTEST_PEDANTIC_ERRORS + CPPUTEST_PEDANTIC_ERRORS = Y +endif + +# Default warnings +ifndef CPPUTEST_WARNINGFLAGS + CPPUTEST_WARNINGFLAGS = -Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion +ifeq ($(CPPUTEST_PEDANTIC_ERRORS), Y) +# CPPUTEST_WARNINGFLAGS += -pedantic-errors + CPPUTEST_WARNINGFLAGS += -pedantic +endif +ifeq ($(UNAME_OS),$(LINUX_STR)) + CPPUTEST_WARNINGFLAGS += -Wsign-conversion +endif + CPPUTEST_CXX_WARNINGFLAGS = -Woverloaded-virtual + CPPUTEST_C_WARNINGFLAGS = -Wstrict-prototypes +endif + +#Wonderful extra compiler warnings with clang +ifeq ($(COMPILER_NAME),$(CLANG_STR)) +# -Wno-disabled-macro-expansion -> Have to disable the macro expansion warning as the operator new overload warns on that. +# -Wno-padded -> I sort-of like this warning but if there is a bool at the end of the class, it seems impossible to remove it! (except by making padding explicit) +# -Wno-global-constructors Wno-exit-time-destructors -> Great warnings, but in CppUTest it is impossible to avoid as the automatic test registration depends on the global ctor and dtor +# -Wno-weak-vtables -> The TEST_GROUP macro declares a class and will automatically inline its methods. Thats ok as they are only in one translation unit. Unfortunately, the warning can't detect that, so it must be disabled. + CPPUTEST_CXX_WARNINGFLAGS += -Weverything -Wno-disabled-macro-expansion -Wno-padded -Wno-global-constructors -Wno-exit-time-destructors -Wno-weak-vtables + CPPUTEST_C_WARNINGFLAGS += -Weverything -Wno-padded +endif + +# Uhm. Maybe put some warning flags for SunStudio here? +ifeq ($(COMPILER_NAME),$(SUNSTUDIO_CXX_STR)) + CPPUTEST_CXX_WARNINGFLAGS = + CPPUTEST_C_WARNINGFLAGS = +endif + +# Default dir for temporary files (d, o) +ifndef CPPUTEST_OBJS_DIR +ifndef TARGET_PLATFORM + CPPUTEST_OBJS_DIR = objs +else + CPPUTEST_OBJS_DIR = objs/$(TARGET_PLATFORM) +endif +endif + +# Default dir for the outout library +ifndef CPPUTEST_LIB_DIR +ifndef TARGET_PLATFORM + CPPUTEST_LIB_DIR = lib +else + CPPUTEST_LIB_DIR = lib/$(TARGET_PLATFORM) +endif +endif + +# No map by default +ifndef CPPUTEST_MAP_FILE + CPPUTEST_MAP_FILE = N +endif + +# No extentions is default +ifndef CPPUTEST_USE_EXTENSIONS + CPPUTEST_USE_EXTENSIONS = N +endif + +# No VPATH is default +ifndef CPPUTEST_USE_VPATH + CPPUTEST_USE_VPATH := N +endif +# Make empty, instead of 'N', for usage in $(if ) conditionals +ifneq ($(CPPUTEST_USE_VPATH), Y) + CPPUTEST_USE_VPATH := +endif + +ifndef TARGET_PLATFORM +#CPPUTEST_LIB_LINK_DIR = $(CPPUTEST_HOME)/lib +CPPUTEST_LIB_LINK_DIR = /usr/lib/x86_64-linux-gnu +else +CPPUTEST_LIB_LINK_DIR = $(CPPUTEST_HOME)/lib/$(TARGET_PLATFORM) +endif + +# -------------------------------------- +# derived flags in the following area +# -------------------------------------- + +# Without the C library, we'll need to disable the C++ library and ... +ifeq ($(CPPUTEST_USE_STD_C_LIB), N) + CPPUTEST_USE_STD_CPP_LIB = N + CPPUTEST_USE_MEM_LEAK_DETECTION = N + CPPUTEST_CPPFLAGS += -DCPPUTEST_STD_C_LIB_DISABLED + CPPUTEST_CPPFLAGS += -nostdinc +endif + +CPPUTEST_CPPFLAGS += -DCPPUTEST_COMPILATION + +ifeq ($(CPPUTEST_USE_MEM_LEAK_DETECTION), N) + CPPUTEST_CPPFLAGS += -DCPPUTEST_MEM_LEAK_DETECTION_DISABLED +else + ifndef CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE + CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE = -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorNewMacros.h + endif + ifndef CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE + CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE = -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorMallocMacros.h + endif +endif + +ifeq ($(CPPUTEST_ENABLE_DEBUG), Y) + CPPUTEST_CXXFLAGS += -g + CPPUTEST_CFLAGS += -g + CPPUTEST_LDFLAGS += -g +endif + +ifeq ($(CPPUTEST_USE_STD_CPP_LIB), N) + CPPUTEST_CPPFLAGS += -DCPPUTEST_STD_CPP_LIB_DISABLED +ifeq ($(CPPUTEST_USE_STD_C_LIB), Y) + CPPUTEST_CXXFLAGS += -nostdinc++ +endif +endif + +ifdef $(GMOCK_HOME) + GTEST_HOME = $(GMOCK_HOME)/gtest + CPPUTEST_CPPFLAGS += -I$(GMOCK_HOME)/include + GMOCK_LIBRARY = $(GMOCK_HOME)/lib/.libs/libgmock.a + LD_LIBRARIES += $(GMOCK_LIBRARY) + CPPUTEST_CPPFLAGS += -DINCLUDE_GTEST_TESTS + CPPUTEST_WARNINGFLAGS = + CPPUTEST_CPPFLAGS += -I$(GTEST_HOME)/include -I$(GTEST_HOME) + GTEST_LIBRARY = $(GTEST_HOME)/lib/.libs/libgtest.a + LD_LIBRARIES += $(GTEST_LIBRARY) +endif + + +ifeq ($(CPPUTEST_USE_GCOV), Y) + CPPUTEST_CXXFLAGS += -fprofile-arcs -ftest-coverage + CPPUTEST_CFLAGS += -fprofile-arcs -ftest-coverage +endif + +CPPUTEST_CXXFLAGS += $(CPPUTEST_WARNINGFLAGS) $(CPPUTEST_CXX_WARNINGFLAGS) +CPPUTEST_CPPFLAGS += $(CPPUTEST_WARNINGFLAGS) +CPPUTEST_CXXFLAGS += $(CPPUTEST_MEMLEAK_DETECTOR_NEW_MACRO_FILE) +CPPUTEST_CPPFLAGS += $(CPPUTEST_MEMLEAK_DETECTOR_MALLOC_MACRO_FILE) +CPPUTEST_CFLAGS += $(CPPUTEST_C_WARNINGFLAGS) + +TARGET_MAP = $(COMPONENT_NAME).map.txt +ifeq ($(CPPUTEST_MAP_FILE), Y) + CPPUTEST_LDFLAGS += -Wl,-map,$(TARGET_MAP) +endif + +# Link with CppUTest lib +CPPUTEST_LIB = $(CPPUTEST_LIB_LINK_DIR)/libCppUTest.a + +ifeq ($(CPPUTEST_USE_EXTENSIONS), Y) +CPPUTEST_LIB += $(CPPUTEST_LIB_LINK_DIR)/libCppUTestExt.a +endif + +ifdef CPPUTEST_STATIC_REALTIME + LD_LIBRARIES += -lrt +endif + +TARGET_LIB = \ + $(CPPUTEST_LIB_DIR)/lib$(COMPONENT_NAME).a + +ifndef TEST_TARGET + ifndef TARGET_PLATFORM + TEST_TARGET = $(COMPONENT_NAME)_tests + else + TEST_TARGET = $(COMPONENT_NAME)_$(TARGET_PLATFORM)_tests + endif +endif + +#Helper Functions +get_src_from_dir = $(wildcard $1/*.cpp) $(wildcard $1/*.cc) $(wildcard $1/*.c) +get_dirs_from_dirspec = $(wildcard $1) +get_src_from_dir_list = $(foreach dir, $1, $(call get_src_from_dir,$(dir))) +__src_to = $(subst .c,$1, $(subst .cc,$1, $(subst .cpp,$1,$(if $(CPPUTEST_USE_VPATH),$(notdir $2),$2)))) +src_to = $(addprefix $(CPPUTEST_OBJS_DIR)/,$(call __src_to,$1,$2)) +src_to_o = $(call src_to,.o,$1) +src_to_d = $(call src_to,.d,$1) +src_to_gcda = $(call src_to,.gcda,$1) +src_to_gcno = $(call src_to,.gcno,$1) +time = $(shell date +%s) +delta_t = $(eval minus, $1, $2) +debug_print_list = $(foreach word,$1,echo " $(word)";) echo; + +#Derived +STUFF_TO_CLEAN += $(TEST_TARGET) $(TEST_TARGET).exe $(TARGET_LIB) $(TARGET_MAP) + +SRC += $(call get_src_from_dir_list, $(SRC_DIRS)) $(SRC_FILES) +OBJ = $(call src_to_o,$(SRC)) + +STUFF_TO_CLEAN += $(OBJ) + +TEST_SRC += $(call get_src_from_dir_list, $(TEST_SRC_DIRS)) $(TEST_SRC_FILES) +TEST_OBJS = $(call src_to_o,$(TEST_SRC)) +STUFF_TO_CLEAN += $(TEST_OBJS) + + +MOCKS_SRC += $(call get_src_from_dir_list, $(MOCKS_SRC_DIRS)) +MOCKS_OBJS = $(call src_to_o,$(MOCKS_SRC)) +STUFF_TO_CLEAN += $(MOCKS_OBJS) + +ALL_SRC = $(SRC) $(TEST_SRC) $(MOCKS_SRC) + +# If we're using VPATH +ifeq ($(CPPUTEST_USE_VPATH), Y) +# gather all the source directories and add them + VPATH += $(sort $(dir $(ALL_SRC))) +# Add the component name to the objs dir path, to differentiate between same-name objects + CPPUTEST_OBJS_DIR := $(addsuffix /$(COMPONENT_NAME),$(CPPUTEST_OBJS_DIR)) +endif + +#Test coverage with gcov +GCOV_OUTPUT = gcov_output.txt +GCOV_REPORT = gcov_report.txt +GCOV_ERROR = gcov_error.txt +GCOV_GCDA_FILES = $(call src_to_gcda, $(ALL_SRC)) +GCOV_GCNO_FILES = $(call src_to_gcno, $(ALL_SRC)) +TEST_OUTPUT = $(TEST_TARGET).txt +STUFF_TO_CLEAN += \ + $(GCOV_OUTPUT)\ + $(GCOV_REPORT)\ + $(GCOV_REPORT).html\ + $(GCOV_ERROR)\ + $(GCOV_GCDA_FILES)\ + $(GCOV_GCNO_FILES)\ + $(TEST_OUTPUT) + +#The gcda files for gcov need to be deleted before each run +#To avoid annoying messages. +GCOV_CLEAN = $(SILENCE)rm -f $(GCOV_GCDA_FILES) $(GCOV_OUTPUT) $(GCOV_REPORT) $(GCOV_ERROR) +RUN_TEST_TARGET = $(SILENCE) $(GCOV_CLEAN) ; echo "Running $(TEST_TARGET)"; ./$(TEST_TARGET) $(CPPUTEST_EXE_FLAGS) -ojunit + +ifeq ($(CPPUTEST_USE_GCOV), Y) + + ifeq ($(COMPILER_NAME),$(CLANG_STR)) + LD_LIBRARIES += --coverage + else + LD_LIBRARIES += -lgcov + endif +endif + + +INCLUDES_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(INCLUDE_DIRS)) +INCLUDES += $(foreach dir, $(INCLUDES_DIRS_EXPANDED), -I$(dir)) +MOCK_DIRS_EXPANDED = $(call get_dirs_from_dirspec, $(MOCKS_SRC_DIRS)) +INCLUDES += $(foreach dir, $(MOCK_DIRS_EXPANDED), -I$(dir)) + +CPPUTEST_CPPFLAGS += $(INCLUDES) $(CPPUTESTFLAGS) + +DEP_FILES = $(call src_to_d, $(ALL_SRC)) +STUFF_TO_CLEAN += $(DEP_FILES) $(PRODUCTION_CODE_START) $(PRODUCTION_CODE_END) +STUFF_TO_CLEAN += $(STDLIB_CODE_START) $(MAP_FILE) cpputest_*.xml junit_run_output + +# We'll use the CPPUTEST_CFLAGS etc so that you can override AND add to the CppUTest flags +CFLAGS = $(CPPUTEST_CFLAGS) $(CPPUTEST_ADDITIONAL_CFLAGS) +CPPFLAGS = $(CPPUTEST_CPPFLAGS) $(CPPUTEST_ADDITIONAL_CPPFLAGS) +CXXFLAGS = $(CPPUTEST_CXXFLAGS) $(CPPUTEST_ADDITIONAL_CXXFLAGS) +LDFLAGS = $(CPPUTEST_LDFLAGS) $(CPPUTEST_ADDITIONAL_LDFLAGS) + +# Don't consider creating the archive a warning condition that does STDERR output +ARFLAGS := $(ARFLAGS)c + +DEP_FLAGS=-MMD -MP + +# Some macros for programs to be overridden. For some reason, these are not in Make defaults +RANLIB = ranlib + +# Targets + +.PHONY: all +all: start $(TEST_TARGET) + $(RUN_TEST_TARGET) + +.PHONY: start +start: $(TEST_TARGET) + $(SILENCE)START_TIME=$(call time) + +.PHONY: all_no_tests +all_no_tests: $(TEST_TARGET) + +.PHONY: flags +flags: + @echo + @echo "OS ${UNAME_OS}" + @echo "Compile C and C++ source with CPPFLAGS:" + @$(call debug_print_list,$(CPPFLAGS)) + @echo "Compile C++ source with CXXFLAGS:" + @$(call debug_print_list,$(CXXFLAGS)) + @echo "Compile C source with CFLAGS:" + @$(call debug_print_list,$(CFLAGS)) + @echo "Link with LDFLAGS:" + @$(call debug_print_list,$(LDFLAGS)) + @echo "Link with LD_LIBRARIES:" + @$(call debug_print_list,$(LD_LIBRARIES)) + @echo "Create libraries with ARFLAGS:" + @$(call debug_print_list,$(ARFLAGS)) + +TEST_DEPS = $(TEST_OBJS) $(MOCKS_OBJS) $(PRODUCTION_CODE_START) $(TARGET_LIB) $(USER_LIBS) $(PRODUCTION_CODE_END) $(CPPUTEST_LIB) $(STDLIB_CODE_START) +test-deps: $(TEST_DEPS) + +$(TEST_TARGET): $(TEST_DEPS) + @echo Linking $@ + $(SILENCE)$(CXX) -o $@ $^ $(LD_LIBRARIES) $(LDFLAGS) + +$(TARGET_LIB): $(OBJ) + @echo Building archive $@ + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(AR) $(ARFLAGS) $@ $^ + $(SILENCE)$(RANLIB) $@ + +test: $(TEST_TARGET) + $(RUN_TEST_TARGET) | tee $(TEST_OUTPUT) + +vtest: $(TEST_TARGET) + $(RUN_TEST_TARGET) -v | tee $(TEST_OUTPUT) + +$(CPPUTEST_OBJS_DIR)/%.o: %.cc + @echo compiling $(notdir $<) + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + +$(CPPUTEST_OBJS_DIR)/%.o: %.cpp + @echo compiling $(notdir $<) + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(COMPILE.cpp) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + +$(CPPUTEST_OBJS_DIR)/%.o: %.c + @echo compiling $(notdir $<) + $(SILENCE)mkdir -p $(dir $@) + $(SILENCE)$(COMPILE.c) $(DEP_FLAGS) $(OUTPUT_OPTION) $< + +ifneq "$(MAKECMDGOALS)" "clean" +-include $(DEP_FILES) +endif + +.PHONY: clean +clean: + @echo Making clean + $(SILENCE)$(RM) $(STUFF_TO_CLEAN) + $(SILENCE)rm -rf gcov objs #$(CPPUTEST_OBJS_DIR) + $(SILENCE)rm -rf $(CPPUTEST_LIB_DIR) + $(SILENCE)find . -name "*.gcno" | xargs rm -f + $(SILENCE)find . -name "*.gcda" | xargs rm -f + +#realclean gets rid of all gcov, o and d files in the directory tree +#not just the ones made by this makefile +.PHONY: realclean +realclean: clean + $(SILENCE)rm -rf gcov + $(SILENCE)find . -name "*.gdcno" | xargs rm -f + $(SILENCE)find . -name "*.[do]" | xargs rm -f + +gcov: test +ifeq ($(CPPUTEST_USE_VPATH), Y) + $(SILENCE)gcov --object-directory $(CPPUTEST_OBJS_DIR) $(SRC) >> $(GCOV_OUTPUT) 2>> $(GCOV_ERROR) +else + $(SILENCE)for d in $(SRC_DIRS) ; do \ + gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$d $$d/*.c $$d/*.cpp >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ + done + $(SILENCE)for f in $(SRC_FILES) ; do \ + gcov --object-directory $(CPPUTEST_OBJS_DIR)/$$f $$f >> $(GCOV_OUTPUT) 2>>$(GCOV_ERROR) ; \ + done +endif +# $(CPPUTEST_HOME)/scripts/filterGcov.sh $(GCOV_OUTPUT) $(GCOV_ERROR) $(GCOV_REPORT) $(TEST_OUTPUT) + /usr/share/cpputest/scripts/filterGcov.sh $(GCOV_OUTPUT) $(GCOV_ERROR) $(GCOV_REPORT) $(TEST_OUTPUT) + $(SILENCE)cat $(GCOV_REPORT) + $(SILENCE)mkdir -p gcov + $(SILENCE)mv *.gcov gcov + $(SILENCE)mv gcov_* gcov + @echo "See gcov directory for details" + +.PHONEY: format +format: + $(CPPUTEST_HOME)/scripts/reformat.sh $(PROJECT_HOME_DIR) + +.PHONEY: debug +debug: + @echo + @echo "Target Source files:" + @$(call debug_print_list,$(SRC)) + @echo "Target Object files:" + @$(call debug_print_list,$(OBJ)) + @echo "Test Source files:" + @$(call debug_print_list,$(TEST_SRC)) + @echo "Test Object files:" + @$(call debug_print_list,$(TEST_OBJS)) + @echo "Mock Source files:" + @$(call debug_print_list,$(MOCKS_SRC)) + @echo "Mock Object files:" + @$(call debug_print_list,$(MOCKS_OBJS)) + @echo "All Input Dependency files:" + @$(call debug_print_list,$(DEP_FILES)) + @echo Stuff to clean: + @$(call debug_print_list,$(STUFF_TO_CLEAN)) + @echo Includes: + @$(call debug_print_list,$(INCLUDES)) + +-include $(OTHER_MAKEFILE_TO_INCLUDE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/CThunk.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,202 @@ +/* General C++ Object Thunking class + * + * - allows direct callbacks to non-static C++ class functions + * - keeps track for the corresponding class instance + * - supports an optional context parameter for the called function + * - ideally suited for class object receiving interrupts (NVIC_SetVector) + * + * Copyright (c) 2014-2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __CTHUNK_H__ +#define __CTHUNK_H__ + +#define CTHUNK_ADDRESS 1 + +#if defined(__CORTEX_M3) || defined(__CORTEX_M4) || defined(__thumb2__) +#define CTHUNK_VARIABLES volatile uint32_t code[1] +/** +* CTHUNK disassembly for Cortex-M3/M4 (thumb2): +* * ldm.w pc,{r0,r1,r2,pc} +* +* This instruction loads the arguments for the static thunking function to r0-r2, and +* branches to that function by loading its address into PC. +* +* This is safe for both regular calling and interrupt calling, since it only touches scratch registers +* which should be saved by the caller, and are automatically saved as part of the IRQ context switch. +*/ +#define CTHUNK_ASSIGMENT m_thunk.code[0] = 0x8007E89F + +#elif defined(__CORTEX_M0PLUS) || defined(__CORTEX_M0) +/* +* CTHUNK disassembly for Cortex M0 (thumb): +* * push {r0,r1,r2,r3,r4,lr} save touched registers and return address +* * movs r4,#4 set up address to load arguments from (immediately following this code block) (1) +* * add r4,pc set up address to load arguments from (immediately following this code block) (2) +* * ldm r4!,{r0,r1,r2,r3} load arguments for static thunk function +* * blx r3 call static thunk function +* * pop {r0,r1,r2,r3,r4,pc} restore scratch registers and return from function +*/ +#define CTHUNK_VARIABLES volatile uint32_t code[3] +#define CTHUNK_ASSIGMENT do { \ + m_thunk.code[0] = 0x2404B51F; \ + m_thunk.code[1] = 0xCC0F447C; \ + m_thunk.code[2] = 0xBD1F4798; \ + } while (0) + +#else +#error "Target is not currently suported." +#endif + +/* IRQ/Exception compatible thunk entry function */ +typedef void (*CThunkEntry)(void); + +template<class T> +class CThunk +{ + public: + typedef void (T::*CCallbackSimple)(void); + typedef void (T::*CCallback)(void* context); + + inline CThunk(T *instance) + { + init(instance, NULL, NULL); + } + + inline CThunk(T *instance, CCallback cb) + { + init(instance, cb, NULL); + } + + ~CThunk() { + + } + + inline CThunk(T *instance, CCallbackSimple cb) + { + init(instance, (CCallback)cb, NULL); + } + + inline CThunk(T &instance, CCallback cb) + { + init(instance, cb, NULL); + } + + inline CThunk(T &instance, CCallbackSimple cb) + { + init(instance, (CCallback)cb, NULL); + } + + inline CThunk(T &instance, CCallback cb, void* ctx) + { + init(instance, cb, ctx); + } + + inline void callback(CCallback cb) + { + m_callback = cb; + } + + inline void callback(CCallbackSimple cb) + { + m_callback = (CCallback)cb; + } + + inline void context(void* ctx) + { + m_thunk.context = (uint32_t)ctx; + } + + inline void context(uint32_t ctx) + { + m_thunk.context = ctx; + } + + inline uint32_t entry(void) + { + return (((uint32_t)&m_thunk)|CTHUNK_ADDRESS); + } + + /* get thunk entry point for connecting rhunk to an IRQ table */ + inline operator CThunkEntry(void) + { + return (CThunkEntry)entry(); + } + + /* get thunk entry point for connecting rhunk to an IRQ table */ + inline operator uint32_t(void) + { + return entry(); + } + + /* simple test function */ + inline void call(void) + { + (((CThunkEntry)(entry()))()); + } + + private: + T* m_instance; + volatile CCallback m_callback; + +// TODO: this needs proper fix, to refactor toolchain header file and all its use +// PACKED there is not defined properly for IAR +#if defined (__ICCARM__) + typedef __packed struct + { + CTHUNK_VARIABLES; + volatile uint32_t instance; + volatile uint32_t context; + volatile uint32_t callback; + volatile uint32_t trampoline; + } CThunkTrampoline; +#else + typedef struct + { + CTHUNK_VARIABLES; + volatile uint32_t instance; + volatile uint32_t context; + volatile uint32_t callback; + volatile uint32_t trampoline; + } __attribute__((__packed__)) CThunkTrampoline; +#endif + + static void trampoline(T* instance, void* ctx, CCallback* cb) + { + if(instance && *cb) { + (static_cast<T*>(instance)->**cb)(ctx); + } + } + + volatile CThunkTrampoline m_thunk; + + inline void init(T *instance, CCallback cb, void* ctx) + { + /* remember callback - need to add this level of redirection + as pointer size for member functions differs between platforms */ + m_callback = cb; + + /* populate thunking trampoline */ +// CTHUNK_ASSIGMENT; +// m_thunk.context = (uint32_t)ctx; +// m_thunk.instance = (uint32_t)instance; +// m_thunk.callback = (uint32_t)&m_callback; +// m_thunk.trampoline = (uint32_t)&trampoline; + +// __ISB(); +// __DSB(); + } +}; + +#endif/*__CTHUNK_H__*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/FunctionPointer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,604 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef MBED_FUNCTIONPOINTER_H +#define MBED_FUNCTIONPOINTER_H + +#include <string.h> +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> +#include <new> +#include "FunctionPointerBase.h" +#include "FunctionPointerBind.h" + +namespace mbed { +/** A class for storing and calling a pointer to a static or member void function without arguments + */ +template <typename R> +class FunctionPointer0 : public FunctionPointerBase<R>{ +public: + typedef R(*static_fp)(void); + typedef struct arg_struct{ + } ArgStruct; + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer0(static_fp function = 0): + FunctionPointerBase<R>() + { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer0(T *object, R (T::*member)(void)): + FunctionPointerBase<R>() + { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer0::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(void)) { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(void)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer0::membercaller<T>; + } + + /** Call the attached static or member function + */ + R call(){ + return FunctionPointerBase<R>::call(NULL); + } + + FunctionPointerBind<R> bind() { + FunctionPointerBind<R> fp; + fp.bind(&FunctionPointerBase<R>::_nullops, (ArgStruct *) NULL, this); + return fp; + } + + static_fp get_function()const { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(void) { + return call(); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + (void) arg; + T* o = static_cast<T*>(object); + R (T::**m)(void) = reinterpret_cast<R (T::**)(void)>(member); + return (o->**m)(); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + (void) arg; + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(); + } +}; + +/* If we had variaditic templates, this wouldn't be a problem, but until C++11 is enabled, we are stuck with multiple classes... */ + +/** A class for storing and calling a pointer to a static or member void function with one argument + */ +template <typename R, typename A1> +class FunctionPointer1 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + arg_struct(const A1 *b1) { + a1 = *b1; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer1(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer1(T *object, R (T::*member)(A1)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer1::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer1::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1) { + FunctionPointerBind<R> fp; + fp.bind(&_fp1_ops, (ArgStruct *) NULL, this, &a1); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1) + { + ArgStruct Args(&a1); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a) { + return call(a); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1) = reinterpret_cast<R (T::**)(A1)>(member); + return (o->**m)(Args->a1); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1); + } +/* static void constructor(void * dest, va_list args) { + new(dest) ArgStruct(va_arg(args,A1*)); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp1_ops; +}; + +template <typename R, typename A1> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer1<R,A1>::_fp1_ops = { + FunctionPointer1<R,A1>::constructor, + FunctionPointer1<R,A1>::copy_constructor, + FunctionPointer1<R,A1>::destructor +}; + + +/** A class for storing and calling a pointer to a static or member void function with two arguments + */ +template <typename R, typename A1, typename A2> +class FunctionPointer2 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + A2 a2; + arg_struct(const A1 *b1, const A2 *b2) { + a1 = *b1; + a2 = *b2; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1, A2); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer2(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer2(T *object, R (T::*member)(A1, A2)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer2::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer2::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1, const A2 &a2) { + FunctionPointerBind<R> fp; + fp.bind(&_fp2_ops, (ArgStruct *) NULL, this, &a1, &a2); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1, A2 a2) + { + ArgStruct Args(&a1, &a2); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a1, A2 a2) { + return call(a1, a2); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2) = reinterpret_cast<R (T::**)(A1, A2)>(member); + return (o->**m)(Args->a1, Args->a2); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1, Args->a2); + } +/* static void constructor(void * dest, va_list args) { + A1 *a1 = va_arg(args, A1*); + A2 *a2 = va_arg(args, A2*); + new(dest) ArgStruct(a1, a2); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1), &(src_args->a2)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp2_ops; +}; + +template <typename R, typename A1, typename A2> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer2<R,A1,A2>::_fp2_ops = { + FunctionPointer2<R,A1,A2>::constructor, + FunctionPointer2<R,A1,A2>::copy_constructor, + FunctionPointer2<R,A1,A2>::destructor +}; + +/** A class for storing and calling a pointer to a static or member void function with three arguments + */ +template <typename R, typename A1, typename A2, typename A3> +class FunctionPointer3 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + A2 a2; + A3 a3; + arg_struct(const A1 *b1, const A2 *b2, const A3* b3) { + a1 = *b1; + a2 = *b2; + a3 = *b3; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1, A2, A3); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer3(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer3(T *object, R (T::*member)(A1, A2, A3)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer3::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2, A3)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2, A3)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer3::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1, const A2 &a2, const A3 &a3) { + FunctionPointerBind<R> fp; + fp.bind(&_fp3_ops, (ArgStruct *) NULL, this, &a1, &a2, &a3); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1, A2 a2, A3 a3) + { + ArgStruct Args(&a1, &a2, &a3); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a1, A2 a2, A3 a3) { + return call(a1, a2, a3); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2, A3) = reinterpret_cast<R (T::**)(A1, A2, A3)>(member); + return (o->**m)(Args->a1, Args->a2, Args->a3); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1, Args->a2, Args->a3); + } +/* static void constructor(void * dest, va_list args) { + A1 *a1 = va_arg(args, A1*); + A2 *a2 = va_arg(args, A2*); + A3 *a3 = va_arg(args, A3*); + new(dest) ArgStruct(a1, a2, a3); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1), &(src_args->a2), &(src_args->a3)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp3_ops; +}; + +template <typename R, typename A1, typename A2, typename A3> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer3<R,A1,A2,A3>::_fp3_ops = { + FunctionPointer3<R,A1,A2,A3>::constructor, + FunctionPointer3<R,A1,A2,A3>::copy_constructor, + FunctionPointer3<R,A1,A2,A3>::destructor +}; + +/** A class for storing and calling a pointer to a static or member void function with four arguments + */ +template <typename R, typename A1, typename A2, typename A3, typename A4> +class FunctionPointer4 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + A2 a2; + A3 a3; + A4 a4; + arg_struct(const A1 *b1, const A2 *b2, const A3* b3, const A4* b4) { + a1 = *b1; + a2 = *b2; + a3 = *b3; + a4 = *b4; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1, A2, A3, A4); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer4(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer4(T *object, R (T::*member)(A1, A2, A3, A4)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer4::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2, A3, A4)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2, A3, A4)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer4::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) { + FunctionPointerBind<R> fp; + fp.bind(&_fp4_ops, (ArgStruct *) NULL, this, &a1, &a2, &a3, &a4); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1, A2 a2, A3 a3, A4 a4) + { + ArgStruct Args(&a1, &a2, &a3, &a4); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4) { + return call(a1, a2, a3, a4); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2, A3, A4) = reinterpret_cast<R (T::**)(A1, A2, A3, A4)>(member); + return (o->**m)(Args->a1, Args->a2, Args->a3, Args->a4); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1, Args->a2, Args->a3, Args->a4); + } +/* static void constructor(void * dest, va_list args) { + A1 *a1 = va_arg(args, A1*); + A2 *a2 = va_arg(args, A2*); + A3 *a3 = va_arg(args, A3*); + A4 *a4 = va_arg(args, A4*); + new(dest) ArgStruct(a1, a2, a3, a4); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1), &(src_args->a2), &(src_args->a3), &(src_args->a4)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp4_ops; +}; + +template <typename R, typename A1, typename A2, typename A3, typename A4> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer4<R,A1,A2,A3,A4>::_fp4_ops = { + FunctionPointer4<R,A1,A2,A3,A4>::constructor, + FunctionPointer4<R,A1,A2,A3,A4>::copy_constructor, + FunctionPointer4<R,A1,A2,A3,A4>::destructor +}; + +typedef FunctionPointer0<void> FunctionPointer; +//typedef FunctionPointer1<void, int> event_callback_t; + +} // namespace mbed + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/FunctionPointerBase.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* mbed Microcontroller Library + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef MBED_FUNCTIONPOINTERBASE_H +#define MBED_FUNCTIONPOINTERBASE_H + +#include <string.h> +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> +namespace mbed { + +template<typename R> +class FunctionPointerBase { +public: + operator bool(void) const { + return (_membercaller != NULL) && (_object != NULL); + } + + /** + * Clears the current function pointer assignment + * After clear(), this instance will point to nothing (NULL) + */ + virtual void clear() { + _membercaller = NULL; + _object = NULL; + } + +protected: + struct ArgOps { + void (*constructor)(void *, va_list); + void (*copy_args)(void *, void *); + void (*destructor)(void *); + }; + void * _object; // object Pointer/function pointer + R (*_membercaller)(void *, uintptr_t *, void *); + // aligned raw member function pointer storage - converted back by registered _membercaller + uintptr_t _member[4]; + static const struct ArgOps _nullops; + +protected: + FunctionPointerBase():_object(NULL), _membercaller(NULL) {} + FunctionPointerBase(const FunctionPointerBase<R> & fp) { + copy(&fp); + } + virtual ~FunctionPointerBase() { + } + + /** + * Calls the member pointed to by object::member or (function)object + * @param arg + * @return + */ + inline R call(void* arg) { + return _membercaller(_object, _member, arg); + } + + void copy(const FunctionPointerBase<R> * fp) { + _object = fp->_object; + memcpy (_member, fp->_member, sizeof(_member)); + _membercaller = fp->_membercaller; + } +private: + static void _null_constructor(void * dest, va_list args) {(void) dest;(void) args;} + static void _null_copy_args(void *dest , void* src) {(void) dest; (void) src;} + static void _null_destructor(void *args) {(void) args;} + +}; +template<typename R> +const struct FunctionPointerBase<R>::ArgOps FunctionPointerBase<R>::_nullops = { + FunctionPointerBase<R>::_null_constructor, + FunctionPointerBase<R>::_null_copy_args, + FunctionPointerBase<R>::_null_destructor +}; + +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/FunctionPointerBind.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,112 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * 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 + * 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. + */ + +#ifndef MBED_FUNCTIONPOINTERBIND_H__ +#define MBED_FUNCTIONPOINTERBIND_H__ + +#include <string.h> +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> +#include <assert.h> +#include "FunctionPointerBase.h" + +#ifndef EVENT_STORAGE_SIZE +#define EVENT_STORAGE_SIZE 32 +#endif + +#define MBED_STATIC_ASSERT(MBED_STATIC_ASSERT_FAILED,MSG)\ + switch(0){\ + case 0:case (MBED_STATIC_ASSERT_FAILED): \ + break;} + +namespace mbed{ + +template<typename R> +class FunctionPointerBind : public FunctionPointerBase<R> { +public: + // Call the Event + inline R call() { + return FunctionPointerBase<R>::call(static_cast<void *>(_storage)); + } + FunctionPointerBind(): + FunctionPointerBase<R>(), + _ops(&FunctionPointerBase<R>::_nullops) + {} + + FunctionPointerBind(const FunctionPointerBind<R> & fp): + FunctionPointerBase<R>(), + _ops(&FunctionPointerBase<R>::_nullops) { + *this = fp; + } + + virtual ~FunctionPointerBind() { + _ops->destructor(_storage); + } + + FunctionPointerBind<R> & operator=(const FunctionPointerBind<R>& rhs) { + if (_ops != &FunctionPointerBase<R>::_nullops) { + _ops->destructor(_storage); + } + FunctionPointerBase<R>::copy(&rhs); + _ops = rhs._ops; + _ops->copy_args(_storage, (void *)rhs._storage); + return *this; + } + + /** + * Clears the current binding, making this instance unbound + */ + virtual void clear() { + if (_ops != &FunctionPointerBase<R>::_nullops) { + _ops->destructor(_storage); + } + _ops = &FunctionPointerBase<R>::_nullops; + FunctionPointerBase<R>::clear(); + } + + template<typename S> + FunctionPointerBind<R> & bind(const struct FunctionPointerBase<R>::ArgOps * ops , S * argStruct, FunctionPointerBase<R> *fp, ...) { + MBED_STATIC_ASSERT(sizeof(S) <= sizeof(_storage), ERROR: Arguments too large for FunctionPointerBind internal storage) + if (_ops != &FunctionPointerBase<R>::_nullops) { + _ops->destructor(_storage); + } + _ops = ops; + FunctionPointerBase<R>::copy(fp); + assert(this->_ops != NULL); + assert(this->_ops->constructor != NULL); + if (argStruct) { + this->_ops->copy_args(this->_storage, (void *)argStruct); + } else { + va_list args; + va_start(args, fp); + this->_ops->constructor(_storage, args); + va_end(args); + } + return *this; + } + + R operator()() { + return call(); + } + +protected: + const struct FunctionPointerBase<R>::ArgOps * _ops; + uint32_t _storage[(EVENT_STORAGE_SIZE+sizeof(uint32_t)-1)/sizeof(uint32_t)]; +}; +} + +#endif // MBED_FUNCTIONPOINTERBIND_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/Ticker.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TICKER_H +#define TICKER_H + +namespace mbed +{ +typedef uint64_t timestamp_t; + + class Ticker{ + public : + Ticker() {} + ~Ticker(){} + + // Ticker + template<typename T> + void attach_us(T* tptr, void (T::*mptr)(void), timestamp_t){} + + void detach(); + }; +} + +#endif // TICKER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/alltests.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +//#include "../m2mbase/m2mbasetest.h" +#include "../m2mobject/m2mobjecttest.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/ip6string.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef IP6STRING_H +#define IP6STRING_H +#ifdef __cplusplus +extern "C" { +#endif +/** + * Print binary IPv6 address to a string. + * String must contain enough room for full address, 40 bytes exact. + * IPv4 tunneling addresses are not covered. + * \param ip6addr IPv6 address. + * \p buffer to write string to. + */ +uint_fast8_t ip6tos(const void *ip6addr, char *p); + +/** + * Convert numeric IPv6 address string to a binary. + * IPv4 tunneling addresses are not covered. + * \param ip6addr IPv6 address in string format. + * \param len Lenght of ipv6 string, maximum of 41. + * \param dest buffer for address. MUST be 16 bytes. + */ +void stoip6(const char *ip6addr, size_t len, void *dest); +/** + * Find out numeric IPv6 address prefix length + * \param ip6addr IPv6 address in string format + * \return prefix length or 0 if it not given + */ +unsigned char sipv6_prefixlength(const char *ip6addr); + +#ifdef __cplusplus +} +#endif +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/mbed.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef MBED_H +#define MBED_H + +#include <cstdio> +#include <cstring> + +#endif // MBED_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/ns_list.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,736 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef NS_LIST_H_ +#define NS_LIST_H_ + +#include "ns_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file + * \brief Linked list support library + * + * The ns_list.h file provides a doubly-linked list/queue, providing O(1) + * performance for all insertion/removal operations, and access to either + * end of the list. + * + * Memory footprint is two pointers for the list head, and two pointers in each + * list entry. It is similar in concept to BSD's TAILQ. + * + * Although the API is symmetrical and O(1) in both directions, due to internal + * pointer design, it is *slightly* more efficient to insert at the end when + * used as a queue, and to iterate forwards rather than backwards. + * + * Example of an entry type that can be stored to this list. + * ~~~ + * typedef struct example_entry + * { + * uint8_t *data; + * uint32_t data_count; + * ns_list_link_t link; + * } + * example_entry_t; + * + * static NS_LIST_HEAD(example_entry_t, link) my_list; + * ns_list_init(&my_list); + * ~~~ + * OR + * ~~~ + * NS_LIST_HEAD(example_entry_t, link) my_list = NS_LIST_INIT(my_list); + * ~~~ + * OR + * ~~~ + * static NS_LIST_DEFINE(my_list, example_entry_t, link); + * ~~~ + * OR + * ~~~ + * typedef NS_LIST_HEAD(example_entry_t, link) example_list_t; + * example_list_t NS_LIST_NAME_INIT(my_list); + * ~~~ + * NOTE: the link field SHALL NOT be accessed by the user. + * + * An entry can exist on multiple lists by having multiple link fields. + * + * All the list operations are implemented as macros, most of which are backed + * by optionally-inline functions. The macros do not evaluate any arguments more + * than once, unless documented. + * + * In macro documentation, `list_t` refers to a list type defined using + * NS_LIST_HEAD(), and `entry_t` to the entry type that was passed to it. + */ + +/** \brief Underlying generic linked list head. + * + * Users should not use this type directly, but use the NS_LIST_HEAD() macro. + */ +typedef struct ns_list +{ + void *first_entry; ///< Pointer to first entry, or NULL if list is empty + void **last_nextptr; ///< Pointer to last entry's `next` pointer, or + ///< to head's `first_entry` pointer if list is empty +} ns_list_t; + +/** \brief Declare a list head type + * + * This union stores the real list head, and also encodes as compile-time type + * information the offset of the link pointer, and the type of the entry. + * + * Note that type information is compiler-dependent; this means + * ns_list_get_first() could return either `void *`, or a pointer to the actual + * entry type. So `ns_list_get_first()->data` is not a portable construct - + * always assign returned entry pointers to a properly typed pointer variable. + * This assignment will be then type-checked where the compiler supports it, and + * will dereference correctly on compilers that don't support this extension. + * ~~~ + * NS_LIST_HEAD(example_entry_t, link) my_list; + * + * example_entry_t *entry = ns_list_get_first(&my_list); + * do_something(entry->data); + * ~~~ + * Each use of this macro generates a new anonymous union, so these two lists + * have different types: + * ~~~ + * NS_LIST_HEAD(example_entry_t, link) my_list1; + * NS_LIST_HEAD(example_entry_t, link) my_list2; + * ~~~ + * If you need to use a list type in multiple places, eg as a function + * parameter, use typedef: + * ~~~ + * typedef NS_LIST_HEAD(example_entry_t, link) example_list_t; + * + * void example_function(example_list_t *); + * ~~~ + */ +#define NS_LIST_HEAD(entry_type, field) \ +union \ +{ \ + ns_list_t slist; \ + NS_STATIC_ASSERT(offsetof(entry_type, field) <= UINT_FAST8_MAX, "link offset too large") \ + char (*offset)[offsetof(entry_type, field)]; \ + entry_type *type; \ +} + +/// \privatesection +/** \brief Get offset of link field in entry. + * \return `(ns_list_offset_t)` The offset of the link field for entries on the specified list + */ +#define NS_LIST_OFFSET_(list) ((ns_list_offset_t) sizeof *(list)->offset) + +/** \brief Get the entry type. + * \def NS_LIST_TYPE_ + * + * \return The type of entry on the specified list. + * + * Only available if the compiler provides a "typeof" operator. + */ +#if defined __cplusplus && __cplusplus >= 201103L +#define NS_LIST_TYPE_(list) decltype(*(list)->type) +#elif defined __GNUC__ +#define NS_LIST_TYPE_(list) __typeof__(*(list)->type) +#endif + +/** \brief Check for compatible pointer types + * + * Although this can be done portably, the GCC custom version is provided to + * produce a clearer diagnostic, and it produces an error rather than a warning. + * + * The portable version will produce a diagnostic about a pointer mismatch on + * the == inside the sizeof operator. For example ARM/Norcroft C gives the error: + * + * operand types are incompatible ("entry_t *" and "other_t *") + */ +#ifdef CPPCHECK +#define NS_PTR_MATCH_(a, b, str) ((void) 0) +#elif defined __GNUC__ +#define NS_PTR_MATCH_(a, b, str) __extension__ \ + ({ NS_STATIC_ASSERT(__builtin_types_compatible_p(__typeof__ (*(a)), __typeof__ (*(b))), \ + str) }) +#else +#define NS_PTR_MATCH_(a, b, str) ((void) sizeof ((a) == (b))) +#endif + +/** \brief Internal macro to cast returned entry pointers to correct type. + * + * Not portable in C, alas. With GCC or C++11, the "get entry" macros return + * correctly-typed pointers. Otherwise, the macros return `void *`. + * + * The attempt at a portable version would work if the C `?:` operator wasn't + * broken - `x ? (t *) : (void *)` should really have type `(t *)` in C, but + * it has type `(void *)`, which only makes sense for C++. The `?:` is left in, + * in case some day it works. Some compilers may still warn if this is + * assigned to a different type. + */ +#ifdef NS_LIST_TYPE_ +#define NS_LIST_TYPECAST_(list, val) ((NS_LIST_TYPE_(list) *) (val)) +#else +#define NS_LIST_TYPECAST_(list, val) (0 ? (list)->type : (val)) +#endif + +/** \brief Internal macro to check types of input entry pointer. */ +#define NS_LIST_TYPECHECK_(list, entry) \ + (NS_PTR_MATCH_((list)->type, (entry), "incorrect entry type for list"), (entry)) + +/** \brief Type used to pass link offset to underlying functions + * + * We could use size_t, but it would be unnecessarily large on 8-bit systems, + * where we can be (pretty) confident we won't have next pointers more than + * 256 bytes into a structure. + */ +typedef uint_fast8_t ns_list_offset_t; + +/// \publicsection +/** \brief The type for the link member in the user's entry structure. + * + * Users should not access this member directly - just pass its name to the + * list head macros. The funny prev pointer simplifies common operations + * (eg insertion, removal), at the expense of complicating rare reverse iteration. + * + * NB - the list implementation relies on next being the first member. + */ +typedef struct ns_list_link +{ + void *next; ///< Pointer to next entry, or NULL if none + void **prev; ///< Pointer to previous entry's (or head's) next pointer +} ns_list_link_t; + +/** \brief "Poison" value placed in unattached entries' link pointers. + * \internal What are good values for this? Platform dependent, maybe just NULL + */ +#define NS_LIST_POISON ((void *) 0xDEADBEEF) + +/** \brief Initialiser for an entry's link member + * + * This initialiser is not required by the library, but a user may want an + * initialiser to include in their own entry initialiser. See + * ns_list_link_init() for more discussion. + */ +#define NS_LIST_LINK_INIT(name) \ + NS_FUNNY_INTPTR_OK \ + { NS_LIST_POISON, NS_LIST_POISON } \ + NS_FUNNY_INTPTR_RESTORE + +/** \hideinitializer \brief Initialise an entry's list link + * + * This "initialises" an unattached entry's link by filling the fields with + * poison. This is optional, as unattached entries field pointers are not + * meaningful, and it is not valid to call ns_list_get_next or similar on + * an unattached entry. + * + * \param entry Pointer to an entry + * \param field The name of the link member to initialise + */ +#define ns_list_link_init(entry, field) ns_list_link_init_(&(entry)->field) + +/** \hideinitializer \brief Initialise a list + * + * Initialise a list head before use. A list head must be initialised using this + * function or one of the NS_LIST_INIT()-type macros before use. A zero-initialised + * list head is *not* valid. + * + * If used on a list containing existing entries, those entries will + * become detached. (They are not modified, but their links are now effectively + * undefined). + * + * \param list Pointer to a NS_LIST_HEAD() structure. + */ +#define ns_list_init(list) ns_list_init_(&(list)->slist) + +/** \brief Initialiser for an empty list + * + * Usage in an enclosing initialiser: + * ~~~ + * static my_type_including_list_t x = { + * "Something", + * 23, + * NS_LIST_INIT(x), + * }; + * ~~~ + * NS_LIST_DEFINE() or NS_LIST_NAME_INIT() may provide a shorter alternative + * in simpler cases. + */ +#define NS_LIST_INIT(name) { { NULL, &(name).slist.first_entry } } + +/** \brief Name and initialiser for an empty list + * + * Usage: + * ~~~ + * list_t NS_LIST_NAME_INIT(foo); + * ~~~ + * acts as + * ~~~ + * list_t foo = { empty list }; + * ~~~ + * Also useful with designated initialisers: + * ~~~ + * .NS_LIST_NAME_INIT(foo), + * ~~~ + * acts as + * ~~~ + * .foo = { empty list }, + * ~~~ + */ +#define NS_LIST_NAME_INIT(name) name = NS_LIST_INIT(name) + +/** \brief Define a list, and initialise to empty. + * + * Usage: + * ~~~ + * static NS_LIST_DEFINE(my_list, entry_t, link); + * ~~~ + * acts as + * ~~~ + * static list_type my_list = { empty list }; + * ~~~ + */ +#define NS_LIST_DEFINE(name, type, field) \ + NS_LIST_HEAD(type, field) NS_LIST_NAME_INIT(name) + +/** \hideinitializer \brief Add an entry to the start of the linked list. + * + * ns_list_add_to_end() is *slightly* more efficient than ns_list_add_to_start(). + * + * \param list `(list_t *)` Pointer to list. + * \param entry `(entry_t * restrict)` Pointer to new entry to add. + */ +#define ns_list_add_to_start(list, entry) \ + ns_list_add_to_start_(&(list)->slist, NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, entry)) + +/** \hideinitializer \brief Add an entry to the end of the linked list. + * + * \param list `(list_t *)` Pointer to list. + * \param entry `(entry_t * restrict)` Pointer to new entry to add. + */ +#define ns_list_add_to_end(list, entry) \ + ns_list_add_to_end_(&(list)->slist, NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, entry)) + +/** \hideinitializer \brief Add an entry before a specified entry. + * + * \param list `(list_t *)` Pointer to list. + * \param before `(entry_t *)` Existing entry before which to place the new entry. + * \param entry `(entry_t * restrict)` Pointer to new entry to add. + */ +#define ns_list_add_before(list, before, entry) \ + ns_list_add_before_(NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, before), NS_LIST_TYPECHECK_(list, entry)) + +/** \hideinitializer \brief Add an entry after a specified entry. + * + * ns_list_add_before() is *slightly* more efficient than ns_list_add_after(). + * + * \param list `(list_t *)` Pointer to list. + * \param after `(entry_t *)` Existing entry after which to place the new entry. + * \param entry `(entry_t * restrict)` Pointer to new entry to add. + */ +#define ns_list_add_after(list, after, entry) \ + ns_list_add_after_(&(list)->slist, NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, after), NS_LIST_TYPECHECK_(list, entry)) + +/** \brief Check if a list is empty. + * + * \param list `(const list_t *)` Pointer to list. + * + * \return `(bool)` true if the list is empty. + */ +#define ns_list_is_empty(list) ((bool) ((list)->slist.first_entry == NULL)) + +/** \brief Get the first entry. + * + * \param list `(const list_t *)` Pointer to list. + * + * \return `(entry_t *)` Pointer to first entry. + * \return NULL if list is empty. + */ +#define ns_list_get_first(list) NS_LIST_TYPECAST_(list, (list)->slist.first_entry) + +/** \hideinitializer \brief Get the previous entry. + * + * \param list `(const list_t *)` Pointer to list. + * \param current `(const entry_t *)` Pointer to current entry. + * + * \return `(entry_t *)` Pointer to previous entry. + * \return NULL if current entry is first. + */ +#define ns_list_get_previous(list, current) \ + NS_LIST_TYPECAST_(list, ns_list_get_previous_(&(list)->slist, NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, current))) + +/** \hideinitializer \brief Get the next entry. + * + * \param list `(const list_t *)` Pointer to list. + * \param current `(const entry_t *)` Pointer to current entry. + * + * \return `(entry_t *)` Pointer to next entry. + * \return NULL if current entry is last. + */ +#define ns_list_get_next(list, current) \ + NS_LIST_TYPECAST_(list, ns_list_get_next_(NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, current))) + +/** \hideinitializer \brief Get the last entry. + * + * \param list `(const list_t *)` Pointer to list. + * + * \return `(entry_t *)` Pointer to last entry. + * \return NULL if list is empty. + */ +#define ns_list_get_last(list) \ + NS_LIST_TYPECAST_(list, ns_list_get_last_(&(list)->slist, NS_LIST_OFFSET_(list))) + +/** \hideinitializer \brief Remove an entry. + * + * \param list `(list_t *)` Pointer to list. + * \param entry `(entry_t *)` Entry on list to be removed. + */ +#define ns_list_remove(list, entry) \ + ns_list_remove_(&(list)->slist, NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, entry)) + +/** \hideinitializer \brief Replace an entry. + * + * \param list `(list_t *)` Pointer to list. + * \param current `(entry_t *)` Existing entry on list to be replaced. + * \param replacement `(entry_t * restrict)` New entry to be the replacement. + */ +#define ns_list_replace(list, current, replacement) \ + ns_list_replace_(&(list)->slist, NS_LIST_OFFSET_(list), NS_LIST_TYPECHECK_(list, current), NS_LIST_TYPECHECK_(list, replacement)) + +/** \hideinitializer \brief Concatenate two lists. + * + * Attach the entries on the source list to the end of the destination + * list, leaving the source list empty. + * + * \param dst `(list_t *)` Pointer to destination list. + * \param src `(list_t *)` Pointer to source list. + * + */ +#define ns_list_concatenate(dst, src) \ + (NS_PTR_MATCH_(dst, src, "concatenating different list types"), \ + ns_list_concatenate_(&(dst)->slist, &(src)->slist, NS_LIST_OFFSET_(src))) + +/** \brief Iterate forwards over a list. + * + * Example: + * ~~~ + * ns_list_foreach(const my_entry_t, cur, &my_list) + * { + * printf("%s\n", cur->name); + * } + * ~~~ + * Deletion of the current entry is not permitted as its next is checked after + * running user code. + * + * The iteration pointer is declared inside the loop, using C99/C++, so it + * is not accessible after the loop. This encourages good code style, and + * matches the semantics of C++11's "ranged for", which only provides the + * declaration form: + * ~~~ + * for (const my_entry_t cur : my_list) + * ~~~ + * If you need to see the value of the iteration pointer after a `break`, + * you will need to assign it to a variable declared outside the loop before + * breaking: + * ~~~ + * my_entry_t *match = NULL; + * ns_list_foreach(my_entry_t, cur, &my_list) + * { + * if (cur->id == id) + * { + * match = cur; + * break; + * } + * } + * ~~~ + * + * The user has to specify the entry type for the pointer definition, as type + * extraction from the list argument isn't portable. On the other hand, this + * also permits const qualifiers, as in the example above, and serves as + * documentation. The entry type will be checked against the list type where the + * compiler supports it. + * + * \param type Entry type `([const] entry_t)`. + * \param e Name for iteration pointer to be defined + * inside the loop. + * \param list `(const list_t *)` Pointer to list - evaluated multiple times. + */ +#define ns_list_foreach(type, e, list) \ + for (type *e = ns_list_get_first(list); e; e = ns_list_get_next(list, e)) + +/** \brief Iterate forwards over a list, where user may delete. + * + * As ns_list_foreach(), but deletion of current entry is permitted as its + * next pointer is recorded before running user code. + * + * Example: + * ~~~ + * ns_list_foreach_safe(my_entry_t, cur, &my_list) + * { + * ns_list_remove(cur); + * } + * ~~~ + * \param type Entry type `(entry_t)`. + * \param e Name for iteration pointer to be defined + * inside the loop. + * \param list `(list_t *)` Pointer to list - evaluated multiple times. + */ +#define ns_list_foreach_safe(type, e, list) \ + for (type *e = ns_list_get_first(list), *_next; \ + e && (_next = ns_list_get_next(list, e), true); e = _next) + +/** \brief Iterate backwards over a list. + * + * As ns_list_foreach(), but going backwards - see its documentation. + * Iterating forwards is *slightly* more efficient. + */ +#define ns_list_foreach_reverse(type, e, list) \ + for (type *e = ns_list_get_last(list); e; e = ns_list_get_previous(list, e)) + +/** \brief Iterate backwards over a list, where user may delete. + * + * As ns_list_foreach_safe(), but going backwards - see its documentation. + * Iterating forwards is *slightly* more efficient. + */ +#define ns_list_foreach_reverse_safe(type, e, list) \ + for (type *e = ns_list_get_last(list), *_next; \ + e && (_next = ns_list_get_previous(list, e), true); e = _next) + +/** \hideinitializer \brief Count entries on a list + * + * Unlike other operations, this is O(n). Note: if list might contain over + * 65535 entries, this function **must not** be used to get the entry count. + * + * \param list `(const list_t *)` Pointer to list. + + * \return `(uint_fast16_t)` Number of entries that are stored in list. + */ +#define ns_list_count(list) ns_list_count_(&(list)->slist, NS_LIST_OFFSET_(list)) + +/** \privatesection + * Internal functions - designed to be accessed using corresponding macros above + */ +NS_INLINE void ns_list_init_(ns_list_t *list); +NS_INLINE void ns_list_link_init_(ns_list_link_t *link); +NS_INLINE void ns_list_add_to_start_(ns_list_t *list, ns_list_offset_t link_offset, void * restrict entry); +NS_INLINE void ns_list_add_to_end_(ns_list_t *list, ns_list_offset_t link_offset, void * restrict entry); +NS_INLINE void ns_list_add_before_(ns_list_offset_t link_offset, void *before, void * restrict entry); +NS_INLINE void ns_list_add_after_(ns_list_t *list, ns_list_offset_t link_offset, void *after, void * restrict entry); +NS_INLINE void *ns_list_get_next_(ns_list_offset_t link_offset, const void *current); +NS_INLINE void *ns_list_get_previous_(const ns_list_t *list, ns_list_offset_t link_offset, const void *current); +NS_INLINE void *ns_list_get_last_(const ns_list_t *list, ns_list_offset_t offset); +NS_INLINE void ns_list_remove_(ns_list_t *list, ns_list_offset_t link_offset, void *entry); +NS_INLINE void ns_list_replace_(ns_list_t *list, ns_list_offset_t link_offset, void *current, void * restrict replacement); +NS_INLINE void ns_list_concatenate_(ns_list_t *dst, ns_list_t *src, ns_list_offset_t offset); +NS_INLINE uint_fast16_t ns_list_count_(const ns_list_t *list, ns_list_offset_t link_offset); + +/* Provide definitions, either for inlining, or for ns_list.c */ +#if defined NS_ALLOW_INLINING || defined NS_LIST_FN +#ifndef NS_LIST_FN +#define NS_LIST_FN NS_INLINE +#endif + +/* Pointer to the link member in entry e */ +#define NS_LIST_LINK_(e, offset) ((ns_list_link_t *)((char *)(e) + offset)) + +/* Lvalue of the next link pointer in entry e */ +#define NS_LIST_NEXT_(e, offset) (NS_LIST_LINK_(e, offset)->next) + +/* Lvalue of the prev link pointer in entry e */ +#define NS_LIST_PREV_(e, offset) (NS_LIST_LINK_(e, offset)->prev) + +/* Convert a pointer to a link member back to the entry; + * works for linkptr either being a ns_list_link_t pointer, or its next pointer, + * as the next pointer is first in the ns_list_link_t */ +#define NS_LIST_ENTRY_(linkptr, offset) ((void *)((char *)(linkptr) - offset)) + +NS_LIST_FN void ns_list_init_(ns_list_t *list) +{ + list->first_entry = NULL; + list->last_nextptr = &list->first_entry; +} + +NS_LIST_FN void ns_list_link_init_(ns_list_link_t *link) +{ + NS_FUNNY_INTPTR_OK + link->next = NS_LIST_POISON; + link->prev = NS_LIST_POISON; + NS_FUNNY_INTPTR_RESTORE +} + +NS_LIST_FN void ns_list_add_to_start_(ns_list_t *list, ns_list_offset_t offset, void * restrict entry) +{ + void *next; + + NS_LIST_PREV_(entry, offset) = &list->first_entry; + NS_LIST_NEXT_(entry, offset) = next = list->first_entry; + + if (next) + { + NS_LIST_PREV_(next, offset) = &NS_LIST_NEXT_(entry, offset); + } + else + { + list->last_nextptr = &NS_LIST_NEXT_(entry, offset); + } + + list->first_entry = entry; +} + +NS_LIST_FN void ns_list_add_after_(ns_list_t *list, ns_list_offset_t offset, void *current, void * restrict entry) +{ + void *next; + + NS_LIST_PREV_(entry, offset) = &NS_LIST_NEXT_(current, offset); + NS_LIST_NEXT_(entry, offset) = next = NS_LIST_NEXT_(current, offset); + + if (next) + { + NS_LIST_PREV_(next, offset) = &NS_LIST_NEXT_(entry, offset); + } + else + { + list->last_nextptr = &NS_LIST_NEXT_(entry, offset); + } + + NS_LIST_NEXT_(current, offset) = entry; +} + +NS_LIST_FN void ns_list_add_before_(ns_list_offset_t offset, void *current, void * restrict entry) +{ + void **prev_nextptr; + + NS_LIST_NEXT_(entry, offset) = current; + NS_LIST_PREV_(entry, offset) = prev_nextptr = NS_LIST_PREV_(current, offset); + *prev_nextptr = entry; + NS_LIST_PREV_(current, offset) = &NS_LIST_NEXT_(entry, offset); +} + +NS_LIST_FN void ns_list_add_to_end_(ns_list_t *list, ns_list_offset_t offset, void * restrict entry) +{ + void **prev_nextptr; + + NS_LIST_NEXT_(entry, offset) = NULL; + NS_LIST_PREV_(entry, offset) = prev_nextptr = list->last_nextptr; + *prev_nextptr = entry; + list->last_nextptr = &NS_LIST_NEXT_(entry, offset); +} + +NS_LIST_FN void *ns_list_get_next_(ns_list_offset_t offset, const void *current) +{ + return NS_LIST_NEXT_(current, offset); +} + +NS_LIST_FN void *ns_list_get_previous_(const ns_list_t *list, ns_list_offset_t offset, const void *current) +{ + if(current == list->first_entry) + { + return NULL; + } + + // Tricky. We don't have a direct previous pointer, but a pointer to the + // pointer that points to us - ie &head->first_entry OR &{prev}->next. + // This makes life easier on insertion and removal, but this is where we + // pay the price. + + // We have to check manually for being the first entry above, so we know it's + // a real link's next pointer. Then next is the first field of + // ns_list_link_t, so we can use the normal offset value. + + return NS_LIST_ENTRY_(NS_LIST_PREV_(current, offset), offset); +} + +NS_LIST_FN void *ns_list_get_last_(const ns_list_t *list, ns_list_offset_t offset) +{ + if(!list->first_entry) + { + return NULL; + } + + // See comments in ns_list_get_previous_() + return NS_LIST_ENTRY_(list->last_nextptr, offset); +} + +NS_LIST_FN void ns_list_remove_(ns_list_t *list, ns_list_offset_t offset, void *removed) +{ + void *next; + void **prev_nextptr; + + next = NS_LIST_NEXT_(removed, offset); + prev_nextptr = NS_LIST_PREV_(removed, offset); + if (next) + { + NS_LIST_PREV_(next, offset) = prev_nextptr; + } + else + { + list->last_nextptr = prev_nextptr; + } + *prev_nextptr = next; + + ns_list_link_init_(NS_LIST_LINK_(removed, offset)); +} + +NS_LIST_FN void ns_list_replace_(ns_list_t *list, ns_list_offset_t offset, void *current, void * restrict replacement) +{ + void *next; + void **prev_nextptr; + + NS_LIST_PREV_(replacement, offset) = prev_nextptr = NS_LIST_PREV_(current, offset); + NS_LIST_NEXT_(replacement, offset) = next = NS_LIST_NEXT_(current, offset); + + if (next) + { + NS_LIST_PREV_(next, offset) = &NS_LIST_NEXT_(replacement, offset); + } + else + { + list->last_nextptr = &NS_LIST_NEXT_(replacement, offset); + } + *prev_nextptr = replacement; + + ns_list_link_init_(NS_LIST_LINK_(current, offset)); +} + +NS_LIST_FN void ns_list_concatenate_(ns_list_t *dst, ns_list_t *src, ns_list_offset_t offset) +{ + ns_list_link_t *src_first; + + src_first = src->first_entry; + if (!src_first) + return; + + *dst->last_nextptr = src_first; + NS_LIST_PREV_(src_first, offset) = dst->last_nextptr; + dst->last_nextptr = src->last_nextptr; + + ns_list_init_(src); +} + +NS_LIST_FN uint_fast16_t ns_list_count_(const ns_list_t *list, ns_list_offset_t offset) +{ + uint_fast16_t count = 0; + + for (void *p = list->first_entry; p; p = NS_LIST_NEXT_(p, offset)) + { + count++; + } + + return count; +} +#endif /* defined NS_ALLOW_INLINING || defined NS_LIST_FN */ + +#ifdef __cplusplus +} +#endif + +#endif /* NS_LIST_H_ */ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/ns_types.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +/* + * ns_types.h - Basic compiler and type setup for Nanostack libraries. + */ +#ifndef NS_TYPES_H_ +#define NS_TYPES_H_ + +/** \file + * \brief Basic compiler and type setup + * + * We currently assume C99 or later. + * + * C99 features being relied on: + * + * - <inttypes.h> and <stdbool.h> + * - inline (with C99 semantics, not C++ as per default GCC); + * - designated initialisers; + * - compound literals; + * - restrict; + * - [static N] in array parameters; + * - declarations in for statements; + * - mixing declarations and statements + * + * Compilers should be set to C99 or later mode when building Nanomesh source. + * For GCC this means "-std=gnu99" (C99 with usual GNU extensions). + * + * Also, a little extra care is required for public header files that could be + * included from C++, especially as C++ lacks some C99 features. + * + * (TODO: as this is exposed to API users, do we need a predefine to distinguish + * internal and external use, for finer control? Not yet, but maybe...) + */ + +/* Make sure <stdint.h> defines its macros if C++ */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif + +#include <stddef.h> +#include <inttypes.h> // includes <stdint.h>; debugf() users need PRIu32 etc +#include <stdbool.h> + +#if defined __GNUC__ && defined __arm__ +/* arm-none-eabi-gcc 4.8-2014q3 has a problem in its <inttypes.h>: + * int_fast32_t is defined as int, but PRI<x>FAST32 are defined as "l<x>". + * Try to detect this situation and override it. + * Very hard to detect types in the preprocessor - this is best I could do. + * Expansion works by: + * NS_TEST_Y(INT_FAST32_MAX) -> NS_TEST_X(2147483647) -> __NS2147483647 -> 1 + * Nested macros are needed so we don't get __NSINT_FAST32_MAX. + */ +#define __NS2147483647 1 +#define __NS2147483647L 2 +#define NS_TEST_X(x) __NS##x +#define NS_TEST_Y(x) NS_TEST_X(x) + +#if NS_TEST_Y(INT_FAST32_MAX) == __NS2147483647 && \ + NS_TEST_Y(INT_LEAST32_MAX) == __NS2147483647L && \ + NS_TEST_Y(INT32_MAX) == __NS2147483647L + +// Fast 32-bit types are int, others are long - this is the problem case in +// arm-none-eabi-gcc. +#undef PRIoFAST32 +#undef PRIuFAST32 +#undef PRIxFAST32 +#undef PRIXFAST32 +#undef PRIdFAST32 +#undef PRIiFAST32 +#define PRIoFAST32 "o" +#define PRIuFAST32 "u" +#define PRIxFAST32 "x" +#define PRIXFAST32 "X" +#define PRIdFAST32 "d" +#define PRIiFAST32 "i" +#endif +#undef NS_TEST_X +#undef NS_TEST_Y +#undef __NS2147483647 +#undef __NS2147483647L +#endif + +/* + * Create the optional <stdint.h> 24-bit types if they don't exist (worth trying + * to use them, as they could exist and be more efficient than 32-bit on 8-bit + * systems...) + */ +#ifndef UINT24_LEAST_MAX +typedef uint_least32_t uint_least24_t; +#define UINT_LEAST24_MAX UINT_LEAST32_MAX +#define UINT24_C(x) UINT32_C(x) +#define PRIoLEAST24 PRIoLEAST32 +#define PRIuLEAST24 PRIuLEAST32 +#define PRIxLEAST24 PRIxLEAST32 +#define PRIXLEAST24 PRIXLEAST32 +#endif + +#ifndef INT24_LEAST_MAX +typedef int_least32_t int_least24_t; +#define INT24_LEAST_MIN INT_LEAST32_MIN +#define INT24_LEAST_MAX INT_LEAST32_MAX +#define INT24_C(x) INT32_C(x) +#define PRIdLEAST24 PRIdLEAST32 +#define PRIiLEAST24 PRIiLEAST32 +#endif + +#ifndef UINT24_FAST_MAX +typedef uint_fast32_t uint_fast24_t; +#define UINT_FAST24_MAX UINT_FAST32_MAX +#define PRIoFAST24 PRIoFAST32 +#define PRIuFAST24 PRIuFAST32 +#define PRIxFAST24 PRIxFAST32 +#define PRIXFAST24 PRIXFAST32 +#endif + +#ifndef INT24_FAST_MAX +typedef int_fast32_t int_fast24_t; +#define INT_FAST24_MIN INT_FAST32_MIN +#define INT_FAST24_MAX INT_FAST32_MAX +#define PRIdFAST24 PRIdFAST32 +#define PRIiFAST24 PRIiFAST32 +#endif + +/* C11's "noreturn" macro, emulated if necessary */ +#ifndef noreturn +#if defined __cplusplus && __cplusplus >= 201103L +// noreturn is a C++11 keyword +#elif __STDC_VERSION__ >= 201112L +#include <stdnoreturn.h> +#elif defined __GNUC__ +#define noreturn /*__attribute__((__noreturn__))*/ +#elif defined __CC_ARM +#define noreturn __declspec(noreturn) +#elif defined __IAR_SYSTEMS_ICC__ +#define noreturn __noreturn +#else +#define noreturn +#endif +#endif + +/* C11's "alignas" macro, emulated for integer expressions if necessary */ +#ifndef __alignas_is_defined +#if __STDC_VERSION__ >= 201112L || (defined __cplusplus && __cplusplus >= 201103L) +#include <stdalign.h> +#elif defined __GNUC__ +#define alignas(n) __attribute__((__aligned__(n))) +#define __alignas_is_defined 1 +#elif defined __CC_ARM || defined __TASKING__ +#define alignas(n) __align(n) +#define __alignas_is_defined 1 +#elif defined __IAR_SYSTEMS_ICC__ +/* Does this really just apply to the next variable? */ +#define alignas(n) __Alignas(data_alignment=n) +#define __Alignas(x) _Pragma(#x) +#define __alignas_is_defined 1 +#endif +#endif + +/** + * Marker for functions or objects that may be unused, suppressing warnings. + * Place after the identifier: + * ~~~ + * static int X MAYBE_UNUSED = 3; + * static int foo(void) MAYBE_UNUSED; + * ~~~ + */ +#if defined __CC_ARM || defined __GNUC__ +#define MAYBE_UNUSED __attribute__((unused)) +#else +#define MAYBE_UNUSED +#endif + +/* + * C++ (even C++11) doesn't provide restrict: define away or provide + * alternative. + */ +#ifdef __cplusplus +#ifdef __GNUC__ +#define restrict __restrict +#else +#define restrict +#endif +#endif /* __cplusplus */ + + +/** + * C++ doesn't allow "static" in function parameter types: ie + * ~~~ + * entry_t *find_entry(const uint8_t address[static 16]) + * ~~~ + * If a header file may be included from C++, use this __static define instead. + * + * (Syntax introduced in C99 - `uint8_t address[16]` in a prototype was always + * equivalent to `uint8_t *address`, but the C99 addition of static tells the + * compiler that address is never NULL, and always points to at least 16 + * elements. This adds no new type-checking, but the information could aid + * compiler optimisation, and it can serve as documentation). + */ +#ifdef __cplusplus +#define __static +#else +#define __static static +#endif + +#ifdef __GNUC__ +#define NS_GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#endif + +/** \brief Compile-time assertion + * + * C11 provides _Static_assert, as does GCC even in C99 or C++ mode (and + * as a freestanding implementation, we can't rely on <assert.h> to get + * the static_assert macro). + * C++11 provides static_assert as a keyword. + * + * The assertion acts as a declaration that can be placed at file scope, in a + * code block (except after a label), or as a member of a struct/union. It + * produces a compiler error if "test" evaluates to 0. + * + * Note that this *includes* the required semicolon when defined, else it + * is totally empty, permitting use in structs. (If the user provided the `;`, + * it would leave an illegal stray `;` if unavailable). + */ +#if __STDC_VERSION__ >= 201112L +#define NS_STATIC_ASSERT(test, str) _Static_assert(test, str); +#elif defined __cplusplus && __cplusplus >= 201103L +#define NS_STATIC_ASSERT(test, str) static_assert(test, str); +#elif defined __GNUC__ && NS_GCC_VERSION >= 40600 +//#define NS_STATIC_ASSERT(test, str) __extension__ _Static_assert(test, str); +#define NS_STATIC_ASSERT(test, str) +#else +#define NS_STATIC_ASSERT(test, str) +#endif + +#define static_assert _Static_assert + +/** \brief Pragma to suppress warnings about unusual pointer values. + * + * Useful if using "poison" values. + */ +#ifdef __IAR_SYSTEMS_ICC__ +#define NS_FUNNY_INTPTR_OK _Pragma("diag_suppress=Pe1053") +#define NS_FUNNY_INTPTR_RESTORE _Pragma("diag_default=Pe1053") +#else +#define NS_FUNNY_INTPTR_OK +#define NS_FUNNY_INTPTR_RESTORE +#endif + +/** \brief Convert pointer to member to pointer to containing structure */ +#define NS_CONTAINER_OF(ptr, type, member) \ + ((type *) ((char *) (ptr) - offsetof(type, member))) + +/* + * Inlining could cause problems when mixing with C++; provide a mechanism to + * disable it. This could also be turned off for other reasons (although + * this can usually be done through a compiler flag, eg -O0 on gcc). + */ +#ifndef __cplusplus +#define NS_ALLOW_INLINING +#endif + +/* There is inlining problem in GCC version 4.1.x and we know it works in 4.6.3 */ +#if defined __GNUC__ && NS_GCC_VERSION < 40600 +#undef NS_ALLOW_INLINING +#endif + +/** \brief Mark a potentially-inlineable function. + * + * We follow C99 semantics, which requires precisely one external definition. + * To also allow inlining to be totally bypassed under control of + * NS_ALLOW_INLINING, code can be structured as per the example of ns_list: + * + * foo.h + * ----- + * ~~~ + * NS_INLINE int my_func(int); + * + * #if defined NS_ALLOW_INLINING || defined FOO_FN + * #ifndef FOO_FN + * #define FOO_FN NS_INLINE + * #endif + * FOO_FN int my_func(int a) + * { + * definition; + * } + * #endif + * ~~~ + * foo.c + * ----- + * ~~~ + * #define FOO_FN extern + * #include "foo.h" + * ~~~ + * Which generates: + * ~~~ + * NS_ALLOW_INLINING set NS_ALLOW_INLINING unset + * ===================== ======================= + * Include foo.h Include foo.h + * ------------- ------------- + * inline int my_func(int); int my_func(int); + * + * // inline definition + * inline int my_func(int a) + * { + * definition; + * } + * + * Compile foo.c Compile foo.c + * ------------- ------------- + * (from .h) inline int my_func(int); int my_func(int); + * + * // external definition + * // because of no "inline" // normal external definition + * extern int my_func(int a) extern int my_func(int a) + * { { + * definition; definition; + * } } + * ~~~ + * + * Note that even with inline keywords, whether the compiler inlines or not is + * up to it. For example, gcc at "-O0" will not inline at all, and will always + * call the real functions in foo.o, just as if NS_ALLOW_INLINING was unset. + * At "-O2", gcc could potentially inline everything, meaning that foo.o is not + * referenced at all. + * + * Alternatively, you could use "static inline", which gives every caller its + * own internal definition. This is compatible with C++ inlining (which expects + * the linker to eliminate duplicates), but in C it's less efficient if the code + * ends up non-inlined, and it's harder to breakpoint. I don't recommend it + * except for the most trivial functions (which could then probably be macros). + */ +#ifdef NS_ALLOW_INLINING +#define NS_INLINE inline +#else +#define NS_INLINE +#endif + +#if defined __SDCC_mcs51 || defined __ICC8051__ || defined __C51__ + +/* The 8051 environments: SDCC (historic), IAR (current), Keil (future?) */ + +#define NS_LARGE __xdata +#define NS_LARGE_PTR __xdata +#ifdef __ICC8051__ +#define NS_REENTRANT +#define NS_REENTRANT_PREFIX __idata_reentrant +#else +#define NS_REENTRANT __reentrant +#define NS_REENTRANT_PREFIX +#endif +#define NS_NEAR_FUNC __near_func + +#else + +/* "Normal" systems. Define it all away. */ +#define NS_LARGE +#define NS_LARGE_PTR +#define NS_REENTRANT +#define NS_REENTRANT_PREFIX +#define NS_NEAR_FUNC + +#endif + +/** \brief Scatter-gather descriptor + * + * Slightly optimised for small platforms - we assume we won't need any + * element bigger than 64K. + */ +typedef struct ns_iovec +{ + void *iov_base; + uint_fast16_t iov_len; +} ns_iovec_t; +#endif /* NS_TYPES_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sal/socket_api.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,164 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__ +#define __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__ + +#include <stdint.h> +#include "socket_types.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SOCKET_MAX_STACKS +#define SOCKET_MAX_STACKS 2 +#endif + +typedef socket_error_t (*socket_init)(); +typedef socket_error_t (*socket_create)(struct socket *socket, + const socket_address_family_t af, const socket_proto_family_t pf, + socket_api_handler_t const handler); +typedef socket_error_t (*socket_destroy)(struct socket *socket); +typedef socket_error_t (*socket_close)(struct socket *socket); +typedef socket_api_handler_t (*socket_periodic_task)(const struct socket * socket); +typedef uint32_t (*socket_periodic_interval)(const struct socket * socket); +typedef socket_error_t (*socket_resolve)(struct socket *socket, const char *address); +typedef socket_error_t (*socket_connect)(struct socket *sock, const struct socket_addr *address, const uint16_t port); +typedef socket_error_t (*socket_bind)(struct socket *socket, const struct socket_addr *address, const uint16_t port); +typedef socket_error_t (*socket_str2addr)(const struct socket *socket, struct socket_addr *addr, const char *address); +typedef socket_error_t (*socket_start_listen)(struct socket *socket, const uint32_t backlog); +typedef socket_error_t (*socket_stop_listen)(struct socket *socket); +typedef socket_error_t (*socket_accept)(struct socket *sock, socket_api_handler_t handler); +typedef socket_error_t (*socket_reject)(struct socket *sock); +typedef socket_error_t (*socket_send)(struct socket *socket, const void * buf, const size_t len); +typedef socket_error_t (*socket_send_to)(struct socket *socket, const void * buf, const size_t len, const struct socket_addr *addr, const uint16_t port); +typedef socket_error_t (*socket_recv)(struct socket *socket, void * buf, size_t *len); +typedef socket_error_t (*socket_recv_from)(struct socket *socket, void * buf, size_t *len, struct socket_addr *addr, uint16_t *port); + +typedef socket_error_t (*socket_get_local_addr)(const struct socket *socket, struct socket_addr *addr); +typedef socket_error_t (*socket_get_remote_addr)(const struct socket *socket, struct socket_addr *addr); +typedef socket_error_t (*socket_get_local_port)(const struct socket *socket, uint16_t *port); +typedef socket_error_t (*socket_get_remote_port)(const struct socket *socket, uint16_t *port); + +typedef uint8_t (*socket_is_connected)(const struct socket *socket); +typedef uint8_t (*socket_is_bound)(const struct socket *socket); + +struct socket_api { + socket_stack_t stack; + uint32_t version; + socket_init init; + socket_create create; + socket_destroy destroy; + socket_close close; + socket_periodic_task periodic_task; + socket_periodic_interval periodic_interval; + socket_resolve resolve; + socket_connect connect; + socket_str2addr str2addr; + socket_bind bind; + socket_start_listen start_listen; + socket_stop_listen stop_listen; + socket_accept accept; + socket_reject reject; + socket_send send; + socket_send_to send_to; + socket_recv recv; + socket_recv_from recv_from; + socket_is_connected is_connected; + socket_is_bound is_bound; + socket_get_local_addr get_local_addr; + socket_get_remote_addr get_remote_addr; + socket_get_local_port get_local_port; + socket_get_remote_port get_remote_port; +}; +#define SOCKET_API_FIRST_PTR init +#define SOCKET_API_LAST_PTR get_remote_port + +socket_error_t socket_register_stack(const struct socket_api * api); +const char * socket_strerror(const socket_error_t err); +const struct socket_api * socket_get_api(const socket_stack_t stack); + +static inline int socket_addr_is_ipv4(const struct socket_addr *addr) +{ + if ((addr->ipv6be[0] == 0) && + (addr->ipv6be[1] == 0) && + (addr->ipv6be[2] == 0)) { + return 1; + } else { + return 0; + } +} +static inline int socket_addr_is_any(const struct socket_addr *addr) +{ + if ((addr->ipv6be[0] == 0) && + (addr->ipv6be[1] == 0) && + (addr->ipv6be[2] == 0) && + (addr->ipv6be[3] == 0)) { + return 1; + } else { + return 0; + } +} +static inline void socket_addr_set_ipv4_addr(struct socket_addr *addr, uint32_t ipv4addr) +{ + addr->ipv6be[0] = 0; + addr->ipv6be[1] = 0; + addr->ipv6be[2] = 0; + addr->ipv6be[3] = ipv4addr; +} +static inline uint32_t socket_addr_get_ipv4_addr(const struct socket_addr *addr) +{ + if (!socket_addr_is_ipv4(addr)) { + return 0; + } + return addr->ipv6be[3]; +} +static inline const uint32_t * socket_addr_get_ipv4_addrp(const struct socket_addr *addr) +{ + if (!socket_addr_is_ipv4(addr)) { + return NULL; + } + return &addr->ipv6be[3]; +} +static inline void socket_addr_set_any(struct socket_addr *addr) +{ + addr->ipv6be[0] = 0; + addr->ipv6be[1] = 0; + addr->ipv6be[2] = 0; + addr->ipv6be[3] = 0; +} + +static inline void socket_addr_copy(struct socket_addr *dest, const struct socket_addr *src) +{ + (dest)->ipv6be[0] = (src)->ipv6be[0]; + (dest)->ipv6be[1] = (src)->ipv6be[1]; + (dest)->ipv6be[2] = (src)->ipv6be[2]; + (dest)->ipv6be[3] = (src)->ipv6be[3]; +} +static inline int socket_addr_cmp(const struct socket_addr *a, const struct socket_addr *b) +{ + return + a->ipv6be[0] != b->ipv6be[0] || + a->ipv6be[1] != b->ipv6be[1] || + a->ipv6be[2] != b->ipv6be[2] || + a->ipv6be[3] != b->ipv6be[3]; +} + +#ifdef __cplusplus +} +#endif + +#endif /* __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sal/socket_types.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,181 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKET_ABSTRACT_SOCKET_TYPES_H__ +#define __MBED_NET_SOCKET_ABSTRACT_SOCKET_TYPES_H__ + +#include <stddef.h> +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MBED_NET_LWIP +#define MBED_NET_LWIP 1 +#endif + +typedef enum { + SOCKET_ERROR_NONE = 0, + SOCKET_ERROR_UNKNOWN, + SOCKET_ERROR_UNIMPLEMENTED, + SOCKET_ERROR_BUSY, + SOCKET_ERROR_NULL_PTR, + SOCKET_ERROR_BAD_FAMILY, + SOCKET_ERROR_TIMEOUT, + SOCKET_ERROR_BAD_ALLOC, + SOCKET_ERROR_NO_CONNECTION, + SOCKET_ERROR_SIZE, + SOCKET_ERROR_STACK_EXISTS, + SOCKET_ERROR_STACKS, + SOCKET_ERROR_BAD_STACK, + SOCKET_ERROR_BAD_ADDRESS, + SOCKET_ERROR_DNS_FAILED, + SOCKET_ERROR_WOULD_BLOCK, + SOCKET_ERROR_CLOSED, + SOCKET_ERROR_VALUE, + SOCKET_ERROR_ADDRESS_IN_USE, + SOCKET_ERROR_ALREADY_CONNECTED, + SOCKET_ERROR_ABORT, + SOCKET_ERROR_RESET, + SOCKET_ERROR_BAD_ARGUMENT, + SOCKET_ERROR_INTERFACE_ERROR, + SOCKET_ERROR_API_VERSION, + SOCKET_ERROR_NOT_BOUND, + +} socket_error_t; + +typedef enum { + SOCKET_ALLOC_HEAP = 0, + SOCKET_ALLOC_POOL_BEST, +} socket_alloc_pool_t; + +typedef enum { + SOCKET_AF_UNINIT, + SOCKET_AF_INET4, + SOCKET_AF_INET6, + SOCKET_AF_MAX, +} socket_address_family_t; + +typedef enum { + SOCKET_PROTO_UNINIT = 0, + SOCKET_DGRAM, + SOCKET_STREAM, + SOCKET_PROTO_MAX, +} socket_proto_family_t; + +typedef enum { + SOCKET_EVENT_NONE = 0, + SOCKET_EVENT_ERROR, + SOCKET_EVENT_RX_DONE, + SOCKET_EVENT_TX_DONE, + SOCKET_EVENT_RX_ERROR, + SOCKET_EVENT_TX_ERROR, + SOCKET_EVENT_CONNECT, + SOCKET_EVENT_DISCONNECT, + SOCKET_EVENT_DNS, + SOCKET_EVENT_ACCEPT, +} event_flag_t; + +typedef enum { + SOCKET_STATUS_IDLE = 0, + SOCKET_STATUS_RX_BUSY = 1 << 0, + SOCKET_STATUS_TX_BUSY = 1 << 1, + SOCKET_STATUS_CONNECTED = 1 << 2, + SOCKET_STATUS_BOUND = 1 << 3, +} socket_status_t; + +typedef enum { + SOCKET_STACK_UNINIT = 0, + SOCKET_STACK_LWIP_IPV4, + SOCKET_STACK_LWIP_IPV6, + SOCKET_STACK_RESERVED, + SOCKET_STACK_NANOSTACK_IPV6, + SOCKET_STACK_PICOTCP, + SOCKET_STACK_MAX, +} socket_stack_t; + +typedef enum { + SOCKET_BUFFER_UNINITIALISED = 0, + SOCKET_BUFFER_RAW, + SOCKET_BUFFER_LWIP_PBUF, + SOCKET_BUFFER_NANOSTACK_PBUF, +} socket_buffer_type_t; + +struct socket_addr { + uint32_t ipv6be[4]; +}; + +struct socket_buffer { + socket_buffer_type_t type; + const struct socket_buf_api *api; + void *impl; +}; + +struct socket_rawbuf { + void * buf; + size_t size; + size_t pos; +}; + +typedef void (*socket_api_handler_t)(void); +typedef struct { + void * (*alloc)(void *,const size_t); + void (*dealloc)(void *, void *); + void *context; +} socket_allocator_t; + +struct socket_tx_info { + uint16_t sentbytes; +}; + +struct socket_dns_info { + struct socket_addr addr; // A stack-specific socket address struct + const char *domain; +}; + +struct socket_accept_info { + void * newimpl; + uint8_t reject; +}; + +struct socket_event { + event_flag_t event; + struct socket *sock; + union { + struct socket_tx_info t; + socket_error_t e; + struct socket_dns_info d; + struct socket_accept_info a; + } i; +}; +typedef struct socket_event socket_event_t; + +struct socket { + socket_api_handler_t handler; + socket_event_t *event; // TODO: (CThunk upgrade/Alpha3) + const struct socket_api *api; + void *impl; + socket_status_t status; + uint8_t family; + socket_stack_t stack; + void *rxBufChain; // TODO: Only required in some stacks, which do not support BSD-style buffering +}; + +#ifdef __cplusplus +} +#endif +#endif /* __MBED_NET_SOCKET_ABSTRACT_SOCKET_TYPES_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/Socket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_SOCKET_H__ +#define __MBED_NET_SOCKETS_SOCKET_H__ + +/* Include all versions of the API */ +#include "v0/Socket.h" + +/* Set the current namespace */ +namespace mbed { + namespace Sockets { + namespace current { + using namespace mbed::Sockets::v0; + } + } +} + +#endif // __MBED_NET_SOCKETS_SOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/SocketAddr.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_SOCKETADDR_H__ +#define __MBED_NET_SOCKETS_SOCKETADDR_H__ + +/* Include all versions of the API */ +#include "v0/SocketAddr.h" + +/* Set the current namespace */ +namespace mbed { + namespace Sockets { + namespace current { + using namespace mbed::Sockets::v0; + } + } +} + +#endif // __MBED_NET_SOCKETS_SOCKETADDR_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/UDPSocket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_UDPSOCKET_H__ +#define __MBED_NET_SOCKETS_UDPSOCKET_H__ + +/* Include all versions of the API */ +#include "v0/UDPSocket.h" + +/* Set the current namespace */ +namespace mbed { + namespace Sockets { + namespace current { + using namespace mbed::Sockets::v0; + } + } +} + +#endif // __MBED_NET_SOCKETS_UDPSOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/v0/Socket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,268 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_SOCKET_H__ +#define __MBED_NET_SOCKETS_V0_SOCKET_H__ + + +#include <stddef.h> +#include <stdint.h> +#include "mbed.h" +#include "FunctionPointer.h" +#include "CThunk.h" +#include "sal/socket_types.h" +#include "SocketAddr.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +/** + * \brief Socket implements most of the interfaces required for sockets. + * Socket is a pure virtual class; it should never be instantiated directly, but it provides + * common functionality for derived classes. + */ +class Socket { +public: + typedef FunctionPointer3<void, Socket *, struct socket_addr, const char *> DNSHandler_t; + typedef FunctionPointer2<void, Socket *, socket_error_t> ErrorHandler_t; + typedef FunctionPointer1<void, Socket *> ReadableHandler_t; + typedef FunctionPointer2<void, Socket *, uint16_t> SentHandler_t; +protected: + /** + * Socket constructor + * Initializes the Socket object. Initializes the underlying struct socket. Does not instantiate + * an underlying network stack socket. + * Since it is somewhat awkward to provide the network stack, a future change will provide + * a way to pass the network interface to the socket constructor, which will extract the stack from + * the interface. + * @param[in] stack The network stack to use for this socket. + */ + Socket(const socket_stack_t stack); + /** + * Socket destructor + * Frees the underlying socket implementation. + */ + virtual ~Socket(); +public: + /** + * Start the process of resolving a domain name. + * If the input is a text IP address, an event is queued immediately; otherwise, onDNS is + * queued as soon as DNS is resolved. + * The socket must have been opened before resolve is called + * @param[in] address The domain name to resolve + * @param[in] onDNS The handler to call when the name is resolved + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t resolve(const char* address, const DNSHandler_t &onDNS); + /** + * Open the socket. + * Instantiates and initializes the underlying socket. Receive is started immediately after + * the socket is opened. + * @param[in] af Address family (SOCKET_AF_INET4 or SOCKET_AF_INET6), currently only IPv4 is supported + * @param[in] pf Protocol family (SOCKET_DGRAM or SOCKET_STREAM) + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t open(const socket_address_family_t af, const socket_proto_family_t pf); + /** + * Binds the socket's local address and IP. + * 0.0.0.0 is accepted as a local address if only the port is meant to be bound. + * The behaviour of bind("0.0.0.0",...) is undefined where two or more stacks are in use. + * + * @param[in] address The string representation of the address to bind + * @param[in] port The local port to bind + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t bind(const char *address, const uint16_t port); + /** + * bind(const SocketAddr *, const uint16_t) is the same as bind(const char *, const uint16_t), + * except that the address passed in is a SocketAddr. + * @param[in] address The address to bind + * @param[in] port The local port to bind + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t bind(const SocketAddr *address, const uint16_t port); + /** + * Set the error handler. + * Errors are ignored if onError is not set. + * @param[in] onError + */ + virtual void setOnError(const ErrorHandler_t &onError); + /** + * Set the received data handler + * Received data is queued until it is read using recv or recv_from. + * @param[in] onReadable the handler to use for receive events + */ + virtual void setOnReadable(const ReadableHandler_t &onReadable); + /** + * Receive a message + * @param[out] buf The buffer to fill + * @param[in,out] len A pointer to the size of the receive buffer. Sets the maximum number of bytes + * to read but is updated with the actual number of bytes copied on success. len is not changed on + * failure + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t recv(void * buf, size_t *len); + /** + * Receive a message with the sender address and port + * This API is not valid for SOCK_STREAM + * @param[out] buf The buffer to fill + * @param[in,out] len A pointer to the size of the receive buffer. Sets the maximum number of bytes + * to read but is updated with the actual number of bytes copied on success. len is not changed on + * failure + * @param[out] remote_addr Pointer to an address structure to fill with the sender address + * @param[out] remote_port Pointer to a uint16_t to fill with the sender port + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t recv_from(void * buf, size_t *len, SocketAddr *remote_addr, uint16_t *remote_port); + /** + * Set the onSent handler. + * The exact moment this handler is called varies from implementation to implementation. + * On LwIP, onSent is called when the remote host ACK's data in TCP sockets, or when the message enters + * the network stack in UDP sockets. + * @param[in] onSent The handler to call when a send completes + */ + virtual void setOnSent(const SentHandler_t &onSent); + /** + * Send a message + * Sends a message over an open connection. This call is valid for UDP sockets, provided that connect() + * has been called. + * @param[in] buf The payload to send + * @param[in] len The size of the payload + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t send(const void * buf, const size_t len); + /** + * Send a message to a specific address and port + * This API is not valid for SOCK_STREAM + * @param[in] buf The payload to send + * @param[in] len The size of the payload + * @param[in] address The address to send to + * @param[in] port The remote port to send to + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t send_to(const void * buf, const size_t len, const SocketAddr *remote_addr, uint16_t remote_port); + /** + * Shuts down a socket. + * Sending and receiving are no longer possible after close() is called. + * The socket is not deallocated on close. A socket must not be reopened, it should be + * destroyed (either with delete, or by going out of scope) after calling close. + * Calling open on a closed socket can result in a memory leak. + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t close(); + /** + * Error checking utility + * Generates an event on error, does nothing on SOCKET_ERROR_NONE + * @param[in] err the error code to check + * @return false if err is SOCKET_ERROR_NONE, true otherwise + */ + virtual bool error_check(socket_error_t err); + + /** + * Checks the socket status to determine whether it is still connected. + * @return true if the socket is connected, false if it is not + */ + virtual bool isConnected() const; + + /** + * Get the local address of the socket if bound. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been bound, returns SOCKET_ERROR_NOT_BOUND + * 3. If addr is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the SocketAddr object with the local address + * + * @param[out] addr a pointer to a SocketAddr object + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getLocalAddr(SocketAddr *addr) const; + + /** + * Get the local port of the socket if bound. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been bound, returns SOCKET_ERROR_NOT_BOUND + * 3. If port is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the uint16_t object with the local port + * + * @param[out] port a pointer to a uint16_t + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getLocalPort(uint16_t *port) const; + + /** + * Get the remote address of the socket if connected. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been connected, returns SOCKET_ERROR_NO_CONNECTION + * 3. If addr is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the SocketAddr object with the remote address + * + * @param[out] addr a pointer to a SocketAddr object + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getRemoteAddr(SocketAddr *addr) const; + /** + * Get the remote port of the socket if connected. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been connected, returns SOCKET_ERROR_NO_CONNECTION + * 3. If port is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the uint16_t object with the remote port + * + * @param[out] port a pointer to a uint16_t + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getRemotePort(uint16_t *port) const; + +#if 0 // not implemented yet + static long ntohl(long); + static short ntohs(short); + static long long ntohll(long long); +#endif + +protected: + /** + * The internal event handler + * @param[in] ev The event to handle + */ + virtual void _eventHandler(struct socket_event *ev); + +protected: + DNSHandler_t _onDNS; + ErrorHandler_t _onError; + ReadableHandler_t _onReadable; + SentHandler_t _onSent; + + CThunk<Socket> _irq; + struct socket _socket; +private: + socket_event_t *_event; + /** + * Internal event handler. + * @param[in] arg + */ + void _nvEventHandler(void * arg); +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_SOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/v0/SocketAddr.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,43 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_SOCKETADDR_H__ +#define __MBED_NET_SOCKETS_V0_SOCKETADDR_H__ + +#include "sal/socket_types.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +class SocketAddr { +public: + struct socket_addr * getAddr() {return &_addr;} + const struct socket_addr * getAddr() const {return &_addr;} + void setAddr(const struct socket_addr *addr); + void setAddr(const SocketAddr *addr); + size_t getAddrSize() const {return sizeof(_addr.ipv6be);} + bool is_v4(); + + int fmtIPv4(char *buf, size_t size); + int fmtIPv6(char *buf, size_t size); +protected: + struct socket_addr _addr; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_SOCKETADDR_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/v0/TCPAsynch.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,47 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_TCP_ASYNCH__ +#define __MBED_NET_SOCKETS_V0_TCP_ASYNCH__ + +#include "Socket.h" +#include "sal/socket_api.h" + +#include "Ticker.h" + +namespace mbed { +namespace Sockets { +namespace v0 { +class TCPAsynch: public Socket { +protected: + TCPAsynch(const socket_stack_t stack); + ~TCPAsynch(); + +public: + virtual socket_error_t open(const socket_address_family_t af); +protected: + static Ticker _ticker; + static FunctionPointer0<void> _tick_handler; + // uintptr_t is used to guarantee that there will always be a large enough + // counter to avoid overflows. Memory allocation will always fail before + // counter overflow if the counter is the same size as the pointer type and + // sizeof(TCPAsynch) > 0 + static uintptr_t _TCPSockets; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_TCP_ASYNCH__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/v0/TCPListener.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,86 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_TCPLISTENER_H__ +#define __MBED_NET_SOCKETS_V0_TCPLISTENER_H__ + +#include <stddef.h> +#include <stdint.h> +#include "mbed/FunctionPointer.h" +#include "TCPAsynch.h" +#include "TCPStream.h" + +namespace mbed { +namespace Sockets { +namespace v0 { +/** \brief TCPListener: a TCP server socket + * The TCPListener listens for incoming connections. Prior to listening, the + * TCPListener must be bound to a port and, optionally, an address. + */ +class TCPListener: public TCPAsynch { +public: + typedef FunctionPointer2<void, TCPListener *, void *> IncomingHandler_t; + /** + * The TCP Listener constructor. + * @param[in] stack the network stack to use + */ + TCPListener(const socket_stack_t stack); + + /** + * The TCP Listener destructor + * This performs teardown of the listener + */ + ~TCPListener(); + + /** + * Begin listening for incoming connections. + * The supplied listenHandler will be called whenever an incoming connection arrives + * To reject a connection, the event handler needs to set the reject flag in the event. + * @param[in] listenHandler The event handler to call when an incoming connection arrives + * @param[in] backlog The number of connection requests to keep in the backlog + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t start_listening(IncomingHandler_t listenHandler, uint32_t backlog = 0); + /** + * Stop listening for incoming connections + * After this call, the server will reject incoming connections until start_listening is called again + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t stop_listening(); + + /** + * accept is a utility function for constructing a new TCPStream from an incoming connection + * The event passed to the listenHandler contains a pointer to a low level implementation of an + * already connected socket. This function + * @param new_impl + * @return + */ + virtual TCPStream * accept(void *new_impl); + virtual void reject(void *new_impl); + +protected: + /** + * Internal event handler + * @param[in] ev the event to handle + */ + void _eventHandler(struct socket_event *ev); + + IncomingHandler_t _onIncoming; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_TCPLISTENER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/v0/TCPStream.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_TCPSTREAM_H__ +#define __MBED_NET_SOCKETS_V0_TCPSTREAM_H__ +#include <stddef.h> +#include <stdint.h> +#include "Ticker.h" +#include "TCPAsynch.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +class TCPStream: public TCPAsynch { +public: + typedef FunctionPointer1<void, TCPStream *> ConnectHandler_t; + typedef FunctionPointer1<void, TCPStream *> DisconnectHandler_t; + /** + * TCP socket constructor. + * Does not allocate an underlying TCP Socket instance. + * @param[in] stack The network stack to use for this socket. + */ + TCPStream(const socket_stack_t stack); + /** + * TCP socket constructor. + * Does not allocate an underlying TCP Socket instance. This version is for use with + * TCPListener::accept(). The struct socket instance passed into this constructor should + * be a fully initialized socket, with an initialized impl field. TCPStream will copy + * the stack, API, protocol family, and impl pointer from sock. + * @param[in] sock The TCP socket instance to use for this TCP socket. + */ + TCPStream(const struct socket * sock); + /** + * TCP socket destructor + */ + ~TCPStream(); + /** + * Connect to a remote host. + * Initates the TCP Connection process. onConnect is called when the connection + * is acknowledged. + * @param[in] address The remote host to connect to + * @param[in] port The remote port to connect to + * @param[in] onConnect + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t connect(const SocketAddr &address, const uint16_t port, + const ConnectHandler_t &onConnect); + /** + * Set a disconnect handler + * This handler only needs to be configured once onConnect has been called + * @param[in] h the handler to call when a connection is disconnected + */ + virtual void setOnDisconnect(const DisconnectHandler_t &h) { _onDisconnect = h; } + +protected: + /** + * Internal event handler + * @param[in] ev the event to handle + */ + void _eventHandler(struct socket_event *ev); + +protected: + ConnectHandler_t _onConnect; + DisconnectHandler_t _onDisconnect; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_TCPSTREAM_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/common/sockets/v0/UDPSocket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,64 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_UDPSOCKET_H__ +#define __MBED_NET_SOCKETS_V0_UDPSOCKET_H__ + +#include <stddef.h> +#include <stdint.h> +#include "Socket.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +/* UDP socket class */ +class UDPSocket: public Socket { +public: + /** + * UDP socket constructor. + * Does not allocate an underlying UDP Socket instance. + * @param[in] stack The network stack to use for this socket. + */ + UDPSocket(socket_stack_t stack); + /** + * UDP Socket destructor + */ + ~UDPSocket(); + /** + * Open a UDP socket + * Instantiates and initializes the underlying socket. Receive is started immediately after + * the socket is opened. + * @param[in] af Address family (SOCKET_AF_INET4 or SOCKET_AF_INET6), currently only IPv4 is supported + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t inline open(const socket_address_family_t af) + { + return Socket::open(af,SOCKET_DGRAM); + } + /** + * Connect to a remote host. + * This is an internal configuration API only. No network traffic is generated. + * @param[in] address The remote host to connect to + * @param[in] port The remote port to connect to + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t connect(const SocketAddr *address, const uint16_t port); +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_UDPSOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecurity_mbedtls/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,27 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mconnectionsecurity_mbedtls + "../../../../source/m2mconnectionsecurity.cpp" + "main.cpp" + "m2mconnectionsecurity_mbedtlstest.cpp" + "test_m2mconnectionsecurity_mbedtls.cpp" + "../stub/m2msecurity_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/mbedtls_stub.cpp" + "../stub/m2mconnectionhandler_stub.cpp" + "../stub/m2mconnectionsecuritypimpl_stub.cpp" +) +target_link_libraries(m2mconnectionsecurity_mbedtls + CppUTest + CppUTestExt +) +set_target_properties(m2mconnectionsecurity_mbedtls +PROPERTIES COMPILE_FLAGS "${UTEST_COMPILE_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mconnectionsecurity_mbedtls -ojunit") +add_test(m2mconnectionsecurity_mbedtls ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecurity_mbedtls/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,21 @@ +include ../makefile_defines.txt + +COMPONENT_NAME = m2mconnectionsecurity_unit +SRC_FILES = \ + ../../../../source/m2mconnectionsecurity.cpp \ + +TEST_SRC_FILES = \ + main.cpp \ + m2mconnectionsecurity_mbedtlstest.cpp \ + test_m2mconnectionsecurity_mbedtls.cpp \ + ../stub/m2mstring_stub.cpp \ + ../stub/m2mtimer_stub.cpp \ + ../stub/m2mbase_stub.cpp \ + ../stub/m2mobject_stub.cpp \ + ../stub/m2msecurity_stub.cpp \ + ../stub/mbedtls_stub.cpp \ + ../stub/m2mconnectionhandler_stub.cpp \ + ../stub/m2mconnectionsecuritypimpl_stub.cpp \ + + +include ../MakefileWorker.mk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecurity_mbedtls/m2mconnectionsecurity_mbedtlstest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionsecurity_mbedtls.h" + + +TEST_GROUP(M2MConnectionSecurity_mbedtls) +{ + Test_M2MConnectionSecurity* inst; + + void setup() + { + inst = new Test_M2MConnectionSecurity(); + } + void teardown() + { + delete inst; + } +}; + +TEST(M2MConnectionSecurity_mbedtls, Create) +{ + CHECK(inst != NULL); +} + +TEST(M2MConnectionSecurity_mbedtls, test_constructor) +{ + inst->test_constructor(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_destructor) +{ + inst->test_destructor(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_reset) +{ + inst->test_reset(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_init) +{ + inst->test_init(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_connect) +{ + inst->test_connect(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_start_connecting_non_blocking) +{ + inst->test_start_connecting_non_blocking(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_continue_connecting) +{ + inst->test_continue_connecting(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_send_message) +{ + inst->test_send_message(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_read) +{ + inst->test_read(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_set_random_number_callback) +{ + inst->test_set_random_number_callback(); +} + +TEST(M2MConnectionSecurity_mbedtls, test_set_entropy_callback) +{ + inst->test_set_entropy_callback(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecurity_mbedtls/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP(M2MConnectionSecurity_mbedtls);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecurity_mbedtls/test_m2mconnectionsecurity_mbedtls.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionsecurity_mbedtls.h" +#include "m2mtimerobserver.h" +#include "m2msecurity.h" +#include "m2msecurity_stub.h" +#include "mbedtls_stub.h" +#include "m2mconnectionhandler.h" +#include "mbed-client-mbed-os/m2mconnectionhandlerpimpl.h" +#include "m2mconnectionsecuritypimpl_stub.h" + +entropy_cb ent_cb; + +class TestObserver : public M2MConnectionObserver { + +public: + TestObserver(){} + void data_available(uint8_t*, + uint16_t, + const M2MConnectionObserver::SocketAddress &){} + + void socket_error(uint8_t error_code){} + + void address_ready(const M2MConnectionObserver::SocketAddress &, + M2MConnectionObserver::ServerType, + const uint16_t){} + + void data_sent(){} +}; + +Test_M2MConnectionSecurity::Test_M2MConnectionSecurity() +{ + mbedtls_stub::clear(); + m2msecurity_stub::clear(); +} + +Test_M2MConnectionSecurity::~Test_M2MConnectionSecurity() +{ +} + +void Test_M2MConnectionSecurity::test_constructor() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); +} + +void Test_M2MConnectionSecurity::test_destructor() +{ + M2MConnectionSecurity* impl = new M2MConnectionSecurity(M2MConnectionSecurity::TLS); + delete impl; + //Memory leak detector will report an error if leaks +} + +void Test_M2MConnectionSecurity::test_reset() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + impl.reset(); +} + +void Test_M2MConnectionSecurity::test_init() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + m2mconnectionsecuritypimpl_stub::int_value = 7; + CHECK( 7 == impl.init(NULL) ); +} + +void Test_M2MConnectionSecurity::test_connect() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + m2mconnectionsecuritypimpl_stub::int_value = 7; + CHECK( 7 == impl.connect(NULL)); +} + +void Test_M2MConnectionSecurity::test_start_connecting_non_blocking() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + m2mconnectionsecuritypimpl_stub::int_value = 7; + CHECK( 7 == impl.start_connecting_non_blocking(NULL)); +} + +void Test_M2MConnectionSecurity::test_continue_connecting() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + m2mconnectionsecuritypimpl_stub::int_value = 7; + CHECK( 7 == impl.continue_connecting()); +} + +void Test_M2MConnectionSecurity::test_send_message() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + unsigned char msg[6] = "hello"; + m2mconnectionsecuritypimpl_stub::int_value = 7; + CHECK( 7 == impl.send_message(msg, 5) ); +} + +void Test_M2MConnectionSecurity::test_read() + +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + unsigned char msg[50]; + m2mconnectionsecuritypimpl_stub::int_value = 7; + CHECK( 7 == impl.read(msg, 49)); +} + +void Test_M2MConnectionSecurity::test_set_random_number_callback() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + random_number_cb cb(&test_random_callback); + impl.set_random_number_callback(cb); + +} + +void Test_M2MConnectionSecurity::test_set_entropy_callback() +{ + M2MConnectionSecurity impl = M2MConnectionSecurity(M2MConnectionSecurity::TLS); + impl.set_entropy_callback(ent_cb); +} + +uint32_t test_random_callback(void) +{ + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecurity_mbedtls/test_m2mconnectionsecurity_mbedtls.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_CONNECTION_SECURITY_H +#define TEST_M2M_CONNECTION_SECURITY_H + +#include "m2mconnectionsecurity.h" + +uint32_t test_random_callback(void); + +class Test_M2MConnectionSecurity +{ +public: + Test_M2MConnectionSecurity(); + + virtual ~Test_M2MConnectionSecurity(); + + void test_constructor(); + + void test_destructor(); + + void test_reset(); + + void test_init(); + + void test_connect(); + + void test_start_connecting_non_blocking(); + + void test_continue_connecting(); + + void test_send_message(); + + void test_read(); + + void test_set_random_number_callback(); + + void test_set_entropy_callback(); +}; + + +#endif // TEST_M2M_CONNECTION_SECURITY_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecuritypimpl_mbedtls/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,28 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mconnectionsecuritypimpl_mbedtls + "../../../../yotta_modules/mbed-client-mbedtls/source/m2mconnectionsecuritypimpl.cpp" + "main.cpp" + "m2mconnectionsecuritypimpl_mbedtlstest.cpp" + "test_m2mconnectionsecuritypimpl_mbedtls.cpp" + "../stub/m2msecurity_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/mbedtls_stub.cpp" + "../stub/m2mconnectionhandler_stub.cpp" + "../stub/m2mconnectionsecurity_stub.cpp" +) + +target_link_libraries(m2mconnectionsecuritypimpl_mbedtls + CppUTest + CppUTestExt +) +set_target_properties(m2mconnectionsecuritypimpl_mbedtls +PROPERTIES COMPILE_FLAGS "${UTEST_COMPILE_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mconnectionsecuritypimpl_mbedtls -ojunit") +add_test(m2mconnectionsecuritypimpl_mbedtls ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecuritypimpl_mbedtls/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,20 @@ +include ../makefile_defines.txt + +COMPONENT_NAME = m2mconnectionsecuritypimpl_unit +SRC_FILES = \ + ../../../../source/m2mconnectionsecuritypimpl.cpp \ + +TEST_SRC_FILES = \ + main.cpp \ + m2mconnectionsecuritypimpl_mbedtlstest.cpp \ + test_m2mconnectionsecuritypimpl_mbedtls.cpp \ + ../stub/m2mstring_stub.cpp \ + ../stub/m2mtimer_stub.cpp \ + ../stub/m2mbase_stub.cpp \ + ../stub/m2mobject_stub.cpp \ + ../stub/m2msecurity_stub.cpp \ + ../stub/mbedtls_stub.cpp \ + ../stub/m2mconnectionhandler_stub.cpp \ + ../stub/m2mconnectionsecurity_stub.cpp \ + +include ../MakefileWorker.mk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecuritypimpl_mbedtls/m2mconnectionsecuritypimpl_mbedtlstest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionsecuritypimpl_mbedtls.h" + + +TEST_GROUP(M2MConnectionSecurityPimpl_mbedtls) +{ + Test_M2MConnectionSecurityPimpl* inst; + + void setup() + { + inst = new Test_M2MConnectionSecurityPimpl(); + } + void teardown() + { + delete inst; + } +}; + +TEST(M2MConnectionSecurityPimpl_mbedtls, Create) +{ + CHECK(inst != NULL); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_constructor) +{ + inst->test_constructor(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_destructor) +{ + inst->test_destructor(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_reset) +{ + inst->test_reset(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_init) +{ + inst->test_init(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_connect) +{ + inst->test_connect(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_start_connecting_non_blocking) +{ + inst->test_start_connecting_non_blocking(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_continue_connecting) +{ + inst->test_continue_connecting(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_send_message) +{ + inst->test_send_message(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_read) +{ + inst->test_read(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_timer_expired) +{ + inst->test_timer_expired(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_set_random_number_callback) +{ + inst->test_set_random_number_callback(); +} + +TEST(M2MConnectionSecurityPimpl_mbedtls, test_set_entropy_callback) +{ + inst->test_set_entropy_callback(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecuritypimpl_mbedtls/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP(M2MConnectionSecurityPimpl_mbedtls);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecuritypimpl_mbedtls/test_m2mconnectionsecuritypimpl_mbedtls.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,409 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mconnectionsecuritypimpl_mbedtls.h" +#include "m2mtimerobserver.h" +#include "m2msecurity.h" +#include "m2msecurity_stub.h" +#include "mbedtls_stub.h" +#include "mbed-client/m2mconnectionhandler.h" +#include "m2mtimer_stub.h" + +uint32_t get_random_number(void) +{ + return time(NULL); +} + +entropy_cb ent_cb; + +int ent_poll( void *, unsigned char *output, size_t len, + size_t *olen ) +{ + for(uint16_t i=0; i < len; i++){ + srand(time(NULL)); + output[i] = rand() % 256; + } + *olen = len; + + return( 0 ); +} + +class TestObserver : public M2MConnectionObserver { + +public: + TestObserver(){} + void data_available(uint8_t*, + uint16_t, + const M2MConnectionObserver::SocketAddress &){} + + void socket_error(uint8_t error_code, bool retry = true){} + + void address_ready(const M2MConnectionObserver::SocketAddress &, + M2MConnectionObserver::ServerType, + const uint16_t){} + + void data_sent(){} +}; + +Test_M2MConnectionSecurityPimpl::Test_M2MConnectionSecurityPimpl() +{ + mbedtls_stub::clear(); + m2msecurity_stub::clear(); +} + +Test_M2MConnectionSecurityPimpl::~Test_M2MConnectionSecurityPimpl() +{ +} + +void Test_M2MConnectionSecurityPimpl::test_constructor() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + CHECK(impl._timer != NULL); +} + +void Test_M2MConnectionSecurityPimpl::test_destructor() +{ + M2MConnectionSecurityPimpl* impl = new M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + delete impl; + //Memory leak detector will report an error if leaks +} + +void Test_M2MConnectionSecurityPimpl::test_reset() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + impl._init_done = true; + impl.reset(); + CHECK(impl._init_done == false); +} + +void Test_M2MConnectionSecurityPimpl::test_init() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + CHECK( -1 == impl.init(NULL) ); + + m2msecurity_stub::int_value = 5; + M2MSecurity* sec = new M2MSecurity(M2MSecurity::Bootstrap); + CHECK( -1 == impl.init(sec) ); + + m2msecurity_stub::int_value = 5; + m2msecurity_stub::has_value = true; + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = -1; + m2msecurity_stub::int_value = M2MSecurity::Psk; + CHECK( -1 == impl.init(sec) ); + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + m2msecurity_stub::int_value = 5; + m2msecurity_stub::has_value = true; + mbedtls_stub::expected_int = -1; + mbedtls_stub::crt_expected_int = -1; + CHECK( -1 == impl.init(sec) ); + + mbedtls_stub::crt_expected_int = 0; + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[2] = 0; + m2msecurity_stub::int_value = M2MSecurity::Psk; + CHECK( 0 == impl.init(sec) ); + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = -1; + mbedtls_stub::retArray[2] = -1; + m2msecurity_stub::int_value = M2MSecurity::Certificate; + CHECK( -1 == impl.init(sec) ); + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + m2msecurity_stub::int_value = M2MSecurity::Certificate; + CHECK( -1 == impl.init(sec) ); + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[2] = 0; + m2msecurity_stub::int_value = M2MSecurity::Certificate; + CHECK( -1 == impl.init(sec) ); + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[2] = 0; + mbedtls_stub::retArray[3] = 0; + mbedtls_stub::retArray[4] = -1; + m2msecurity_stub::int_value = M2MSecurity::Certificate; + CHECK( -1 == impl.init(sec) ); + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[2] = 0; + mbedtls_stub::retArray[3] = 0; + mbedtls_stub::retArray[4] = 0; + m2msecurity_stub::int_value = M2MSecurity::Certificate; + CHECK( 0 == impl.init(sec) ); + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[2] = 0; + m2msecurity_stub::int_value = 99; + CHECK( -1 == impl.init(sec) ); + + impl.set_random_number_callback(NULL); + + ent_cb.entropy_source_ptr = ent_poll; + ent_cb.p_source = NULL; + ent_cb.threshold = 128; + ent_cb.strong = 0; + + m2msecurity_stub::int_value = 5; + m2msecurity_stub::has_value = false; + mbedtls_stub::useCounter = false; + mbedtls_stub::expected_int = 0; + mbedtls_stub::crt_expected_int = 0; + mbedtls_stub::counter = 1; + m2msecurity_stub::int_value = M2MSecurity::Certificate; + CHECK( -1 == impl.init(sec) ); + + impl.set_entropy_callback(ent_cb); + m2msecurity_stub::int_value = 5; + m2msecurity_stub::has_value = false; + mbedtls_stub::useCounter = false; + mbedtls_stub::expected_int = -1; + mbedtls_stub::crt_expected_int = 0; + mbedtls_stub::counter = 1; + m2msecurity_stub::int_value = M2MSecurity::Certificate; + CHECK( -1 == impl.init(sec) ); + + delete sec; + mbedtls_stub::clear(); +} + +void Test_M2MConnectionSecurityPimpl::test_connect() +{ + mbedtls_stub::invalidate_timer = true; + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + CHECK( -1 == impl.connect(NULL)); + + impl._init_done = true; + CHECK( -1 == impl.connect(NULL)); + + m2msecurity_stub::int_value = 5; + m2msecurity_stub::has_value = true; + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + CHECK( -1 == impl.connect(NULL)); + + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + CHECK( -1 == impl.connect(NULL)); + + m2mtimer_stub::bool_value = true; + + TestObserver obs; + M2MConnectionHandler* obj = new M2MConnectionHandler(obs, NULL, M2MInterface::NOT_SET,M2MInterface::LwIP_IPv4); + + mbedtls_stub::expected_uint32_value = 12; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[2] = MBEDTLS_ERR_SSL_WANT_READ; + mbedtls_stub::retArray[3] = MBEDTLS_ERR_SSL_WANT_WRITE; + mbedtls_stub::retArray[4] = 0; + CHECK( -1 == impl.connect(obj)); + + delete obj; + + mbedtls_stub::counter = 0; + mbedtls_stub::expected_uint32_value = 0; + CHECK( 0 == impl.connect(NULL)); + + //Tests mbedtls_timing_get_delay() for intermediate case + mbedtls_stub::counter = 0; + m2mtimer_stub::total_bool_value = false; + m2mtimer_stub::bool_value = true; + mbedtls_stub::expected_uint32_value = 1; + + CHECK( -1 == impl.connect(obj)); + + //Tests mbedtls_timing_get_delay() for cancelled case + mbedtls_stub::invalidate_timer = true; + + mbedtls_stub::counter = 0; + m2mtimer_stub::total_bool_value = true; + CHECK( -1 == impl.connect(obj)); + + //Tests mbedtls_timing_get_delay() for NULL case + mbedtls_stub::counter = 0; + delete(impl._timer); + impl._timer = NULL; + CHECK( -1 == impl.connect(obj)); +} + +void Test_M2MConnectionSecurityPimpl::test_start_connecting_non_blocking() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + CHECK( -1 == impl.start_connecting_non_blocking(NULL)); + + m2mtimer_stub::total_bool_value = false; + impl._init_done = true; + impl._sec_mode = M2MConnectionSecurity::TLS; + CHECK( -1 == impl.start_connecting_non_blocking(NULL)); + + m2msecurity_stub::int_value = 5; + m2msecurity_stub::has_value = true; + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + CHECK( -1 == impl.start_connecting_non_blocking(NULL)); + + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + CHECK( -1 == impl.start_connecting_non_blocking(NULL)); + + TestObserver obs; + M2MConnectionHandler* obj = new M2MConnectionHandler(obs, NULL, M2MInterface::NOT_SET, M2MInterface::LwIP_IPv4); + + m2mtimer_stub::total_bool_value = true; + mbedtls_stub::expected_uint32_value = 12; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[2] = 0; + mbedtls_stub::retArray[3] = 0; + mbedtls_stub::retArray[4] = 0; + CHECK( 1 == impl.start_connecting_non_blocking(obj)); + + delete obj; + + mbedtls_stub::counter = 0; + mbedtls_stub::expected_uint32_value = 0; + mbedtls_stub::retArray[3] = -1; + CHECK( -1 == impl.start_connecting_non_blocking(NULL)); +} + +void Test_M2MConnectionSecurityPimpl::test_continue_connecting() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + impl._ssl.state = MBEDTLS_SSL_HELLO_REQUEST; + mbedtls_stub::expected_int = MBEDTLS_ERR_SSL_WANT_READ; + CHECK( M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ == impl.continue_connecting()); + + mbedtls_stub::expected_int = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST; + impl._ssl.state = MBEDTLS_SSL_CLIENT_HELLO; + CHECK( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST == impl.continue_connecting()); + + mbedtls_stub::expected_int = -6; + impl._ssl.state = MBEDTLS_SSL_HANDSHAKE_OVER; + CHECK( -6 == impl.continue_connecting()); + + mbedtls_stub::expected_int = 0; + impl._ssl.state = MBEDTLS_SSL_HANDSHAKE_OVER; + CHECK( 0 == impl.continue_connecting()); +} + +void Test_M2MConnectionSecurityPimpl::test_send_message() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + unsigned char msg[6] = "hello"; + CHECK( -1 == impl.send_message(msg, 5) ); + impl._init_done = true; + + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = MBEDTLS_ERR_SSL_WANT_READ; + mbedtls_stub::retArray[1] = MBEDTLS_ERR_SSL_WANT_WRITE; + mbedtls_stub::retArray[2] = 65; + CHECK( 65 == impl.send_message(msg, 5) ); +} + +void Test_M2MConnectionSecurityPimpl::test_read() + +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + unsigned char msg[50]; + CHECK( -1 == impl.read(msg, 49)); + + impl._init_done = true; + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = MBEDTLS_ERR_SSL_WANT_READ; + mbedtls_stub::retArray[1] = MBEDTLS_ERR_SSL_WANT_WRITE; + mbedtls_stub::retArray[2] = 25; + CHECK( 25 == impl.read(msg, 49)); +} + +void Test_M2MConnectionSecurityPimpl::test_timer_expired() +{ + //This uses static function so we need to prepare test using connect() function. + mbedtls_stub::invalidate_timer = false; + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + impl._init_done = true; + m2msecurity_stub::int_value = 5; + m2msecurity_stub::has_value = true; + mbedtls_stub::useCounter = true; + mbedtls_stub::counter = 0; + mbedtls_stub::retArray[0] = 0; + mbedtls_stub::retArray[1] = 0; + mbedtls_stub::retArray[3] = M2MConnectionHandler::CONNECTION_ERROR_WANTS_READ; + impl.connect(NULL); + + void *bio = malloc(1); + impl._ssl.p_bio = bio; + impl.timer_expired(M2MTimerObserver::Dtls); + + // For testing blocking mode use case + mbedtls_stub::useCounter = false; + mbedtls_stub::expected_int = MBEDTLS_ERR_SSL_TIMEOUT; + + impl.timer_expired(M2MTimerObserver::Dtls); + free(bio); +} + +void Test_M2MConnectionSecurityPimpl::test_set_random_number_callback() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + random_number_cb cb(&test_random_callback); + impl.set_random_number_callback(cb); +} + +void Test_M2MConnectionSecurityPimpl::test_set_entropy_callback() +{ + M2MConnectionSecurityPimpl impl = M2MConnectionSecurityPimpl(M2MConnectionSecurity::TLS); + impl.set_entropy_callback(ent_cb); +} + +uint32_t test_random_callback(void) +{ + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/m2mconnectionsecuritypimpl_mbedtls/test_m2mconnectionsecuritypimpl_mbedtls.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_CONNECTION_SECURITY_PIMPL_H +#define TEST_M2M_CONNECTION_SECURITY_PIMPL_H + +#include "mbed-client-mbedtls/m2mconnectionsecuritypimpl.h" + +uint32_t test_random_callback(void); + +class Test_M2MConnectionSecurityPimpl +{ +public: + Test_M2MConnectionSecurityPimpl(); + + virtual ~Test_M2MConnectionSecurityPimpl(); + + void test_constructor(); + + void test_destructor(); + + void test_reset(); + + void test_init(); + + void test_connect(); + + void test_start_connecting_non_blocking(); + + void test_continue_connecting(); + + void test_send_message(); + + void test_read(); + + void test_timer_expired(); + + void test_set_random_number_callback(); + + void test_set_entropy_callback(); + +}; + + +#endif // TEST_M2M_CONNECTION_SECURITY_PIMPL_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/makefile_defines.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,28 @@ +#--- Inputs ----# +CPPUTEST_HOME = /usr +CPPUTEST_USE_EXTENSIONS = Y +CPPUTEST_USE_VPATH = Y +CPPUTEST_USE_GCOV = Y +CPP_PLATFORM = gcc +INCLUDE_DIRS =\ + .\ + ../common\ + ../stub\ + ../../../../source/include\ + ../../../../source\ + ../../../../\ + ../../../../yotta_modules/mbed-client/mbed-client\ + ../../../../yotta_modules/mbed-client\ + ../../../../yotta_modules/mbed-client/source\ + ../../../../yotta_modules/mbed-client/source/include\ + ../../../../yotta_modules/mbed-client-c\ + ../../../../yotta_modules/mbed-client-c/source/libNsdl\ + ../../../../yotta_modules/mbed-client-c/source/libNsdl/src/include\ + ../../../../yotta_modules/mbedtls\ + ../../../../yotta_modules/mbed-client-mbed-os\ + ../../../../yotta_modules/nanostack-libservice\ + ../../../../yotta_modules/mbed-trace\ + /usr/include\ + $(CPPUTEST_HOME)/include\ + +CPPUTESTFLAGS = -D__thumb2__ -w
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/common_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "common_stub.h" +#include "sn_grs.h" +#include <sys/socket.h> + +socket_error_t common_stub::error; +socket_event_t * common_stub::event; +socket_addr * common_stub::addr; +void * common_stub::void_value; +bool common_stub::visited; +bool common_stub::bool_value; +int common_stub::int_value; +int common_stub::int2_value; +addrinfo* common_stub::addrinfo; +uint16_t common_stub::uint_value; +omalw_certificate_list_t *common_stub::cert; +sn_coap_hdr_s *common_stub::coap_header; +sn_nsdl_resource_info_s *common_stub::resource; +pthread_t common_stub::thread; +const char* common_stub::char_value; + +using namespace mbed; +using namespace mbed::Sockets::v0; + +void common_stub::clear() +{ + int_value = -1; + int2_value = -1; + uint_value = 0; + error = SOCKET_ERROR_NONE; + event = NULL; + addr = NULL; + void_value = NULL; + cert = NULL; + visited = false; + bool_value= false; + coap_header = NULL; + resource = NULL; + addrinfo = NULL; + char_value = NULL; +} + +UDPSocket::UDPSocket(socket_stack_t stack) :Socket(stack) +{ +} + +UDPSocket::~UDPSocket() +{ +} + +socket_error_t UDPSocket::connect(const SocketAddr *, const uint16_t ) +{ + return common_stub::error; +} + +//SocketAddr + +void SocketAddr::setAddr(const struct socket_addr *) +{ +} + +void SocketAddr::setAddr(const SocketAddr *) +{ +} + +bool SocketAddr::SocketAddr::is_v4() +{ + return common_stub::bool_value; +} + +void mbed::Ticker::detach() +{ + common_stub::visited = true; +} + + +// SN_NSDL_LIB + +struct nsdl_s *sn_nsdl_init (uint8_t (*sn_nsdl_tx_cb)(struct nsdl_s *, sn_nsdl_capab_e , uint8_t *, uint16_t, sn_nsdl_addr_s *), + uint8_t (*sn_nsdl_rx_cb)(struct nsdl_s *, sn_coap_hdr_s *, sn_nsdl_addr_s *), + void *(*sn_nsdl_alloc)(uint16_t),void (*sn_nsdl_free)(void *)) +{ + return NULL; +} + +uint16_t sn_nsdl_register_endpoint(struct nsdl_s *, sn_nsdl_ep_parameters_s *) +{ + return common_stub::uint_value; +} + +uint16_t sn_nsdl_unregister_endpoint(struct nsdl_s *) +{ + return common_stub::uint_value; +} + +uint16_t sn_nsdl_update_registration(struct nsdl_s *,uint8_t *, uint8_t) +{ + return common_stub::uint_value; +} + +uint16_t sn_nsdl_send_observation_notification(struct nsdl_s *, uint8_t *, uint8_t, + uint8_t *, uint16_t, + uint8_t *, uint8_t, + sn_coap_msg_type_e , uint8_t) +{ + return common_stub::uint_value; +} + +int8_t sn_nsdl_destroy(struct nsdl_s *handle) +{ + return common_stub::int_value; +} + +sn_coap_hdr_s *sn_nsdl_build_response(struct nsdl_s *, sn_coap_hdr_s *, uint8_t ) +{ + return common_stub::coap_header; +} + +sn_nsdl_resource_info_s *sn_nsdl_get_resource(struct nsdl_s *, uint16_t, uint8_t *) +{ + return common_stub::resource; +} + +int8_t sn_nsdl_process_coap(struct nsdl_s *, uint8_t *, uint16_t , sn_nsdl_addr_s *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_exec(struct nsdl_s *, uint32_t) +{ + return common_stub::int_value; +} + +void sn_nsdl_release_allocated_coap_msg_mem(struct nsdl_s *, sn_coap_hdr_s *header) +{ + if(header && header != common_stub::coap_header){ + if( header->content_type_ptr ){ + free(header->content_type_ptr); + header->content_type_ptr = NULL; + } + if( header->options_list_ptr){ + free(header->options_list_ptr); + header->options_list_ptr = NULL; + } + free(header); + header = NULL; + } +} + +int8_t sn_nsdl_create_resource(struct nsdl_s *, sn_nsdl_resource_info_s *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_delete_resource(struct nsdl_s *, uint16_t , uint8_t *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_send_coap_message(struct nsdl_s *, sn_nsdl_addr_s *, sn_coap_hdr_s *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_update_resource(struct nsdl_s *, sn_nsdl_resource_info_s *) +{ + return common_stub::int_value; +} + +int8_t set_NSP_address(struct nsdl_s *, uint8_t *, uint16_t, sn_nsdl_addr_type_e) +{ + return common_stub::int_value; +} + +uint16_t sn_nsdl_oma_bootstrap(struct nsdl_s *, sn_nsdl_addr_s *, + sn_nsdl_ep_parameters_s *, + sn_nsdl_bs_ep_info_t *) +{ + return common_stub::uint_value; +} + +omalw_certificate_list_t *sn_nsdl_get_certificates(struct nsdl_s *) +{ + return common_stub::cert; +} + +int8_t sn_nsdl_update_certificates(struct nsdl_s *, omalw_certificate_list_t*, uint8_t) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_create_oma_device_object(struct nsdl_s *, sn_nsdl_oma_device_t *) +{ + return common_stub::int_value; +} + +//Coap Headers + +sn_coap_hdr_s *sn_coap_build_response(struct coap_s *, sn_coap_hdr_s *, uint8_t ) +{ + return common_stub::coap_header; +} + +void sn_coap_parser_release_allocated_coap_msg_mem(struct coap_s *, sn_coap_hdr_s *) +{ +} + +int8_t sn_coap_protocol_set_retransmission_parameters(uint8_t, uint8_t) +{ + return common_stub::int_value; +} + +// IP6String.h +uint_fast8_t ip6tos(const void *, char *) +{ +} + +//Socket +Socket::Socket(const socket_stack_t ) : _irq(this) +{ + _socket.api = NULL; +} + +Socket::~Socket() +{ +} + +socket_error_t Socket::open(const socket_address_family_t , const socket_proto_family_t ) +{ + return common_stub::error; +} + +bool Socket::error_check(socket_error_t ) +{ + return common_stub::bool_value; +} + +void Socket::_eventHandler(struct socket_event *) +{ +} + +void Socket::setOnError(const ErrorHandler_t &) +{ +} + +void Socket::setOnReadable(const ReadableHandler_t &) +{ +} + +void Socket::setOnSent(const SentHandler_t & ) +{ +} + +void Socket::_nvEventHandler(void * ) +{ +} + +socket_error_t Socket::getLocalAddr(SocketAddr *) const +{ + return common_stub::error; +} + +socket_error_t Socket::getLocalPort(uint16_t *) const +{ + return common_stub::error; +} + +socket_error_t Socket::getRemoteAddr(SocketAddr *) const +{ + return common_stub::error; +} + +socket_error_t Socket::getRemotePort(uint16_t *) const +{ + return common_stub::error; +} + +socket_error_t Socket::resolve(const char* , const DNSHandler_t & ) +{ + return common_stub::error; +} + +socket_error_t Socket::bind(const char * , const uint16_t ) +{ + return common_stub::error; +} +socket_error_t Socket::bind(const SocketAddr * , const uint16_t ) +{ + return common_stub::error; +} + +socket_error_t Socket::close() +{ + return common_stub::error; +} + +socket_error_t Socket::recv(void * , size_t *) +{ + return common_stub::error; +} +socket_error_t Socket::recv_from(void * , size_t *, SocketAddr *, uint16_t *) +{ + return common_stub::error; +} + +socket_error_t Socket::send(const void * , const size_t ) +{ + return common_stub::error; +} +socket_error_t Socket::send_to(const void * , const size_t , const SocketAddr *, uint16_t ) +{ + return common_stub::error; +} + +bool Socket::isConnected() const { + return common_stub::error; +} + +// pthread +int pthread_equal (pthread_t , pthread_t ) __THROW +{ + return common_stub::int2_value; +} + +pthread_t pthread_self (void) __THROW +{ + return common_stub::thread; +} + +int pthread_detach (pthread_t) __THROW +{ + return common_stub::int_value; +} + +int pthread_create (pthread_t * , + const pthread_attr_t *, + void *(*__start_routine) (void *), + void *) __THROWNL +{ + __start_routine(NULL); + return common_stub::int_value; +} + +int pthread_cancel (pthread_t) +{ + return common_stub::int_value; +} + +int pthread_join (pthread_t , void **) +{ + return common_stub::int_value; +} + +void pthread_exit (void *__retval)/* __attribute__ ((__noreturn__))*/ +{ + +} + +// sys/socket +#ifndef __SOCKADDR_ARG +# define __SOCKADDR_ARG struct sockaddr *__restrict +#endif + +#ifndef __CONST_SOCKADDR_ARG +# define __CONST_SOCKADDR_ARG const struct sockaddr * +#endif + +#ifndef __socklen_t_defined +typedef __socklen_t socklen_t; +# define __socklen_t_defined +#endif + +int bind (int , __CONST_SOCKADDR_ARG , socklen_t ) + __THROW +{ + return common_stub::int_value; +} + +ssize_t sendto (int , const void *, size_t , + int , __CONST_SOCKADDR_ARG , + socklen_t ) +{ + return common_stub::int_value; +} + +ssize_t recvfrom (int , void * , size_t , + int , __SOCKADDR_ARG , + socklen_t * ) +{ + return common_stub::int_value; +} + +int getaddrinfo (const char *__restrict, + const char *__restrict, + const struct addrinfo *__restrict, + struct addrinfo **__restrict addr) +{ + //*addr = (addrinfo*)malloc(sizeof(addrinfo)); + //(*addr)->ai_addr = (sockaddr*)malloc(sizeof(sockaddr)); + *addr = common_stub::addrinfo; + return common_stub::int_value; +} + +void freeaddrinfo (struct addrinfo * addr) +__THROW +{ +// free(addr->ai_addr); +// free(addr); +} + +const char *inet_ntop (int, const void *__restrict, + char *__restrict, socklen_t) + __THROW +{ + return common_stub::char_value; +} + +int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) +{ + return common_stub::int_value; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/common_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef COMMON_STUB_H +#define COMMON_STUB_H + +#include <sys/types.h> +#include <netdb.h> +//#include "UDPSocket.h" +#include "sockets/UDPSocket.h" +#include "nsdlaccesshelper.h" +#include "ip6string.h" +#include "Ticker.h" + +//some internal test related stuff +namespace common_stub +{ + extern socket_error_t error; + extern socket_event_t* event; + extern socket_addr* addr; + extern bool visited; + extern bool bool_value; + extern void* void_value; + extern int int_value; + extern int int2_value; + extern uint16_t uint_value; + extern omalw_certificate_list_t *cert; + extern addrinfo* addrinfo; + extern sn_coap_hdr_s *coap_header; + extern sn_nsdl_resource_info_s *resource; + extern pthread_t thread; + extern const char *char_value; + void clear(); +} + +#endif // COMMON_STUB_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mbase_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mbase_stub.h" + +#include <assert.h> + +uint8_t m2mbase_stub::uint8_value; +uint16_t m2mbase_stub::uint16_value; +uint32_t m2mbase_stub::uint32_value; +uint16_t m2mbase_stub::int_value; +int32_t m2mbase_stub::name_id_value; + +bool m2mbase_stub::bool_value; +String *m2mbase_stub::string_value; + +M2MBase::BaseType m2mbase_stub::base_type; +M2MBase::Operation m2mbase_stub::operation; +M2MBase::Mode m2mbase_stub::mode_value; +M2MBase::Observation m2mbase_stub::observation_level_value; + +void *m2mbase_stub::void_value; +M2MObservationHandler *m2mbase_stub::observe; +M2MReportHandler *m2mbase_stub::report; +bool m2mbase_stub::is_value_updated_function_set; + + +void m2mbase_stub::clear() +{ + int_value = 0; + uint8_value = 0; + uint16_value = 0; + uint32_value = 0; + string_value = NULL; + name_id_value = -1; + mode_value = M2MBase::Static; + base_type = M2MBase::Object; + observation_level_value = M2MBase::None; + bool_value = false; + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + void_value = NULL; + observe = NULL; + report = NULL; + is_value_updated_function_set = false; +} + +M2MBase::M2MBase(const String &/*resource_name*/, + M2MBase::Mode /*mode*/) +{ +} + +M2MBase& M2MBase::operator=(const M2MBase& other) +{ + if (this != &other) { // protect against invalid self-assignment + } + return *this; +} + +M2MBase::M2MBase(const M2MBase& other) +{ + this->operator=(other); +} + +M2MBase::~M2MBase() +{ +} + +void M2MBase::set_operation(M2MBase::Operation opr) +{ + m2mbase_stub::operation = opr; +} + +void M2MBase::set_interface_description(const String &/*desc*/) +{ +} + +void M2MBase::set_resource_type(const String &/*res_type*/) +{ +} + +void M2MBase::set_coap_content_type(const uint8_t /*con_type*/) +{ +} + +void M2MBase::set_instance_id(const uint16_t /*inst_id*/) +{ +} + +void M2MBase::set_observation_number(const uint16_t /*observation_number*/) +{ +} + +void M2MBase::set_max_age(const uint32_t /*max_age*/) +{ +} + +M2MBase::Operation M2MBase::operation() const +{ + return m2mbase_stub::operation; +} + +const String& M2MBase::name() const +{ + return *m2mbase_stub::string_value; +} + +int32_t M2MBase::name_id() const +{ + return m2mbase_stub::name_id_value; +} + +uint16_t M2MBase::instance_id() const +{ + return m2mbase_stub::int_value; +} + +const String& M2MBase::interface_description() const +{ + return *m2mbase_stub::string_value; +} + +const String& M2MBase::resource_type() const +{ + return *m2mbase_stub::string_value; +} + +uint8_t M2MBase::coap_content_type() const +{ + return m2mbase_stub::uint8_value; +} + +uint32_t M2MBase::max_age() const +{ + return m2mbase_stub::uint32_value; +} + +void M2MBase::set_observable(bool /*observable*/) +{ +} + +void M2MBase::add_observation_level(M2MBase::Observation) +{ +} + +void M2MBase::remove_observation_level(M2MBase::Observation) +{ +} + +void M2MBase::set_under_observation(bool /*observed*/, + M2MObservationHandler */*handler*/) +{ +} + +void M2MBase::set_observation_token(const uint8_t */*token*/, + const uint8_t /*length*/) +{ +} + +bool M2MBase::is_observable() const +{ + return m2mbase_stub::bool_value; +} + +M2MBase::Observation M2MBase::observation_level() const +{ + return m2mbase_stub::observation_level_value; +} + +void M2MBase::get_observation_token(uint8_t *&/*token*/, + uint32_t &/*length*/) +{ +} + +void M2MBase::set_base_type(M2MBase::BaseType /*type*/) +{ +} + +M2MBase::BaseType M2MBase::base_type() const +{ + return m2mbase_stub::base_type; +} + +M2MBase::Mode M2MBase::mode() const +{ + return m2mbase_stub::mode_value; +} + +uint16_t M2MBase::observation_number() const +{ + return m2mbase_stub::uint16_value; +} + +void M2MBase::remove_resource_from_coap(const String &) +{ +} + +void M2MBase::remove_object_from_coap() +{ +} + +bool M2MBase::handle_observation_attribute(char *&query) +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::observation_to_be_sent(m2m::Vector<uint16_t>, bool) +{ +} + +void *M2MBase::memory_alloc(uint32_t size) +{ + if(size) + return malloc(size); + else + return 0; +} + +void M2MBase::memory_free(void *ptr) +{ + if(ptr) + free(ptr); +} + +uint8_t* M2MBase::alloc_string_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size + 1); + if (result) { + memcpy(result, source, size); + result[size] = '\0'; + } + return result; +} + +uint8_t* M2MBase::alloc_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size); + if (result) { + memcpy(result, source, size); + } + return result; +} + +M2MReportHandler* M2MBase::report_handler() +{ + return m2mbase_stub::report; +} + +M2MObservationHandler* M2MBase::observation_handler() +{ + return m2mbase_stub::observe; +} + +sn_coap_hdr_s* M2MBase::handle_get_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_put_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &execute_value_updated) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_post_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &, + sn_nsdl_addr_s *) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +void M2MBase::set_register_uri( bool register_uri) +{ +} + +bool M2MBase::register_uri() +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::set_uri_path(const String &uri_path) +{ +} + +const String& M2MBase::uri_path() const +{ + return *m2mbase_stub::string_value; +} + +bool M2MBase::is_under_observation() const +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::set_value_updated_function(value_updated_callback callback) +{ + +} + +void M2MBase::set_value_updated_function(value_updated_callback2 callback) +{ + +} + +bool M2MBase::is_value_updated_function_set() +{ + return m2mbase_stub::is_value_updated_function_set; +} + +void M2MBase::execute_value_updated(const String& name) +{ + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mbase_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_BASE_STUB_H +#define M2M_BASE_STUB_H + +#include "m2mbase.h" + +//some internal test related stuff +namespace m2mbase_stub +{ + extern uint8_t uint8_value; + extern uint16_t uint16_value; + extern uint32_t uint32_value; + extern uint16_t int_value; + extern int32_t name_id_value; + extern String *string_value; + extern bool bool_value; + extern M2MBase::BaseType base_type; + extern M2MBase::Mode mode_value; + extern M2MBase::Operation operation; + extern void *void_value; + extern M2MObservationHandler *observe; + extern M2MReportHandler *report; + extern M2MBase::Observation observation_level_value; + extern bool is_value_updated_function_set; + void clear(); +} + +#endif // M2M_BASE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mconnectionhandler_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mconnectionhandler_stub.h" +#include "m2mconnectionsecurity.h" +#include "common_stub.h" + +int m2mconnectionhandler_stub::int_value; +uint16_t m2mconnectionhandler_stub::uint_value; +bool m2mconnectionhandler_stub::bool_value; + +void m2mconnectionhandler_stub::clear() +{ + int_value = -1; + uint_value = 0; + bool_value = false; +} + +M2MConnectionHandler::M2MConnectionHandler(M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode, + M2MInterface::NetworkStack) +:_observer(observer) +{ + if( sec ){ + delete sec; + sec = NULL; + } +} + +M2MConnectionHandler::~M2MConnectionHandler() +{ +} + +bool M2MConnectionHandler::bind_connection(const uint16_t) +{ + return m2mconnectionhandler_stub::bool_value; +} + +bool M2MConnectionHandler::resolve_server_address(const String&, + const uint16_t, + M2MConnectionObserver::ServerType, + const M2MSecurity* ) +{ + return m2mconnectionhandler_stub::bool_value; +} + +bool M2MConnectionHandler::start_listening_for_data() +{ + return m2mconnectionhandler_stub::bool_value; +} + +bool M2MConnectionHandler::send_data(uint8_t *, + uint16_t , + sn_nsdl_addr_s *) +{ + return m2mconnectionhandler_stub::bool_value; +} + +void M2MConnectionHandler::stop_listening() +{ +} + +int M2MConnectionHandler::send_to_socket(const unsigned char *, size_t ) +{ + return m2mconnectionhandler_stub::int_value; +} + +int M2MConnectionHandler::receive_from_socket(unsigned char *buf, size_t len) +{ + return m2mconnectionhandler_stub::int_value; +} + +void M2MConnectionHandler::handle_connection_error(int) +{ +} + +void M2MConnectionHandler::set_platform_network_handler(void *) +{ +} + +void M2MConnectionHandler::claim_mutex() +{ +} + +void M2MConnectionHandler::release_mutex() +{ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mconnectionhandler_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_HANDLER_IMPL_MBED_STUB_H +#define M2M_CONNECTION_HANDLER_IMPL_MBED_STUB_H + +#include "m2mconnectionhandler.h" + +//some internal test related stuff +namespace m2mconnectionhandler_stub +{ + extern int int_value; + extern uint16_t uint_value; + extern bool bool_value; + void clear(); +} + +#endif // M2M_CONNECTION_HANDLER_IMPL_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mconnectionsecurity_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "m2mconnectionhandler.h" +#include "m2mconnectionsecurity.h" +#include "m2mtimer.h" +#include "m2msecurity.h" +#include <string.h> +#include "m2mconnectionsecurity_stub.h" + +bool m2mconnectionsecurityimpl_stub::use_inc_int; +int m2mconnectionsecurityimpl_stub::inc_int_value; +int m2mconnectionsecurityimpl_stub::int_value; + +void m2mconnectionsecurityimpl_stub::clear() +{ + int_value = -1; + use_inc_int = false; + inc_int_value = 0; +} + +M2MConnectionSecurity::M2MConnectionSecurity(M2MConnectionSecurity::SecurityMode mode) +{ + +} + +M2MConnectionSecurity::~M2MConnectionSecurity(){ +} + +void M2MConnectionSecurity::reset(){ +} + +int M2MConnectionSecurity::init(const M2MSecurity *security){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::connect(M2MConnectionHandler* connHandler){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::start_connecting_non_blocking(M2MConnectionHandler* connHandler) +{ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::continue_connecting() +{ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::send_message(unsigned char *message, int len){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::read(unsigned char* buffer, uint16_t len){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mconnectionsecurity_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_SECURITY_IMPL_STUB_H +#define M2M_CONNECTION_SECURITY_IMPL_STUB_H + +//some internal test related stuff +namespace m2mconnectionsecurityimpl_stub +{ + extern int int_value; + extern bool use_inc_int; + extern int inc_int_value; + void clear(); +} + +#endif // M2M_CONNECTION_SECURITY_IMPL_STUB_H + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mconnectionsecuritypimpl_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "m2mconnectionhandler.h" +#include "m2mconnectionsecurity.h" +#include "mbed-client-mbedtls/m2mconnectionsecuritypimpl.h" +#include "m2mtimer.h" +#include "m2msecurity.h" +#include <string.h> +#include "m2mconnectionsecuritypimpl_stub.h" + +int m2mconnectionsecuritypimpl_stub::int_value; + +void m2mconnectionsecuritypimpl_stub::clear() +{ + int_value = -1; +} + +M2MConnectionSecurityPimpl::M2MConnectionSecurityPimpl(M2MConnectionSecurity::SecurityMode mode) +{ + +} + +M2MConnectionSecurityPimpl::~M2MConnectionSecurityPimpl(){ +} + +void M2MConnectionSecurityPimpl::reset(){ +} + +int M2MConnectionSecurityPimpl::init(const M2MSecurity *security){ + return m2mconnectionsecuritypimpl_stub::int_value; +} + +int M2MConnectionSecurityPimpl::connect(M2MConnectionHandler* connHandler){ + return m2mconnectionsecuritypimpl_stub::int_value; +} + +int M2MConnectionSecurityPimpl::start_connecting_non_blocking(M2MConnectionHandler* connHandler) +{ + return m2mconnectionsecuritypimpl_stub::int_value; +} + +int M2MConnectionSecurityPimpl::continue_connecting() +{ + return m2mconnectionsecuritypimpl_stub::int_value; +} + +int M2MConnectionSecurityPimpl::send_message(unsigned char *message, int len){ + return m2mconnectionsecuritypimpl_stub::int_value; +} + +int M2MConnectionSecurityPimpl::read(unsigned char* buffer, uint16_t len){ + return m2mconnectionsecuritypimpl_stub::int_value; +} + +void M2MConnectionSecurityPimpl::timer_expired(M2MTimerObserver::Type type){ +} + +void M2MConnectionSecurityPimpl::set_random_number_callback(random_number_cb){ +} + +void M2MConnectionSecurityPimpl::set_entropy_callback(entropy_cb){ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mconnectionsecuritypimpl_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_SECURITY_PIMPL_STUB_H +#define M2M_CONNECTION_SECURITY_PIMPL_STUB_H + +//some internal test related stuff +namespace m2mconnectionsecuritypimpl_stub +{ + extern int int_value; + void clear(); +} + +#endif // M2M_CONNECTION_SECURITY_PIMPL_STUB_H + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mobject_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mobject_stub.h" + +u_int16_t m2mobject_stub::int_value; +bool m2mobject_stub::bool_value; +M2MObjectInstance* m2mobject_stub::inst; +M2MObjectInstanceList m2mobject_stub::instance_list; +M2MBase::BaseType m2mobject_stub::base_type; +sn_coap_hdr_s *m2mobject_stub::header; + +void m2mobject_stub::clear() +{ + int_value = 0; + bool_value = false; + m2mobject_stub::base_type = M2MBase::Object; + instance_list.clear(); + header = NULL; +} + +M2MObject::M2MObject(const String &object_name) +: M2MBase(object_name,M2MBase::Dynamic) +{ +} + +M2MObject::~M2MObject() +{ +} + +M2MObject& M2MObject::operator=(const M2MObject& ) +{ + return *this; +} + +M2MObject::M2MObject(const M2MObject& other) +: M2MBase(other) +{ + *this = other; +} + +M2MObjectInstance* M2MObject::create_object_instance(uint16_t instance_id) +{ + return m2mobject_stub::inst; +} + +bool M2MObject::remove_object_instance(uint16_t) +{ + return m2mobject_stub::bool_value; +} + +M2MObjectInstance* M2MObject::object_instance(uint16_t) const +{ + return m2mobject_stub::inst; +} + +const M2MObjectInstanceList& M2MObject::instances() const +{ + return m2mobject_stub::instance_list; +} + +uint16_t M2MObject::instance_count() const +{ + return m2mobject_stub::int_value; +} + +M2MBase::BaseType M2MObject::base_type() const +{ + return m2mobject_stub::base_type; +} + +void M2MObject::add_observation_level(M2MBase::Observation) +{ + +} + +void M2MObject::remove_observation_level(M2MBase::Observation) +{ + +} + +sn_coap_hdr_s* M2MObject::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mobject_stub::header; +} + +sn_coap_hdr_s* M2MObject::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &execute) +{ + execute = m2mobject_stub::bool_value; + return m2mobject_stub::header; +} + +sn_coap_hdr_s* M2MObject::handle_post_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &, + sn_nsdl_addr_s *) +{ + return m2mobject_stub::header; +} + +void M2MObject::notification_update(uint16_t obj_instance_id) +{ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mobject_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_OBJECT_STUB_H +#define M2M_OBJECT_STUB_H + +#include "m2mobject.h" +#include "m2mobjectinstance.h" + +//some internal test related stuff +namespace m2mobject_stub +{ + extern u_int16_t int_value; + extern M2MObjectInstance* inst; + extern bool bool_value; + extern M2MObjectInstanceList instance_list; + extern M2MBase::BaseType base_type; + extern sn_coap_hdr_s *header; + void clear(); +} + +#endif // M2M_OBJECT_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2msecurity_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2msecurity_stub.h" + +bool m2msecurity_stub::has_value; +uint32_t m2msecurity_stub::int_value; +bool m2msecurity_stub::bool_value; +String *m2msecurity_stub::string_value; +M2MResource* m2msecurity_stub::resource; + +void m2msecurity_stub::clear() +{ + has_value = false; + int_value = -1; + bool_value = false; + string_value = NULL; + resource = NULL; +} + +M2MSecurity::M2MSecurity(ServerType ser_type) +: M2MObject("0"), + _server_type(ser_type), + _server_instance(NULL) +{ +} + +M2MSecurity::~M2MSecurity() +{ +} + +M2MResource* M2MSecurity::create_resource(SecurityResource, uint32_t) +{ + return m2msecurity_stub::resource; +} + +bool M2MSecurity::delete_resource(SecurityResource) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + const String &) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + uint32_t) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + const uint8_t *, + const uint16_t) +{ + return m2msecurity_stub::bool_value; +} + +String M2MSecurity::resource_value_string(SecurityResource) const +{ + return *m2msecurity_stub::string_value; +} + +uint32_t M2MSecurity::resource_value_buffer(SecurityResource, + uint8_t *&value) const +{ + if( m2msecurity_stub::has_value ){ + value = (uint8_t *)malloc(5); + return 5; + } + return m2msecurity_stub::int_value; +} + +uint32_t M2MSecurity::resource_value_buffer(SecurityResource, + const uint8_t *&value) const +{ + if( m2msecurity_stub::has_value ){ + value = (const uint8_t*)"dummy"; + return 6; + } + return m2msecurity_stub::int_value; +} + +uint32_t M2MSecurity::resource_value_int(SecurityResource) const +{ + return m2msecurity_stub::int_value; +} + +bool M2MSecurity::is_resource_present(SecurityResource) const +{ + return m2msecurity_stub::bool_value; +} + +uint16_t M2MSecurity::total_resource_count() const +{ + return (uint16_t)m2msecurity_stub::int_value; +} + +M2MSecurity::ServerType M2MSecurity::server_type() const +{ + return _server_type; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2msecurity_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_SECURITY_STUB_H +#define M2M_SECURITY_STUB_H + +#include "m2msecurity.h" + +//some internal test related stuff +namespace m2msecurity_stub +{ + extern bool has_value; + extern uint32_t int_value; + extern bool bool_value; + extern String *string_value; + extern M2MResource* resource; + void clear(); +} + +#endif // M2M_SECURITY_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mstring_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mstring.h" +#include <string.h> // strlen +#include <stdlib.h> // malloc, realloc +#include <assert.h> +#include <algorithm> // min + +namespace m2m { + +const String::size_type String::npos = static_cast<size_t>(-1); + +char* String::strdup(const char* s) +{ + const size_t len = strlen(s)+1; + char *p2 = static_cast<char*>(malloc(len)); + memcpy(p2, s, len); + allocated_ = len; + size_ = len-1; + return p2; +} + +String::String() + : p( strdup("") ) +{ +} + +String::~String() +{ + free(p); + p = 0; +} + +String::String(const String& s) + : p(0) +{ + if( &s != NULL ) { + p = static_cast<char*>(malloc(s.size_ + 1)); + + allocated_ = s.size_ + 1; + size_ = s.size_; + memcpy(p, s.p, size_ + 1); + } +} + +String::String(const char* s) + : p(strdup(s)) +{ +} + +String& String::operator=(const char* s) +{ + if ( p != s ) { + // s could point into our own string, so we have to allocate a new string + const size_t len = strlen(s); + char* copy = (char*) malloc( len + 1); + memmove(copy, s, len+1); // trailing 0 + free( p ); + p = copy; + size_ = len; + allocated_ = len+1; + } + return *this; +} + +String& String::operator=(const String& s) +{ + return operator=(s.p); +} + +String& String::operator+=(const String& s) +{ + if (s.size_ > 0) { + this->reserve(size_ + s.size_); + memmove(p+size_, s.p, s.size_+1); // trailing 0 + size_ += s.size_; + } + return *this; +} + +// since p and s may overlap, we have to copy our own string first +String& String::operator+=(const char* s) +{ + const size_type lens = strlen(s); + if (lens > 0) { + if (size_ + lens + 1 <= allocated_) { + memmove(p+size_, s, lens+1); // trailing 0 + size_ += lens; + } else { + String s2( *this ); // copy own data + s2.reserve(size_ + lens); + memmove(s2.p+size_, s, lens+1); // trailing 0 + s2.size_ = size_ + lens; + this->swap( s2 ); + } + } + return *this; +} + +String& String::operator+=(const char c) +{ + push_back(c); + return *this; +} + +void String::push_back(const char c) { + + if (size_ == allocated_ - 1) { + size_t more = (allocated_* 3) / 2; // factor 1.5 + if ( more < 4 ) more = 4; + reserve( size_ + more ); + } + + p[size_] = c; + size_++; + p[size_] = 0; +} + +bool String::operator==(const char* s) const +{ + if( s == NULL ) { + if( p == NULL ) { + return true; + } + return false; + } + bool ret = strcmp(p, s); + return !ret; +} + +bool String::operator==(const String& s) const +{ + bool ret = strcmp(p, s.p); + return !ret; +} + +void String::clear() +{ + size_ = 0; + p[0] = 0; +} + +String String::substr(const size_type pos, size_type length) const +{ + String s; + const size_type len = size_; + + if ( pos <= len ) { + + size_type remain = len - pos; + + if ( length > remain ) + length = remain; + + s.reserve( length ); + + memcpy(s.p, p + pos, length); + s.p[length] = '\0'; + s.size_ = length; + } + return s; +} + + +// checked access, accessing the NUL at end is allowed +char String::at(const size_type i) const +{ + if ( i <= strlen(p) ) { + return p[i]; + } else { + return '\0'; + } +} + +String& String::erase(size_type pos, size_type len) +{ + if (len > 0) { + + if ( pos < size_ ) { // user must not remove trailing 0 + + size_type s2 = size_; + size_type remain = s2 - pos - len; + + if (remain > 0) { + // erase by overwriting + memmove(p + pos, p + pos + len, remain); + } + + //if ( remain < 0 ) remain = 0; + + // remove unused space + this->resize( pos+remain ); + + } + } + return *this; +} + +String& String::append( const char* str, size_type n) { + if (str && n > 0) { + size_t lens = strlen(str); + if (n > lens) + n = lens; + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +String& String::append_raw( const char* str, size_type n) { + if (str && n > 0) { + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +void String::append_int(int param) { + + // max len of "-9223372036854775808" plus zero termination + char conv_buff[20+1]; + + int len = itoa_c(param, conv_buff); + append_raw(conv_buff, len); +} + +int String::compare( size_type pos, size_type len, const String& str ) const { + int r = -1; + if (pos <= size_) { + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = str.size(); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str.p, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::compare( size_type pos, size_type len, const char* str ) const { + int r = -1; + if (pos <= size_) { + + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = strlen(str); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::find_last_of(char c) const { + int r = -1; + char *v; + v = strrchr(p,c); + if (v != NULL) { + r = 0; + char* i = p; + while (v != i) { + i++; + r++; + } + } + return r; +} + +void String::new_realloc( size_type n) { + if (n > 0 ) { + char* pnew = static_cast<char*>(realloc(p, n)); // could return NULL + if (pnew) + p = pnew; + } +} + +void String::reserve( const size_type n) { + if (n >= allocated_ ) { + this->new_realloc(n + 1); + allocated_ = n + 1; + } +} + +void String::resize( const size_type n) { + this->resize( n, 0 ); +} + +void String::resize( const size_type n, const char c) { + if (n < size_ ) { + p[n] = 0; + size_ = n; + } + else if (n > size_ ) { + this->reserve( n ); + for (size_type i=size_; i < n; ++i ) + p[i] = c; + p[n] = 0; + size_ = n; + } +} + +void String::swap( String& s ) { + std::swap( allocated_, s.allocated_ ); + std::swap( size_, s.size_ ); + std::swap( p, s.p ); +} + + +// Comparison +bool operator<( const String& s1, const String& s2 ) { + return strcmp( s1.c_str(), s2.c_str() ) < 0; +} + +void reverse(char s[], uint32_t length) +{ + uint32_t i, j; + char c; + + for (i = 0, j = length-1; i<j; i++, j--) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } +} + +uint32_t itoa_c (int64_t n, char s[]) +{ + int64_t sign; + uint32_t i; + + if ((sign = n) < 0) + n = -n; + + i = 0; + + do { + s[i++] = n % 10 + '0'; + } + while ((n /= 10) > 0); + + if (sign < 0) + s[i++] = '-'; + + s[i] = '\0'; + + m2m::reverse(s, i); + return i; +} + +uint8_t* String::convert_integer_to_array(int64_t value, uint8_t &size, uint8_t *array, uint32_t array_size) +{ + uint8_t* buffer = NULL; + size = 0; + if (array) { + value = String::convert_array_to_integer(array, array_size); + } + + if(value < 0xFF) { + size = 1; + } else if(value < 0xFFFF) { + size = 2; + } else if(value < 0xFFFFFF) { + size = 3; + } else if(value < 0xFFFFFFFF) { + size = 4; + } else if(value < 0xFFFFFFFFFF) { + size = 5; + } else if(value < 0xFFFFFFFFFFFF) { + size = 6; + } else if(value < 0xFFFFFFFFFFFFFF) { + size = 7; + } else { + size = 8; + } + + buffer = (uint8_t*)malloc(size); + if (buffer) { + for (int i = 0; i < size; i++) { + buffer[i] = (value >> ((size - i - 1) * 8)); + } + } else { + size = 0; + } + return buffer; +} + +int64_t String::convert_array_to_integer(uint8_t *value, uint32_t size) +{ + int64_t temp_64 = 0; + for (int i = size - 1; i >= 0; i--) { + temp_64 += (uint64_t)(*value++) << i * 8; + } + return temp_64; +} + +} // namespace
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mtimer_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mtimer_stub.h" + +bool m2mtimer_stub::bool_value; +bool m2mtimer_stub::total_bool_value; + +void m2mtimer_stub::clear() +{ + bool_value = false; + total_bool_value = false; +} + +// Prevents the use of assignment operator +M2MTimer& M2MTimer::operator=(const M2MTimer& /*other*/) +{ + return *this; +} + +// Prevents the use of copy constructor +M2MTimer::M2MTimer(const M2MTimer& other) +: _observer(other._observer) +{ + *this = other; +} + +M2MTimer::M2MTimer(M2MTimerObserver& observer) +: _observer(observer) +{ +} + +M2MTimer::~M2MTimer() +{ +} + +void M2MTimer::start_timer(uint64_t /*interval*/, + M2MTimerObserver::Type /*type*/, + bool /*single_shot*/) +{ +} + +void M2MTimer::start_dtls_timer(uint64_t , uint64_t , M2MTimerObserver::Type ) +{ +} + +void M2MTimer::stop_timer() +{ +} + + +bool M2MTimer::is_intermediate_interval_passed(){ + return m2mtimer_stub::bool_value; +} + +bool M2MTimer::is_total_interval_passed(){ + return m2mtimer_stub::total_bool_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/m2mtimer_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TIMER_STUB_H +#define M2M_TIMER_STUB_H + +#include "m2mtimer.h" + +//some internal test related stuff +namespace m2mtimer_stub +{ + extern bool bool_value; + extern bool total_bool_value; + void clear(); +} + +#endif // M2M_TIMER_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/mbedtls_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbedtls_stub.h" + +bool mbedtls_stub::useCounter; +int mbedtls_stub::counter; +int mbedtls_stub::retArray[20]; +int mbedtls_stub::crt_expected_int; +int mbedtls_stub::expected_int; +uint32_t mbedtls_stub::expected_uint32_value; +bool mbedtls_stub::invalidate_timer; + +void mbedtls_stub::clear() +{ + mbedtls_stub::useCounter = false; + counter = 0; + expected_int = -1; + crt_expected_int = -1; + expected_uint32_value = 0; + for( int i=0; i < 20; i++ ){ + retArray[i] = -1; + } + invalidate_timer = false; +} + +//From ssl.h +int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ) +{ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +int mbedtls_ssl_close_notify( mbedtls_ssl_context * ) +{ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +void mbedtls_ssl_init( mbedtls_ssl_context * ){ + +} + +void mbedtls_ssl_config_init( mbedtls_ssl_config * ){ + +} + +void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *, uint32_t, uint32_t) +{ + +} + +void mbedtls_ssl_free( mbedtls_ssl_context * ){ + +} + +int mbedtls_ssl_session_reset( mbedtls_ssl_context * ){ + +} + +int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *, + mbedtls_x509_crt *, + mbedtls_pk_context * ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *, int ){ + +} + +void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *, + mbedtls_x509_crt *, + mbedtls_x509_crl * ){ + +} + +int mbedtls_ssl_conf_psk( mbedtls_ssl_config *, + const unsigned char *, size_t , + const unsigned char *, size_t ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +int mbedtls_ssl_config_defaults( mbedtls_ssl_config *, + int , int, int ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +void mbedtls_ssl_conf_rng( mbedtls_ssl_config *, + int (*f_rng)(void *, unsigned char *, size_t), + void * ){ + +} + +void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *, + const int *) +{ + +} + +int mbedtls_ssl_setup( mbedtls_ssl_context *, + const mbedtls_ssl_config * ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, + void *p_bio, + int (*f_send)(void *, const unsigned char *, size_t), + int (*f_recv)(void *, unsigned char *, size_t), + int (*f_recv_timeout)(void *, unsigned char *, size_t, uint32_t) ){ + if( p_bio != NULL ){ + f_send( p_bio, NULL, 0 ); + f_recv( p_bio, NULL, 0 ); + f_recv_timeout( p_bio, NULL, 0, 0 ); + } +} + +void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *, + void *ctx, + void (*f_set_timer)(void *, uint32_t int_ms, uint32_t fin_ms), + int (*f_get_timer)(void *) ){ + f_set_timer(ctx, 1, 2); + f_get_timer(ctx); + if(mbedtls_stub::invalidate_timer){ + f_set_timer(ctx, 0, 0); + } + f_get_timer(ctx); +} + +int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context * ){ + return mbedtls_stub::expected_uint32_value; +} + +int mbedtls_ssl_read( mbedtls_ssl_context *, unsigned char *, size_t ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +int mbedtls_ssl_write( mbedtls_ssl_context *, const unsigned char *, size_t ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + + + +//From crt_drbg.h +int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *, + int (*f_entropy)(void *, unsigned char *, size_t), + void *, + const unsigned char *, + size_t ){ + return mbedtls_stub::crt_expected_int; +} + +void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context * ){ + +} + +void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context * ){ + +} + +int mbedtls_ctr_drbg_random_with_add( void *, + unsigned char *, size_t , + const unsigned char *, size_t ){ + return mbedtls_stub::crt_expected_int; +} + +int mbedtls_ctr_drbg_random( void *p_rng, + unsigned char *output, size_t output_len ){ + return mbedtls_stub::crt_expected_int; +} + +//From x509_crt.h +void mbedtls_x509_crt_init( mbedtls_x509_crt * ){ + +} + +void mbedtls_x509_crt_free( mbedtls_x509_crt * ){ + +} + +int mbedtls_x509_crt_parse( mbedtls_x509_crt *, const unsigned char *, size_t ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +//From entropy.h +void mbedtls_entropy_init( mbedtls_entropy_context * ){ + +} + +void mbedtls_entropy_free( mbedtls_entropy_context *ctx ){ + +} + +int mbedtls_entropy_func( void *, unsigned char *, size_t ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +int mbedtls_entropy_add_source( mbedtls_entropy_context *, + mbedtls_entropy_f_source_ptr f_source, void *, + size_t, int ){ + unsigned char buf[2]; + size_t len; + f_source(NULL, buf, 1, &len); + + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + if(mbedtls_stub::counter == 1){ + mbedtls_stub::counter--; + return 0; + } + return mbedtls_stub::expected_int; +} + +//From pk.h +int mbedtls_pk_parse_key( mbedtls_pk_context *, + const unsigned char *, size_t , + const unsigned char *, size_t ){ + if( mbedtls_stub::useCounter ){ + return mbedtls_stub::retArray[mbedtls_stub::counter++]; + } + return mbedtls_stub::expected_int; +} + +void mbedtls_pk_init( mbedtls_pk_context *ctx ) +{ + +} + +void mbedtls_pk_free( mbedtls_pk_context *ctx ) +{ + +} + +void mbedtls_ssl_config_free( mbedtls_ssl_config * ) +{ + +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/test/mbed-client-mbed-tls/unittest/stub/mbedtls_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef MBEDTLS_STUB_H +#define MBEDTLS_STUB_H + +#include "mbedtls/platform.h" +#include "mbedtls/ssl.h" +#include "mbedtls/ctr_drbg.h" +#include "mbedtls/x509_crt.h" +#include "mbedtls/entropy.h" +#include "mbedtls/pk.h" + +namespace mbedtls_stub +{ + extern int crt_expected_int; + extern bool useCounter; + extern int counter; + extern int retArray[20]; + extern int expected_int; + extern uint32_t expected_uint32_value; + extern bool invalidate_timer; + void clear(); +} + +#endif // MBEDTLS_STUB_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/toolchain_rules.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,293 @@ +# +# Toolchain rules for building libraries +# +# Support multi-platform builds +# You may define PLATFORM=.. prefix for compiler +# if PLATFORM is defined it will owerride CC and AR +# You may also specify CC and AR separately. +# example: Compile with KEIL +# make CC=ArmCC AR=ArmAR +# +# example: Cross Compile with Gnu toolchain, for embedded Linux +# make PLATFORM=arm-linux-gnueabi- +# +# Special rules for IAR-ARM toolchains added, AR tool on that does not follow common arquements. +# make CC=iccarm uses iarchive.exe for creating a archive. +# +# Special rules for IAR-RL78 toolchain added, uses own AR and compiler requires specific flags +# make CC=iccrl78 +# +# When using ArmCC, Select CPU by defining one of following supported values +# CPU=Cortex-M0 +# CPU=Cortex-M3 +# CPU=Cortex-M4 +# +# example: +# make CC=armcc CPU=Cortex-M4 + +# +# If PLATFORM prefix is defined, +# generate CC and AR accordingly +# +ifneq ($(strip $(PLATFORM)),) +CC:=$(PLATFORM)gcc +AR:=$(PLATFORM)ar +endif + +# +# Windows specific tweaks for echo and mkdir to work +# +ifeq ($(OS),Windows_NT) +SHELL := cmd.exe +mkdir = if not exist $(1) md $(subst /,\,$(1)) +else +mkdir = mkdir -p $(1) +endif + +# +# Append CC and CPU to library names +# +LIB:=$(LIB:%.a=%_$(CC).a) +ifneq (,$(CPU)) + LIB:=$(LIB:%.a=%_$(CPU).a) +endif + +########################################################## +# TOOLCHAIN SPECIFIC RULES AND FLAGS # +########################################################## + +# +# GCC toolchains +# +ifneq (,$(findstring gcc,$(CC))) + # Flags for common toolchain, usually GCC or CC + AROPTS=-rsc $@ $^ + override CFLAGS += -Wall -pedantic-errors + # Dependency generation + override CFLAGS += -MMD -MP + ifneq (,$(CPU)) + # CPU must be lowercase on GCC + CPU_L:=$(shell echo $(CPU) | tr A-Z a-z) + override CFLAGS += -mcpu=$(CPU_L) + # Use THUMB instructions of Cortex-M cores + ifeq (cortex-m,$(findstring cortex-m,$(CPU_L))) + override CFLAGS += -mthumb + endif + endif + # Debug + ifeq ($(DEBUG),1) + override CFLAGS += -g -O0 + else + override CFLAGS += -O2 + endif + # Enable Coverage generation + ifeq ($(COVERAGE),1) + override CFLAGS += -ftest-coverage -fprofile-arcs + override LDFLAGS += -ftest-coverage -fprofile-arcs + endif + COMPILE = $(CC) -std=gnu99 -c -o $@ + CXXCOMPILE = $(CC) -std=c++11 -c -o $@ + +# +# IAR-ARM toolchain +# +else ifneq (,$(findstring iccarm,$(CC))) + AR:=iarchive + AROPTS=$^ --create -o $@ + DLIB_FILE=$(subst bin\iccarm.exe,inc\c\DLib_Config_Full.h,$(shell where iccarm)) + override CFLAGS += --dlib_config '$(DLIB_FILE)' --cpu Cortex-M4 --vla --diag_suppress Pa50 + # Dependency generation + override CFLAGS += --dependencies=m $(basename $@).d + # Debug + ifeq ($(DEBUG),1) + override CFLAGS += --debug -On + else + override CFLAGS += -Om + endif + COMPILE = $(CC) -c -o $@ + +# +# ArmCC toolchain (Used by Keil) +# +else ifneq (,$(findstring armcc,$(CC))) + AR:=armar + AROPTS=-rsc $@ $^ + override CFLAGS += --c99 --no_wrap_diagnostics + # Dependency generation + override CFLAGS += --depend $(basename $@).d --phony_targets + LIB:=$(LIB:%.a=%.lib) + ifneq (,$(CPU)) + override CFLAGS += --cpu=$(CPU) + endif + # Debug + ifeq ($(DEBUG),1) + override CFLAGS += -g -O0 + else + override CFLAGS += -O2 + endif + COMPILE = $(CC) -c -o $@ + +# +# IAR Renesas78 toolchain +# +else ifneq (,$(findstring iccrl78,$(CC))) + AR:=xar + AROPTS=$@ $^ + # Hack to get \lib include path which contains dlib config headers for compiler + DIR=$(subst iccrl78.exe,..\lib\,$(shell where iccrl78)) + override CFLAGS += --core rl78_1 --code_model far --data_model far --dlib_config full --vla --no_wrap_diagnostics -I'$(DIR)' + # Dependency generation + LIB:=$(LIB:%.a=%.lib) + override CFLAGS += --dependencies=m $(basename $@).d + # Debug + ifeq ($(DEBUG),1) + override CFLAGS += --debug -Oh + else + override CFLAGS += -Ohz + endif + COMPILE = $(CC) -o $@ + +# +# IAR MSP430 toolchain +# +else ifneq (,$(findstring icc430,$(CC))) + AR:=xar + AROPTS=$@ $^ + # Hack to get \lib include path which contains dlib config headers for compiler + DIR=$(subst bin\icc430.exe,lib,$(shell where icc430)) + DLIB_FILE=$(subst bin\icc430.exe,lib\dlib\dl430xllff.h,$(shell where icc430)) + override CFLAGS += --dlib_config '$(DLIB_FILE)' --vla --core 430X --data_model large --no_wrap_diagnostics -I'$(DIR)' + # Dependency generation + LIB:=$(LIB:%.a=%.lib) + override CFLAGS += --dependencies=m $(basename $@).d + # Debug + ifeq ($(DEBUG),1) + override CFLAGS += --debug -On + else + override CFLAGS += -Ohz + endif + COMPILE = $(CC) -o $@ + +# +# CppCheck toolchain +# This is used only for static testing the code. +# cppcheck is used in place of compiler and linker phase is ignored +else ifneq (,$(findstring cppcheck,$(CC))) + AR = cppcheck -q --enable=warning --enable=style --std=c99 --inline-suppr -DCPPCHECK $(CPPCHECK_OPTS) $(CFLAGS) $(SRCS) + COMPILE = true + CPPCHECK = 1 + LIB:= "ignored_with_cppcheck" + + +################################### +# End of toolchain specific rules # +################################### +endif + +# +# Generate VERSION tag +# +ifeq (,$(CPPCHECK)) +VERSION := $(shell git describe --tags --long --dirty --always) +CFLAGS += -DVERSION='"$(VERSION)"' +endif + +############################################################ +# AUTOMATICALLY GENERATE LIBRARY COMPILATION RULES # +# # +# Use: # +# $(eval $(call generate_rules,$(OUTPUT_LIB),$(SRCS))) # +# at the end of your Makefile # +# # +############################################################ + +define generate_rules + +DEST_LIB := $(1) +LIB_SRCS := $(2) +C_SRCS := $$(filter %.c,$$(LIB_SRCS)) +CXX_SRCS := $$(filter %.cpp,$$(LIB_SRCS)) +all: $$(DEST_LIB) + +# +# Define build dir outside from src folders +# +BUILD_DIR := output/$$(CC) +ifneq (,$$(CPU)) +BUILD_DIR := $$(BUILD_DIR)_$$(CPU) +endif +ifneq (generic,$$(CONFIG)) +BUILD_DIR := $$(BUILD_DIR)_$$(CONFIG) +endif +OBJS := $$(C_SRCS:%.c=$$(BUILD_DIR)/%.o) $$(CXX_SRCS:%.cpp=$$(BUILD_DIR)/%.o) + +# Include auto-dependencies +-include $$(OBJS:.o=.d) + +# Create list of output directories. +OBJ_DIRS := $$(sort $$(dir $$(OBJS))) + +# requires directories to be created before build. +# '|' means do not care about timestamps of requisities +$$(OBJS): | $$(OBJ_DIRS) + +# Need to redefine build rule to find the sources +# from correct folder. +$$(BUILD_DIR)/%.o: %.c +ifeq ($(V),1) + $$(COMPILE) $$(CFLAGS) $$< +else ifeq (1,$(CPPCHECK)) + @$$(COMPILE) $$(CFLAGS) $$< +else ifeq (1,$(UNITTEST)) + @echo Building unittest $$< +ifneq ($(OS),Windows_NT) + ruby $(UNIT_TEST_BASE)/../auto/generate_test_runner.rb Test.c Test_Runner.c +endif + @gcc $$(CFLAGS) $$(SRCS) -o $$(OUTPUT_LIB) +else + @echo Building $$< + @$$(COMPILE) $$(CFLAGS) $$< +endif + +# Same again for C++ +$$(BUILD_DIR)/%.o: %.cpp +ifeq ($(V),1) + $$(CXXCOMPILE) $$(CFLAGS) $$< +else ifeq (1,$(CPPCHECK)) + @$$(CXXCOMPILE) $$(CFLAGS) $$< +else + @echo Building $$< + @$$(CXXCOMPILE) $$(CFLAGS) $$< +endif + +# Rule to create a object directory +$$(OBJ_DIRS): + @-$$(call mkdir,$$@) + +$$(DEST_LIB): $$(OBJS) +ifeq ($(V),1) + -$$(addprefix $$(RM) ,$$(wildcard $$@)) + $$(AR) $$(AROPTS) +else ifeq (1,$(CPPCHECK)) + @$$(AR) $$(AROPTS) +else ifeq (1,$(UNITTEST)) +#ifneq ($(OS),Windows_NT) +# lcov -q --capture -i --directory $(CURDIR) --output-file lib_base.info +# ./$$@ +# lcov -q --capture --directory $(CURDIR) --output-file lib_test.info +# lcov -a lib_base.info -a lib_test.info -o coverage.info +#endif +else + @echo Linking $$(notdir $$@) + @-$$(addprefix $$(RM) ,$$(wildcard $$@)) + @$$(AR) $$(AROPTS) +endif + +clean: + @$(RM) -r $$(BUILD_DIR) + @$(RM) $$(DEST_LIB) + +clean-all: + @$(RM) -r output *.a + +endef
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client-mbed-tls/xsl_script.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (c) 2015 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. + +echo +echo "Creating report" +echo + +echo '<?xml version="1.0" encoding="UTF-8" ?> +<?xml-stylesheet type="text/xsl" href="junit_xsl.xslt"?> +<list>' >> lcov/index.xml + +for f in lcov/results/*.xml +do +name=${f##*/} +echo '<entry name="results/'"$name"'" />'>> lcov/index.xml +done + +echo '</list>' >> lcov/index.xml + +echo +echo "Report created to lcov/index.xml (outputs html)" +echo \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/functionpointer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef FUNCTIONPOINTER_H +#define FUNCTIONPOINTER_H + +#include <string.h> +#include <stdint.h> + +/*! \file functionpointer.h +* \brief A class for storing and calling a pointer to a static or member void function. + */ + +template <typename R> +class FP0{ +public: + /** Create a function pointer, attaching a static function. + * + * \param function The void static function to attach (default is none). + */ + FP0(R (*function)(void) = 0) { + memset(_member,0,sizeof(_member)); + attach(function); + } + + /** Create a function pointer, attaching a member function. + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + FP0(T *object, R (T::*member)(void)) { + attach(object, member); + } + + /** Attach a static function. + * + * \param function The void static function to attach (default is none). + */ + void attach(R (*function)(void)) { + _p.function = function; + _membercaller = 0; + } + + /** Attach a member function. + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + void attach(T *object, R (T::*member)(void)) { + _p.object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(void)>(_member) = member; + _membercaller = &FP0::membercaller<T>; + } + + /** Call the attached static or member function. + */ + R call(){ + if (_membercaller == 0 && _p.function) { + return _p.function(); + } else if (_membercaller && _p.object) { + return _membercaller(_p.object, _member); + } + return (R)0; + } + + typedef R (*static_fp)(); + static_fp get_function() const { + return (R(*)())_p.function; + } + + R operator ()(void) { + return call(); + } + operator bool(void) { + void *q = &_p.function; + return (_membercaller != NULL) && _p.object != NULL && (*static_cast<void **>(q) != NULL); + } + +private: + template<typename T> + static void membercaller(void *object, uintptr_t *member) { + T* o = static_cast<T*>(object); + R (T::**m)(void) = reinterpret_cast<R (T::**)(void)>(member); + (o->**m)(); + } + + union { + R (*function)(void); // static function pointer - 0 if none attached + void *object; // object this pointer - 0 if none attached + } _p; + uintptr_t _member[2]; // aligned raw member function pointer storage - converted back by registered _membercaller + R (*_membercaller)(void*, uintptr_t*); // registered membercaller function to convert back and call _m.member on _object +}; + +/* If we had variadic templates, this wouldn't be a problem, but until C++11 is enabled, we are stuck with multiple classes... */ + +/** A class for storing and calling a pointer to a static or member void function + */ +template <typename R, typename A1> +class FP1{ +public: + /** Create a function pointer, attaching a static function. + * + * \param function The void static function to attach (default is none). + */ + FP1(R (*function)(A1) = 0) { + memset(_member,0,sizeof(_member)); + attach(function); + } + + /** Create a function pointeer, attaching a member function. + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + FP1(T *object, R (T::*member)(A1)) { + attach(object, member); + } + + /** Attach a static function. + * + * \param function The void static function to attach (default is none). + */ + void attach(R (*function)(A1)) { + _p.function = function; + _membercaller = 0; + } + + /** Attach a member function. + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + void attach(T *object, R (T::*member)(A1)) { + _p.object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1)>(_member) = member; + _membercaller = &FP1::membercaller<T>; + } + + /** Call the attached static or member function. + */ + R call(A1 a){ + if (_membercaller == 0 && _p.function) { + return _p.function(a); + } else if (_membercaller && _p.object) { + return _membercaller(_p.object, _member, a); + } + return (R)0; + } + + typedef R (*static_fp)(); + static_fp get_function() const { + return (R(*)())_p.function; + } + + R operator ()(A1 a) { + return call(a); + } + operator bool(void) + { + void *q = &_p.function; + return (_membercaller != NULL) && _p.object != NULL && (*static_cast<void **>(q) != NULL); + } +private: + template<typename T> + static void membercaller(void *object, uintptr_t *member, A1 a) { + T* o = static_cast<T*>(object); + R (T::**m)(A1) = reinterpret_cast<R (T::**)(A1)>(member); + (o->**m)(a); + } + + union { + R (*function)(A1); // static function pointer - 0 if none attached + void *object; // object this pointer - 0 if none attached + } _p; + uintptr_t _member[2]; // aligned raw member function pointer storage - converted back by registered _membercaller + R (*_membercaller)(void*, uintptr_t*, A1); // registered membercaller function to convert back and call _m.member on _object +}; + +/** A class for storing and calling a pointer to a static or member void function. + */ +template <typename R, typename A1, typename A2> +class FP2{ +public: + /** Create a function pointer, attaching a static function. + * + * \param function The void static function to attach (default is none). + */ + FP2(R (*function)(A1, A2) = 0) { + memset(_member,0,sizeof(_member)); + attach(function); + } + + /** Create a function pointer, attaching a member function. + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + FP2(T *object, R (T::*member)(A1, A2)) { + attach(object, member); + } + + /** Attach a static function. + * + * \param function The void static function to attach (default is none). + */ + void attach(R (*function)(A1, A2)) { + _p.function = function; + _membercaller = 0; + } + + /** Attach a member function + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2)) { + _p.object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2)>(_member) = member; + _membercaller = &FP2::membercaller<T>; + } + + /** Call the attached static or member function. + */ + R call(A1 a1, A2 a2){ + if (_membercaller == 0 && _p.function) { + return _p.function(a1, a2); + } else if (_membercaller && _p.object) { + return _membercaller(_p.object, _member, a1, a2); + } + return (R)0; + } + + typedef R (*static_fp)(); + static_fp get_function() const { + return (R(*)())_p.function; + } + + R operator ()(A1 a1, A2 a2) { + return call(a1, a2); + } + operator bool(void) + { + void *q = &_p.function; + return (_membercaller != NULL) && _p.object != NULL && (*static_cast<void **>(q) != NULL); + } +private: + template<typename T> + static void membercaller(void *object, uintptr_t *member, A1 a1, A2 a2) { + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2) = reinterpret_cast<R (T::**)(A1, A2)>(member); + (o->**m)(a1, a2); + } + + union { + R (*function)(A1, A2); // static function pointer - 0 if none attached + void *object; // object this pointer - 0 if none attached + } _p; + uintptr_t _member[2]; // aligned raw member function pointer storage - converted back by registered _membercaller + R (*_membercaller)(void*, uintptr_t*, A1, A2); // registered membercaller function to convert back and call _m.member on _object +}; + +/** A class for storing and calling a pointer to a static or member void function. + */ +template <typename R, typename A1, typename A2, typename A3> +class FP3{ +public: + /** Create a function pointer, attaching a static function. + * + * \param function The void static function to attach (default is none). + */ + FP3(R (*function)(A1, A2, A3) = 0) { + memset(_member,0,sizeof(_member)); + attach(function); + } + + /** Create a function pointer, attaching a member function. + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + FP3(T *object, R (T::*member)(A1, A2, A3)) { + attach(object, member); + } + + /** Attach a static function. + * + * \param function The void static function to attach (default is none). + */ + void attach(R (*function)(A1, A2, A3)) { + _p.function = function; + _membercaller = 0; + } + + /** Attach a member function. + * + * \param object The object pointer to invoke the member function on (the "this" pointer). + * \param function The address of the void member function to attach. + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2, A3)) { + _p.object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2, A3)>(_member) = member; + _membercaller = &FP3::membercaller<T>; + } + + /** Call the attached static or member function. + */ + R call(A1 a1, A2 a2, A3 a3){ + if (_membercaller == 0 && _p.function) { + return _p.function(a1, a2, a3); + } else if (_membercaller && _p.object) { + return _membercaller(_p.object, _member, a1, a2, a3); + } + return (R)0; + } + + typedef R (*static_fp)(); + static_fp get_function() const { + return (R(*)())_p.function; + } + + R operator ()(A1 a1, A2 a2, A3 a3) { + return call(a1, a2, a3); + } + operator bool(void) + { + void *q = &_p.function; + return (_membercaller != NULL) && _p.object != NULL && (*static_cast<void **>(q) != NULL); + } +private: + template<typename T> + static void membercaller(void *object, uintptr_t *member, A1 a1, A2 a2, A3 a3) { + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2, A3) = reinterpret_cast<R (T::**)(A1, A2, A3)>(member); + (o->**m)(a1, a2, a3); + } + + union { + R (*function)(A1, A2, A3); // static function pointer - 0 if none attached + void *object; // object this pointer - 0 if none attached + } _p; + uintptr_t _member[2]; // aligned raw member function pointer storage - converted back by registered _membercaller + R (*_membercaller)(void*, uintptr_t*, A1, A2, A3); // registered membercaller function to convert back and call _m.member on _object +}; + +typedef FP0<void> FP; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mbase.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_BASE_H +#define M2M_BASE_H + +// Support for std args +#include <stdint.h> +#include "mbed-client/m2mconfig.h" +#include "mbed-client/m2mreportobserver.h" +#include "mbed-client/functionpointer.h" +#include "mbed-client/m2mstringbuffer.h" +#include "nsdl-c/sn_nsdl.h" +#include "nsdl-c/sn_coap_header.h" +#include "nsdl-c/sn_nsdl_lib.h" + +//FORWARD DECLARATION +struct sn_coap_hdr_; +typedef sn_coap_hdr_ sn_coap_hdr_s; +struct nsdl_s; +struct sn_nsdl_addr_; +typedef sn_nsdl_addr_ sn_nsdl_addr_s; + +typedef FP1<void, const char*> value_updated_callback; +typedef void(*value_updated_callback2) (const char* object_name); +class M2MObservationHandler; +class M2MReportHandler; + +class M2MObjectInstance; +class M2MObject; +class M2MResource; + + +/*! \file m2mbase.h + * \brief M2MBase. + * This class is the base class based on which all LWM2M object models + * can be created. This serves base class for Object, ObjectInstances and Resources. + */ +class M2MBase : public M2MReportObserver { + +public: + + /** + * Enum to define the type of object. + */ + typedef enum { + Object = 0x0, + Resource = 0x1, + ObjectInstance = 0x2, + ResourceInstance = 0x3 + } BaseType; + + /** + * Enum to define observation level. + */ + typedef enum { + None = 0x0, + R_Attribute = 0x01, + OI_Attribute = 0x02, + OIR_Attribute = 0x03, + O_Attribute = 0x04, + OR_Attribute = 0x05, + OOI_Attribute = 0x06, + OOIR_Attribute = 0x07 + } Observation; + + + /** + * \brief Enum defining a resource type. + */ + typedef enum { + Static, + Dynamic, + Directory + }Mode; + + /** + * Enum defining an operation that can be + * supported by a given resource. + */ + typedef enum { + NOT_ALLOWED = 0x00, + GET_ALLOWED = 0x01, + PUT_ALLOWED = 0x02, + GET_PUT_ALLOWED = 0x03, + POST_ALLOWED = 0x04, + GET_POST_ALLOWED = 0x05, + PUT_POST_ALLOWED = 0x06, + GET_PUT_POST_ALLOWED = 0x07, + DELETE_ALLOWED = 0x08, + GET_DELETE_ALLOWED = 0x09, + PUT_DELETE_ALLOWED = 0x0A, + GET_PUT_DELETE_ALLOWED = 0x0B, + POST_DELETE_ALLOWED = 0x0C, + GET_POST_DELETE_ALLOWED = 0x0D, + PUT_POST_DELETE_ALLOWED = 0x0E, + GET_PUT_POST_DELETE_ALLOWED = 0x0F, + }Operation; + + enum MaxPathSize { + MAX_NAME_SIZE = 64, + MAX_INSTANCE_SIZE = 5, + + MAX_PATH_SIZE = ((MAX_NAME_SIZE * 2) + (MAX_INSTANCE_SIZE * 2) + 3 + 1), + MAX_PATH_SIZE_2 = ((MAX_NAME_SIZE * 2) + MAX_INSTANCE_SIZE + 2 + 1), + MAX_PATH_SIZE_3 = (MAX_NAME_SIZE + (MAX_INSTANCE_SIZE * 2) + 2 + 1), + MAX_PATH_SIZE_4 = (MAX_NAME_SIZE + MAX_INSTANCE_SIZE + 1 + 1), + }; + + typedef struct lwm2m_parameters { + //add multiple_instances + uint32_t max_age; + uint32_t instance_id; + int32_t name_id; + char* name; //for backwards compability + sn_nsdl_dynamic_resource_parameters_s *dynamic_resource_params; + BaseType base_type; + bool free_on_delete; /**< true if struct is dynamically allocted and it + and its members (name) are to be freed on destructor. + Note: the sn_nsdl_dynamic_resource_parameters_s has + its own similar, independent flag. + Note: this also serves as a read-only flag. */ + } lwm2m_parameters_s; + +protected: + + // Prevents the use of default constructor. + M2MBase(); + + // Prevents the use of assignment operator. + M2MBase& operator=( const M2MBase& /*other*/ ); + + // Prevents the use of copy constructor + M2MBase( const M2MBase& /*other*/ ); + + /** + * \brief Constructor + * \param name Name of the object created. + * \param mode Type of the resource. + * \param resource_type Textual information of resource. + * \param path Path of the object like 3/0/1 + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + */ + M2MBase(const String &name, + M2MBase::Mode mode, + const String &resource_type, + char *path, + bool external_blockwise_store); + + M2MBase(const lwm2m_parameters_s* s); + +public: + + /** + * Destructor + */ + virtual ~M2MBase(); + + /** + * \brief Sets the operation type for an object. + * \param operation The operation to be set. + */ + virtual void set_operation(M2MBase::Operation operation); + +#ifndef MEMORY_OPTIMIZED_API + /** + * \brief Sets the interface description of the object. + * \param description The description to be set. + */ + virtual void set_interface_description(const String &description); + + /** + * \brief Sets the interface description of the object. + * \param description The description to be set. + */ + virtual void set_interface_description(const char *description); + + /** + * \brief Sets the resource type of the object. + * \param resource_type The resource type to be set. + */ + virtual void set_resource_type(const String &resource_type); + + /** + * \brief Sets the resource type of the object. + * \param resource_type The resource type to be set. + */ + virtual void set_resource_type(const char *resource_type); +#endif + + /** + * \brief Sets the CoAP content type of the object. + * \param content_type The content type to be set based on + * CoAP specifications. + */ + virtual void set_coap_content_type(const uint8_t content_type); + + /** + * \brief Sets the observable mode for the object. + * \param observable A value for the observation. + */ + virtual void set_observable(bool observable); + + /** + * \brief Adds the observation level for the object. + * \param observation_level The level of observation. + */ + virtual void add_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Removes the observation level for the object. + * \param observation_level The level of observation. + */ + virtual void remove_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Sets the object under observation. + * \param observed The value for observation. When true, starts observing. When false, the ongoing observation is cancelled. + * \param handler A handler object for sending + * observation callbacks. + */ + virtual void set_under_observation(bool observed, + M2MObservationHandler *handler); + /** + * \brief Returns the Observation Handler object. + * \return M2MObservationHandler object. + */ + M2MObservationHandler* observation_handler(); + + /** + * \brief Sets the observation handler + * \param handler Observation handler + */ + void set_observation_handler(M2MObservationHandler *handler); + + /** + * \brief Sets the observation token value. + * \param token A pointer to the token of the resource. + * \param length The length of the token pointer. + */ + virtual void set_observation_token(const uint8_t *token, + const uint8_t length); + + /** + * \brief Sets the instance ID of the object. + * \param instance_id The instance ID of the object. + */ + virtual void set_instance_id(const uint16_t instance_id); + + /** + * This function is deprecated. An increment of the observation number is done internally. + * \brief Sets the observation number of the object. + * \param observation_number The observation number of the object. + */ + virtual void set_observation_number(const uint16_t observation_number) + m2m_deprecated; + + /** + * \brief Sets the max age for the resource value to be cached. + * \param max_age The max age in seconds. + */ + virtual void set_max_age(const uint32_t max_age); + + /** + * \brief Returns the object type. + * \return The base type of the object. + */ + virtual M2MBase::BaseType base_type() const; + + /** + * \brief Returns the operation type of the object. + * \return The supported operation on the object. + */ + virtual M2MBase::Operation operation() const; + + /** + * \brief Returns the object name. + * \return The name of the object. + */ + virtual const char* name() const; + + /** + * \brief Returns the object name in integer. + * \return The name of the object in integer. + */ + virtual int32_t name_id() const; + + /** + * \brief Returns the object's instance ID. + * \returns The instance ID of the object. + */ + virtual uint16_t instance_id() const; + + /** + * \brief Returns the interface description of the object. + * \return The interface description of the object. + */ + virtual const char* interface_description() const; + + /** + * \brief Returns the resource type of the object. + * \return The resource type of the object. + */ + virtual const char* resource_type() const; + + /** + * \brief Returns the path of the object. + * \return The path of the object (eg. 3/0/1). + */ + virtual const char* uri_path() const; + + /** + * \brief Returns the CoAP content type of the object. + * \return The CoAP content type of the object. + */ + virtual uint8_t coap_content_type() const; + + /** + * \brief Returns the observation status of the object. + * \return True if observable, else false. + */ + virtual bool is_observable() const; + + /** + * \brief Returns the observation level of the object. + * \return The observation level of the object. + */ + virtual M2MBase::Observation observation_level() const; + + /** + * \brief Provides the observation token of the object. + * \param value[OUT] A pointer to the value of the token. + * \param value_length[OUT] The length of the token pointer. + */ + virtual void get_observation_token(uint8_t *&token, uint32_t &token_length); + + /** + * \brief Returns the mode of the resource. + * \return The mode of the resource. + */ + virtual Mode mode() const; + + /** + * \brief Returns the observation number. + * \return The observation number of the object. + */ + virtual uint16_t observation_number() const; + + /** + * \brief Returns the max age for the resource value to be cached. + * \return The maax age in seconds. + */ + virtual uint32_t max_age() const; + + /** + * \brief Parses the received query for the notification + * attribute. + * \param query The query that needs to be parsed. + * \return True if required attributes are present, else false. + */ + virtual bool handle_observation_attribute(const char *query); + + /** + * \brief Handles GET request for the registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The received CoAP message from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler = NULL); + /** + * \brief Handles PUT request for the registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The received CoAP message from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \param execute_value_updated True executes the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated); + + /** + * \brief Handles GET request for the registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The received CoAP message from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \param execute_value_updated True executes the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_post_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated, + sn_nsdl_addr_s *address = NULL); + + /** + * \brief Sets whether this resource is published to server or not. + * \param register_uri True sets the resource as part of registration message. + */ + virtual void set_register_uri(bool register_uri); + + /** + * \brief Returns whether this resource is published to server or not. + * \return True if the resource is a part of the registration message, else false. + */ + virtual bool register_uri(); + + /** + * @brief Returns whether this resource is under observation or not. + * @return True if the resource is under observation, else false, + */ + virtual bool is_under_observation() const; + + /** + * @brief Sets the function that is executed when this + * object receives a PUT or POST command. + * @param callback The function pointer that is called. + */ + virtual void set_value_updated_function(value_updated_callback callback); + + /** + * @brief Sets the function that is executed when this + * object receives a PUT or POST command. + * @param callback The function pointer that is called. + */ + virtual void set_value_updated_function(value_updated_callback2 callback); + + /** + * @brief Returns whether a callback function is set or not. + * @return True if the callback function is set, else false. + */ + virtual bool is_value_updated_function_set(); + + /** + * @brief Calls the function that is set in the "set_value_updated_function". + * @param name The name of the object. + */ + virtual void execute_value_updated(const String& name); + + /** + * @brief Returns length of the object name. + * @return Length of the object name. + */ + size_t resource_name_length() const; + + /** + * @brief Returns the resource information. + * @return Resource information. + */ + sn_nsdl_dynamic_resource_parameters_s* get_nsdl_resource(); + + static char* create_path(const M2MObject &parent, const char *name); + static char* create_path(const M2MObject &parent, uint16_t object_instance); + static char* create_path(const M2MResource &parent, uint16_t resource_instance); + static char* create_path(const M2MResource &parent, const char *name); + static char* create_path(const M2MObjectInstance &parent, const char *name); + +protected : // from M2MReportObserver + + virtual void observation_to_be_sent(m2m::Vector<uint16_t> changed_instance_ids, + bool send_object = false); + +protected: + + /** + * \brief Sets the base type for an object. + * \param type The base type of the object. + */ + virtual void set_base_type(M2MBase::BaseType type); + + /** + * \brief Memory allocation required for libCoap. + * \param size The size of memory to be reserved. + */ + static void* memory_alloc(uint32_t size); + + /** + * \brief Memory free functions required for libCoap. + * \param ptr The object whose memory needs to be freed. + */ + static void memory_free(void *ptr); + + /** + * \brief Allocate and make a copy of given zero terminated string. This + * is functionally equivalent with strdup(). + * \param source The source string to copy, may not be NULL. + */ + static char* alloc_string_copy(const char* source); + + /** + * \brief Allocate (size + 1) amount of memory, copy size bytes into + * it and add zero termination. + * \param source The source string to copy, may not be NULL. + * \param size The size of memory to be reserved. + */ + static uint8_t* alloc_string_copy(const uint8_t* source, uint32_t size); + + /** + * \brief Allocate (size) amount of memory, copy size bytes into it. + * \param source The source buffer to copy, may not be NULL. + * \param size The size of memory to be reserved. + */ + static uint8_t* alloc_copy(const uint8_t* source, uint32_t size); + + // validate string length to be [min_length..max_length] + static bool validate_string_length(const String &string, size_t min_length, size_t max_length); + static bool validate_string_length(const char* string, size_t min_length, size_t max_length); + + /** + * \brief Create Report Handler object. + * \return M2MReportHandler object. + */ + M2MReportHandler* create_report_handler(); + + /** + * \brief Returns the Report Handler object. + * \return M2MReportHandler object. + */ + M2MReportHandler* report_handler(); + + + static bool build_path(StringBuffer<MAX_PATH_SIZE> &buffer, const char *s1, uint16_t i1, const char *s2, uint16_t i2); + + static bool build_path(StringBuffer<MAX_PATH_SIZE_2> &buffer, const char *s1, uint16_t i1, const char *s2); + + static bool build_path(StringBuffer<MAX_PATH_SIZE_3> &buffer, const char *s1, uint16_t i1, uint16_t i2); + + static bool build_path(StringBuffer<MAX_PATH_SIZE_4> &buffer, const char *s1, uint16_t i1); + + static char* stringdup(const char* s); + +private: + + static bool is_integer(const String &value); + + static bool is_integer(const char *value); + + void free_resources(); + +private: + lwm2m_parameters_s *_sn_resource; + M2MReportHandler *_report_handler; + M2MObservationHandler *_observation_handler; // Not owned + uint8_t *_token; + FP1<void, const char*> *_function_pointer; + value_updated_callback *_value_updated_callback; + unsigned _observation_number : 16; + unsigned _token_length : 8; + M2MBase::Observation _observation_level : 4; + bool _is_under_observation : 1; + +friend class Test_M2MBase; +friend class Test_M2MObject; + +}; + +#endif // M2M_BASE_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mblockmessage.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2MBLOCKMESSAGE_H +#define M2MBLOCKMESSAGE_H + +#include "ns_types.h" +#include "nsdl-c/sn_coap_header.h" + +/*! \file m2mblockmessage.h + * \brief M2MBlockMessage. + * This class contains the data of an incoming block message. + */ +class M2MBlockMessage { + +public: + + /** + * \brief An enum defining different kinds of errors + * that can occur during the block-wise operation. + */ + typedef enum { + ErrorNone = 0, + EntityTooLarge + }Error; + + /** + * Constructor. + */ + M2MBlockMessage(); + + /** + * Destructor. + */ + virtual ~M2MBlockMessage(); + + /** + * \brief Store the data from a CoAP message. + * \param coap_header The message to parse. + */ + void set_message_info(sn_coap_hdr_s *coap_header); + + /** + * \brief Clear values. + */ + void clear_values(); + + /** + * \brief Check if the message is a block message. + * \param coap_header The message to check. + * \return True if block message, else false. + */ + bool is_block_message() const; + + /** + * \brief Returns the number of an incoming block. + * \return Block number, starting from 0. + */ + uint16_t block_number() const; + + /** + * \brief Returns the total size of the message. + * \return The total size in bytes. + */ + uint32_t total_message_size() const; + + /** + * \brief Check if last block. + * \return True if last block, else false. + */ + bool is_last_block() const; + + /** + * \brief Returns the payload of the message. + * \return The message payload. + */ + uint8_t* block_data() const; + + /** + * \brief Returns the length of the payload. + * \return The payload length. + */ + uint32_t block_data_len() const; + + /** + * \brief Returns an error code. + * \return Error code. + */ + Error error_code() const; + +private: + uint8_t *_block_data_ptr; + uint32_t _total_message_size; + uint16_t _block_data_len; + uint16_t _block_number; + Error _error_code; + bool _is_last_block; + bool _is_block_message; +}; + +#endif // M2MBLOCKMESSAGE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mconfig.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2MCONFIG_H +#define M2MCONFIG_H + +/*! \file m2mconfig.h +* \brief File defining all system build time configuration used by mbed-client. +*/ + +#include "mbed-client/m2mstring.h" + +#include <stddef.h> + +using namespace m2m; + +/** + * \def MBED_CLIENT_RECONNECTION_COUNT + * + * \brief Sets Reconnection count for mbed Client + * to attempt a reconnection re-tries until + * reaches the defined value either by the application + * or the default value set in Client. + * By default, the value is 3. + */ +#undef MBED_CLIENT_RECONNECTION_COUNT /* 3 */ + +/** + * \def MBED_CLIENT_RECONNECTION_INTERVAL + * + * \brief Sets Reconnection interval (in seconds) for + * mbed Client to attempt a reconnection re-tries. + * By default, the value is 5 seconds. + */ +#undef MBED_CLIENT_RECONNECTION_INTERVAL /* 5 */ + +/** + * \def MBED_CLIENT_TCP_KEEPALIVE_TIME + * + * \brief Keep alive time (in seconds) to send pings + * in case mbed Client is connected through TCP. + * By default, the value is 300 seconds. + */ +#undef MBED_CLIENT_TCP_KEEPALIVE_TIME /* 300 */ + +/** + * \def MBED_CLIENT_RECONNECTION_LOOP + * + * \brief Option whether to continue reconnection + * loop until connection is re-established or stop + * once the maximum re-try count is reached + * By default, the value is 1 to continue reconnection + * in loop, to stop the reconnection loop set value to 0. + */ +#undef MBED_CLIENT_RECONNECTION_LOOP /* 1 */ + +/** + * \def MBED_CLIENT_EVENT_LOOP_SIZE + * + * \brief Defines the size of memory allocated for + * event loop (in bytes) for timer and network event + * handling of mbed Client. + * By default, this value is 1024 bytes.This memory is + * allocated from heap + */ +#undef MBED_CLIENT_EVENT_LOOP_SIZE /* 1024 */ + +#ifdef YOTTA_CFG_RECONNECTION_COUNT +#define MBED_CLIENT_RECONNECTION_COUNT YOTTA_CFG_RECONNECTION_COUNT +#elif defined MBED_CONF_MBED_CLIENT_RECONNECTION_COUNT +#define MBED_CLIENT_RECONNECTION_COUNT MBED_CONF_MBED_CLIENT_RECONNECTION_COUNT +#endif + +#ifdef YOTTA_CFG_RECONNECTION_INTERVAL +#define MBED_CLIENT_RECONNECTION_INTERVAL YOTTA_CFG_RECONNECTION_INTERVAL +#elif defined MBED_CONF_MBED_CLIENT_RECONNECTION_INTERVAL +#define MBED_CLIENT_RECONNECTION_INTERVAL MBED_CONF_MBED_CLIENT_RECONNECTION_INTERVAL +#endif + +#ifdef YOTTA_CFG_TCP_KEEPALIVE_TIME +#define MBED_CLIENT_TCP_KEEPALIVE_TIME YOTTA_CFG_TCP_KEEPALIVE_TIME +#elif defined MBED_CONF_MBED_CLIENT_TCP_KEEPALIVE_TIME +#define MBED_CLIENT_TCP_KEEPALIVE_TIME MBED_CONF_MBED_CLIENT_TCP_KEEPALIVE_TIME +#endif + +#ifdef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE +#define MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE +#elif defined MBED_CONF_MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +#define MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE MBED_CONF_MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +#endif + +#ifdef YOTTA_CFG_RECONNECTION_LOOP +#define MBED_CLIENT_RECONNECTION_LOOP YOTTA_CFG_RECONNECTION_LOOP +#elif defined MBED_CONF_MBED_CLIENT_RECONNECTION_LOOP +#define MBED_CLIENT_RECONNECTION_LOOP MBED_CONF_MBED_CLIENT_RECONNECTION_LOOP +#endif + +#ifdef YOTTA_CFG_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE +#define SN_COAP_MAX_INCOMING_MESSAGE_SIZE YOTTA_CFG_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE +#elif defined MBED_CONF_MBED_CLIENT_SN_COAP_MAX_INCOMING_MESSAGE_SIZE +#define SN_COAP_MAX_INCOMING_MESSAGE_SIZE MBED_CONF_MBED_CLIENT_SN_COAP_MAX_INCOMING_MESSAGE_SIZE +#endif + +#ifdef MBED_CONF_MBED_CLIENT_EVENT_LOOP_SIZE +#define MBED_CLIENT_EVENT_LOOP_SIZE MBED_CONF_MBED_CLIENT_EVENT_LOOP_SIZE +#endif + +#if defined (__ICCARM__) +#define m2m_deprecated +#else +#define m2m_deprecated __attribute__ ((deprecated)) +#endif + +// This is valid for mbed-client-mbedtls +// For other SSL implementation there +// can be other + +/* +*\brief A callback function for a random number +* required by the mbed-client-mbedtls module. +*/ +typedef uint32_t (*random_number_cb)(void) ; + +/* +*\brief An entropy structure for an mbedtls entropy source. +* \param entropy_source_ptr The entropy function. +* \param p_source The function data. +* \param threshold A minimum required from the source before entropy is released +* (with mbedtls_entropy_func()) (in bytes). +* \param strong MBEDTLS_ENTROPY_SOURCE_STRONG = 1 or +* MBEDTSL_ENTROPY_SOURCE_WEAK = 0. +* At least one strong source needs to be added. +* Weaker sources (such as the cycle counter) can be used as +* a complement. +*/ +typedef struct mbedtls_entropy { + int (*entropy_source_ptr)(void *, unsigned char *,size_t , size_t *); + void *p_source; + size_t threshold; + int strong; +}entropy_cb; + +#ifdef MBED_CLIENT_USER_CONFIG_FILE +#include MBED_CLIENT_USER_CONFIG_FILE +#endif + +#ifndef MBED_CLIENT_RECONNECTION_COUNT +#define MBED_CLIENT_RECONNECTION_COUNT 3 +#endif + +#ifndef MBED_CLIENT_RECONNECTION_INTERVAL +#define MBED_CLIENT_RECONNECTION_INTERVAL 5 +#endif + +#ifndef MBED_CLIENT_TCP_KEEPALIVE_TIME +#define MBED_CLIENT_TCP_KEEPALIVE_TIME 300 +#endif + +#ifndef MBED_CLIENT_RECONNECTION_LOOP +#define MBED_CLIENT_RECONNECTION_LOOP 1 +#endif + +#ifndef MBED_CLIENT_EVENT_LOOP_SIZE +#define MBED_CLIENT_EVENT_LOOP_SIZE 1024 +#endif + +#ifndef SN_COAP_MAX_INCOMING_MESSAGE_SIZE +#define SN_COAP_MAX_INCOMING_MESSAGE_SIZE UINT16_MAX +#endif + +#endif // M2MCONFIG_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mconnectionhandler.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_HANDLER_H__ +#define M2M_CONNECTION_HANDLER_H__ + +#include "mbed-client/m2mconnectionobserver.h" +#include "mbed-client/m2mconfig.h" +#include "mbed-client/m2minterface.h" +#include "nsdl-c/sn_nsdl.h" + +class M2MConnectionSecurity; +class M2MConnectionHandlerPimpl; + +/*! \file m2mconnectionhandler.h + * \brief M2MConnectionHandler. + * This class handles the socket connection for the LWM2M Client. + */ + +class M2MConnectionHandler { +public: + + /** + * @enum ConnectionError + * This enum defines an error that can come from the + * socket read and write operation. + */ + typedef enum { + CONNECTION_ERROR_WANTS_READ = -1000, + CONNECTION_ERROR_WANTS_WRITE = -1001, + ERROR_NONE = 0, + SSL_CONNECTION_ERROR, + SOCKET_READ_ERROR, + SOCKET_SEND_ERROR, + SOCKET_ABORT, + DNS_RESOLVING_ERROR, + SSL_HANDSHAKE_ERROR + }ConnectionError; + + +public: + + /** + * \brief Constructor + */ + M2MConnectionHandler(M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack); + + /** + * \brief Destructor + */ + ~M2MConnectionHandler(); + + /** + * \brief This binds the socket connection. + * \param listen_port The port to be listened to for an incoming connection. + * \return True if successful, else false. + */ + bool bind_connection(const uint16_t listen_port); + + /** + * \brief This resolves the server address. The output is + * returned through a callback. + * \param String The server address. + * \param uint16_t The server port. + * \param ServerType The server type to be resolved. + * \param security The M2MSecurity object that determines which + * type of secure connection is used by the socket. + * \return True if the address is valid, else false. + */ + bool resolve_server_address(const String& server_address, + const uint16_t server_port, + M2MConnectionObserver::ServerType server_type, + const M2MSecurity* security); + + /** + * \brief Sends data to the connected server. + * \param data_ptr The data to be sent. + * \param data_len The length of data to be sent. + * \param address_ptr The address structure to which the data needs to be sent. + * \return True if data is sent successfully, else false. + */ + bool send_data(uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr); + + /** + * \brief Listens to the incoming data from a remote server. + * \return True if successful, else false. + */ + bool start_listening_for_data(); + + /** + * \brief Stops listening to the incoming data. + */ + void stop_listening(); + + /** + * \brief Sends directly to the socket. This is used by the + * security classes to send the data after it has been encrypted. + * \param buf The buffer to send to. + * \param len The length of the buffer. + * \return The number of bytes sent, or -1 if failed. + */ + int send_to_socket(const unsigned char *buf, size_t len); + + /** + * \brief Receives directly from the socket. This + * is used by the security classes to receive raw data to be decrypted. + * \param buf The buffer to send to. + * \param len The length of the buffer. + * \return The number of bytes read, or -1 if failed. + */ + int receive_from_socket(unsigned char *buf, size_t len); + + /** + * \brief Closes the open connection. + */ + void close_connection(); + + /** + * \brief Error handling for DTLS connectivity. + * \param error An error code from the TLS library. + */ + void handle_connection_error(int error); + + /** + * \brief Sets the network interface handler that is used by the client to connect + * to a network over IP. + * \param handler A network interface handler that is used by the client to connect. + * This API is optional but it provides a mechanism for different platforms to + * manage the usage of underlying network interface by client. + */ + void set_platform_network_handler(void *handler = NULL); + + /** + * \brief Claims mutex to prevent thread clashes + * in multithreaded environment. + */ + void claim_mutex(); + + /** + * \brief Releases mutex to prevent thread clashes + * in multithreaded environment. + */ + void release_mutex(); + +private: + + M2MConnectionObserver &_observer; + M2MConnectionHandlerPimpl *_private_impl; + +friend class Test_M2MConnectionHandler; +friend class Test_M2MConnectionHandler_mbed; +friend class Test_M2MConnectionHandler_linux; +friend class M2MConnection_TestObserver; +}; + +#endif //M2M_CONNECTION_HANDLER_H__ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mconnectionobserver.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_OBSERVER_H__ +#define M2M_CONNECTION_OBSERVER_H__ + +#include "mbed-client/m2minterface.h" + +/*! \file m2mconnectionobserver.h + * \brief M2MConnectionObserver. + * The observer class for passing the socket activity to the state machine. + */ + +class M2MConnectionObserver +{ + +public : + + /** + * \enum ServerType, Defines the type of the + * server that the client wants to use. + */ + typedef enum { + Bootstrap, + LWM2MServer + }ServerType; + + /** + * \brief The M2MSocketAddress struct. + * A unified container for holding socket address data + * across different platforms. + */ + struct SocketAddress{ + M2MInterface::NetworkStack _stack; + void *_address; + uint8_t _length; + uint16_t _port; + }; + + /** + * \brief Indicates that data is available from socket. + * \param data The data read from the socket. + * \param data_size The length of the data read from the socket. + * \param address The address of the server where the data is coming from. + */ + virtual void data_available(uint8_t* data, + uint16_t data_size, + const M2MConnectionObserver::SocketAddress &address) = 0; + + /** + * \brief Indicates an error occured in socket. + * \param error_code The error code from socket, it cannot be used any further. + * \param retry Indicates whether to re-establish the connection. + */ + virtual void socket_error(uint8_t error_code, bool retry = true) = 0; + + /** + * \brief Indicates that the server address resolving is ready. + * \param address The resolved socket address. + * \param server_type The type of the server. + * \param server_port The port of the resolved server address. + */ + virtual void address_ready(const M2MConnectionObserver::SocketAddress &address, + M2MConnectionObserver::ServerType server_type, + const uint16_t server_port) = 0; + + /** + * \brief Indicates that data has been sent successfully. + */ + virtual void data_sent() = 0; +}; + +#endif // M2M_CONNECTION_OBSERVER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mconnectionsecurity.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef __M2M_CONNECTION_SECURITY_H__ +#define __M2M_CONNECTION_SECURITY_H__ + +#include "mbed-client/m2mconfig.h" + +#include <stdint.h> + +class M2MConnectionHandler; +class M2MSecurity; +class M2MConnectionSecurityPimpl; +class M2MConnectionHandler; + +/*! \file m2mconnectionsecurity.h + * \brief M2MConnectionSecurity. + * This class provides a method to create a secure socket connection + * to handle connectivity for the mbed Client. It handles sending, receiving + * and establishing a secure connection for mbed Client on top of the + * normal socket connection. + */ + +class M2MConnectionSecurity { +public: + typedef enum { + NO_SECURITY = 0, + TLS, + DTLS + } SecurityMode; + +private: + // Prevents the use of assignment operator by accident. + M2MConnectionSecurity& operator=( const M2MConnectionSecurity& /*other*/ ); + // Prevents the use of copy constructor by accident. + M2MConnectionSecurity( const M2MConnectionSecurity& /*other*/ ); + +public: + /** + * \brief Default Constructor. + */ + M2MConnectionSecurity(SecurityMode mode); + + /** + * \brief Default Destructor. + */ + ~M2MConnectionSecurity(); + + /** + * \brief Resets the socket connection states. + */ + void reset(); + + /** + * \brief Initiatlizes the socket connection states. + */ + int init(const M2MSecurity *security); + + /** + * \brief Starts the connection in non-blocking mode. + * \param connHandler The ConnectionHandler object that maintains the socket. + * \return Returns the state of the connection. Successful or not. + */ + int start_connecting_non_blocking(M2MConnectionHandler* connHandler); + + /** + * \brief Continues connectivity logic for a secure connection. + * \return Returns an error code if any while continuing the connection sequence. + */ + int continue_connecting(); + + /** + * \brief Connects the client to the server. + * \param connHandler The ConnectionHandler object that maintains the socket. + * \return Returns the state of the connection. Successful or not. + */ + int connect(M2MConnectionHandler* connHandler); + + /** + * \brief Sends data to the server. + * \param message The data to be sent. + * \param len The length of the data. + * \return Indicates whether the data is sent successfully or not. + */ + int send_message(unsigned char *message, int len); + + /** + * \brief Reads the data received from the server. + * \param message The data to be read. + * \param len The length of the data. + * \return Indicates whether the data is read successfully or not. + */ + int read(unsigned char* buffer, uint16_t len); + + /** + * \brief Sets the function callback that is called by mbed Client to + * fetch a random number from an application to ensure strong entropy. + * \param random_callback A function pointer that is called by mbed Client + * while performing a secure handshake. + * The function signature should be uint32_t (*random_number_callback)(void); + */ + void set_random_number_callback(random_number_cb callback); + + /** + * \brief Sets the function callback that is called by mbed Client to + * provide an entropy source from an application to ensure strong entropy. + * \param entropy_callback A function pointer that is called by mbed-client + * while performing a secure handshake. + * Function signature, if using mbed-client-mbedtls, should be + * int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, + * size_t len, size_t *olen); + */ + void set_entropy_callback(entropy_cb callback); + +private: + + M2MConnectionSecurityPimpl* _private_impl; + + friend class Test_M2MConnectionSecurity; + //friend class Test_M2MConnectionSecurityImpl; +}; + +#endif //__M2M_CONNECTION_SECURITY_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mconstants.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2MCONSTANTS_H +#define M2MCONSTANTS_H + +/*! \file m2mconstants.h +* \brief File defining all the constants used across mbed-client. +*/ + +#include <stdint.h> +#include "m2mconfig.h" + +const int MAX_VALUE_LENGTH = 256; +const int BUFFER_LENGTH = 1152; + +const int32_t MINIMUM_REGISTRATION_TIME = 60; //in seconds +const uint64_t ONE_SECOND_TIMER = 1; +const uint16_t MAX_ALLOWED_STRING_LENGTH = 64; +const uint16_t OPTIMUM_LIFETIME = 3600; +const uint16_t REDUCE_LIFETIME = 900; +const float REDUCTION_FACTOR = 0.75f; + +// XXX: +// <name></><inst-id></><res-name> +//#define MAX_OBJECT_INSTANCE_NAME (255 + 1 + 5 + 1 + 255 + 1 + 5) +// <name></><inst-id></><inst-id><zero-terminator> +#define MAX_OBJECT_PATH_NAME (255 + 1 + 5 + 1 + 5 + 1) + +// values per: draft-ietf-core-observe-16 +// OMA LWM2M CR ref. +#define START_OBSERVATION 0 +#define STOP_OBSERVATION 1 + +#define COAP "coap://" +#define COAPS "coaps://" +#define BOOTSTRAP_URI "bs" +// PUT attributes to be checked from server +#define EQUAL "=" +#define AMP "&" +#define PMIN "pmin" +#define PMAX "pmax" +#define GT "gt" +#define LT "lt" +#define ST_SIZE "st" +#define STP "stp" +#define CANCEL "cancel" + +// just a helper for "String default_value = "";" pattern +extern const String EMPTY; + +//LWM2MOBJECT NAME/ID +#define M2M_SECURITY_ID "0" +#define M2M_SERVER_ID "1" +#define M2M_ACCESS_CONTROL_ID "2" +#define M2M_DEVICE_ID "3" +#define M2M_CONNECTIVITY_MONITOR_ID "4" +#define M2M_FIRMWARE_ID "5" +#define M2M_LOCATION_ID "6" +#define M2M_CONNECTIVITY_STATISTICS_ID "7" +#define RESERVED_ID "8" + +//OMA RESOURCE TYPE +#define OMA_RESOURCE_TYPE "" //oma.lwm2m + +//DEVICE RESOURCES +#define DEVICE_MANUFACTURER "0" +#define DEVICE_DEVICE_TYPE "17" +#define DEVICE_MODEL_NUMBER "1" +#define DEVICE_SERIAL_NUMBER "2" +#define DEVICE_HARDWARE_VERSION "18" +#define DEVICE_FIRMWARE_VERSION "3" +#define DEVICE_SOFTWARE_VERSION "19" +#define DEVICE_REBOOT "4" +#define DEVICE_FACTORY_RESET "5" +#define DEVICE_AVAILABLE_POWER_SOURCES "6" +#define DEVICE_POWER_SOURCE_VOLTAGE "7" +#define DEVICE_POWER_SOURCE_CURRENT "8" +#define DEVICE_BATTERY_LEVEL "9" +#define DEVICE_BATTERY_STATUS "20" +#define DEVICE_MEMORY_FREE "10" +#define DEVICE_MEMORY_TOTAL "21" +#define DEVICE_ERROR_CODE "11" +#define DEVICE_RESET_ERROR_CODE "12" +#define DEVICE_CURRENT_TIME "13" +#define DEVICE_UTC_OFFSET "14" +#define DEVICE_TIMEZONE "15" +#define DEVICE_SUPPORTED_BINDING_MODE "16" +#define BINDING_MODE_UDP "U" +#define BINDING_MODE_UDP_QUEUE "UQ" +#define BINDING_MODE_SMS "S" +#define BINDING_MODE_SMS_QUEUE "SQ" +#define ERROR_CODE_VALUE "0" + +//SECURITY RESOURCES +#define SECURITY_M2M_SERVER_URI "0" +#define SECURITY_BOOTSTRAP_SERVER "1" +#define SECURITY_SECURITY_MODE "2" +#define SECURITY_PUBLIC_KEY "3" +#define SECURITY_SERVER_PUBLIC_KEY "4" +#define SECURITY_SECRET_KEY "5" +#define SECURITY_SMS_SECURITY_MODE "6" +#define SECURITY_SMS_BINDING_KEY "7" +#define SECURITY_SMS_BINDING_SECRET_KEY "8" +#define SECURITY_M2M_SERVER_SMS_NUMBER "9" +#define SECURITY_SHORT_SERVER_ID "10" +#define SECURITY_CLIENT_HOLD_OFF_TIME "11" + +//SERVER RESOURCES +#define SERVER_SHORT_SERVER_ID "0" +#define SERVER_LIFETIME "1" +#define SERVER_DEFAULT_MIN_PERIOD "2" +#define SERVER_DEFAULT_MAX_PERIOD "3" +#define SERVER_DISABLE "4" +#define SERVER_DISABLE_TIMEOUT "5" +#define SERVER_NOTIFICATION_STORAGE "6" +#define SERVER_BINDING "7" +#define SERVER_REGISTRATION_UPDATE "8" + +//FIRMWARE RESOURCES +#define FIRMWARE_PATH_PREFIX "5/0/" +#define FIRMWARE_PACKAGE "0" +#define FIRMWARE_PACKAGE_URI "1" +#define FIRMWARE_UPDATE "2" +#define FIRMWARE_STATE "3" +#define FIRMWARE_UPDATE_SUPPORTED_OBJECTS "4" +#define FIRMWARE_UPDATE_RESULT "5" +#define FIRMWARE_PACKAGE_NAME "6" +#define FIRMWARE_PACKAGE_VERSION "7" + +// TLV serializer / deserializer +const uint8_t TYPE_RESOURCE = 0xC0; +const uint8_t TYPE_MULTIPLE_RESOURCE = 0x80; +const uint8_t TYPE_RESOURCE_INSTANCE = 0x40; +const uint8_t TYPE_OBJECT_INSTANCE = 0x0; + +const uint8_t ID8 = 0x0; +const uint8_t ID16 = 0x20; + +const uint8_t LENGTH8 = 0x08; +const uint8_t LENGTH16 = 0x10; +const uint8_t LENGTH24 = 0x18; + +const uint8_t COAP_CONTENT_OMA_PLAIN_TEXT_TYPE = 0; +const uint8_t COAP_CONTENT_OMA_TLV_TYPE = 99; +const uint8_t COAP_CONTENT_OMA_JSON_TYPE = 100; +const uint8_t COAP_CONTENT_OMA_OPAQUE_TYPE = 42; + +const uint16_t MAX_UNINT_16_COUNT = 65535; + +#endif // M2MCONSTANTS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mdevice.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_DEVICE_H +#define M2M_DEVICE_H + +#include "mbed-client/m2mobject.h" + +// FORWARD DECLARATION +class M2MResource; +class M2MResourceInstance; + +/*! \file m2mdevice.h + * \brief M2MDevice. + * This class represents the Device Object model of the LWM2M framework. + * It provides an interface for handling the device object + * and all its corresponding resources. There can be only one instance + * of a Device Object. + */ +class M2MDevice : public M2MObject { + +friend class M2MInterfaceFactory; + +public: + + /** + * \brief An enum defining all the resources associated with the + * Device Object in the LWM2M framework. + */ + typedef enum { + Manufacturer, + DeviceType, + ModelNumber, + SerialNumber, + HardwareVersion, + FirmwareVersion, + SoftwareVersion, + Reboot, + FactoryReset, + AvailablePowerSources, + PowerSourceVoltage, + PowerSourceCurrent, + BatteryLevel, + BatteryStatus, + MemoryFree, + MemoryTotal, + ErrorCode, + ResetErrorCode, + CurrentTime, + UTCOffset, + Timezone, + SupportedBindingMode + }DeviceResource; + +private: + + /** + * Constructor + */ + M2MDevice(char *path); + + // Prevents the use of assignment operator. + M2MDevice& operator=( const M2MDevice& /*other*/ ); + + // Prevents the use of copy constructor + M2MDevice( const M2MDevice& /*other*/ ); + + /** + * Destructor + */ + virtual ~M2MDevice(); + + static M2MDevice* get_instance(); + +public: + + /** + * \brief Deletes an M2MDevice instance. + */ + static void delete_instance(); + + /** + * \brief Creates a new resource for the given resource enum. + * \param resource With this function, the following resources can be created: + * 'Manufacturer', 'DeviceType','ModelNumber','SerialNumber', + * 'HardwareVersion', 'FirmwareVersion', 'SoftwareVersion', + * 'UTCOffset', 'Timezone', 'SupportedBindingMode'. + * \param value The value to be set on the resource, in string format. + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(DeviceResource resource, const String &value); + + /** + * \brief Creates a new resource for given resource enum. + * \param resource With this function, the following resources can be created: + * 'AvailablePowerSources','PowerSourceVoltage','PowerSourceCurrent', + * 'BatteryLevel', 'BatteryStatus', 'MemoryFree', 'MemoryTotal', + * 'ErrorCode', 'CurrentTime'. For 'CurrentTime', pass the time value in EPOCH format, for example + * 1438944683. + * \param value The value to be set on the resource, in integer format. + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(DeviceResource resource, int64_t value); + + /** + * \brief Creates a new resource instance for given resource enum. + * \param resource With this function, the following resources can be created: + * 'AvailablePowerSources','PowerSourceVoltage','PowerSourceCurrent', + * 'ErrorCode'. + * \param value The value to be set on the resource, in integer format. + * \return M2MResourceInstance if created successfully, else NULL. + */ + M2MResourceInstance* create_resource_instance(DeviceResource resource, int64_t value, + uint16_t instance_id); + + /** + * \brief Creates a new resource for given resource name. + * \param resource With this function, the following resources can be created: + * 'ResetErrorCode','FactoryReset'. + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(DeviceResource resource); + + /** + * \brief Deletes the resource with the given resource enum. + * Mandatory resources cannot be deleted. + * \param resource The name of the resource to be deleted. + * \return True if deleted, else false. + */ + bool delete_resource(DeviceResource resource); + + /** + * \brief Deletes the resource with the given resource enum. + * Mandatory resources cannot be deleted. + * \param resource The name of the resource to be deleted. + * \param instance_id The instance ID of the resource. + * \return True if deleted, else false. + */ + bool delete_resource_instance(DeviceResource resource, + uint16_t instance_id); + + /** + * \brief Sets the value of the given resource enum. + * \param resource With this function, a value can be set for the following resources: + * 'Manufacturer', 'DeviceType','ModelNumber','SerialNumber', + * 'HardwareVersion', 'FirmwareVersion', 'SoftwareVersion', + * 'UTCOffset', 'Timezone', 'SupportedBindingMode'. + * \param value The value to be set on the resource, in string format. + * \param instance_id The instance ID of the resource, default is 0. + * \return True if successfully set, else false. + */ + bool set_resource_value(DeviceResource resource, + const String &value, + uint16_t instance_id = 0); + + /** + * \brief Sets the value of the given resource enum. + * \param resource With this function, a value can be set for the following resources: + * 'AvailablePowerSources','PowerSourceVoltage','PowerSourceCurrent', + * 'BatteryLevel', 'BatteryStatus', 'MemoryFree', 'MemoryTotal', + * 'ErrorCode', 'CurrentTime'. + * \param value The value to be set on the resource, in integer format. + * \param instance_id The instance ID of the resource, default is 0. + * \return True if successfully set, else false. + */ + bool set_resource_value(DeviceResource resource, + int64_t value, + uint16_t instance_id = 0); + + /** + * \brief Returns the value of the given resource enum, in string format. + * \param resource With this function, the following resources can return a value: + * 'Manufacturer', 'DeviceType','ModelNumber','SerialNumber', + * 'HardwareVersion', 'FirmwareVersion', 'SoftwareVersion', + * 'UTCOffset', 'Timezone', 'SupportedBindingMode'. + * \param instance_id The instance ID of the resource, default is 0. + * \return The value associated with that resource. If the resource is not valid NULL is returned. + */ + String resource_value_string(DeviceResource resource, + uint16_t instance_id = 0) const; + + /** + * \brief Returns the value of the given resource key name, in integer format. + * \param resource With this function, the following resources can return a value: + * 'AvailablePowerSources','PowerSourceVoltage','PowerSourceCurrent', + * 'BatteryLevel', 'BatteryStatus', 'MemoryFree', 'MemoryTotal', + * 'ErrorCode', 'CurrentTime'. + * \param instance_id The instance ID of the resource, default is 0 + * \return The value associated with that resource. If the resource is not valid -1 is returned. + */ + int64_t resource_value_int(DeviceResource resource, + uint16_t instance_id = 0) const; + + /** + * \brief Indicates whether the resource instance with the given resource enum exists or not. + * \param resource The resource enum. + * \return True if at least one instance exists, else false. + */ + bool is_resource_present(DeviceResource resource)const; + + /** + * \brief Returns the number of resources for the whole device object. + * \return Total number of resources belonging to the device object. + */ + uint16_t total_resource_count()const; + + /** + * \brief Returns the number of resources for a given resource enum. + * \param resource The resource enum. + * \return The number of resources for a given resource enum. Returns 1 for the + * mandatory resources. Can be 0 as well if no instances exist for an + * optional resource. + */ + uint16_t per_resource_count(DeviceResource resource)const; + +private: + + M2MResourceInstance* get_resource_instance(DeviceResource dev_res, + uint16_t instance_id) const; + + static const char* resource_name(DeviceResource resource); + + bool check_value_range(DeviceResource resource, const int64_t value) const; + +private : + + M2MObjectInstance* _device_instance; //Not owned + +protected: + + static M2MDevice* _instance; + + friend class Test_M2MDevice; + friend class Test_M2MInterfaceFactory; +}; + +#endif // M2M_DEVICE_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mfirmware.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2MFIRMWARE_H +#define M2MFIRMWARE_H + +#include "mbed-client/m2mobject.h" + +// FORWARD DECLARATION +class M2MResource; +class M2MResourceInstance; + +/*! \file m2mfirmware.h + * \brief M2MFirmware. + * This class represents the Firmware Object model of the LWM2M framework. + * It provides an interface for handling the Firmware Object + * and all its corresponding resources. There can be only one instance + * of a Firmware Object. + */ +class M2MFirmware : public M2MObject { + +friend class M2MInterfaceFactory; + +public: + + /** + * \brief An enum defining all the resources associated with a + * Firmware Object in the LWM2M framework. + */ + typedef enum { + Package, + PackageUri, + Update, + State, + UpdateSupportedObjects, + UpdateResult, + PackageName, + PackageVersion + } FirmwareResource; + + /** + * \brief An enum defining the state of the firmware update. + */ + typedef enum { + Idle = 0, + Downloading, + Downloaded, + Updating + } UpdateState; + + /** + * \brief An enum defining the result of the firmware update. + */ + typedef enum { + Default = 0, + SuccessfullyUpdated, + NotEnoughSpace, + OutOfMemory, + ConnectionLost, + CRCCheckFailure, + UnsupportedPackageType, + InvalidURI + } ResultOfUpdate; + +private: + + /** + * Constructor + */ + M2MFirmware(); + + // Prevents the use of assignment operator. + M2MFirmware& operator=( const M2MFirmware& /*other*/ ); + + // Prevents the use of copy constructor. + M2MFirmware( const M2MFirmware& /*other*/ ); + + /** + * Destructor + */ + virtual ~M2MFirmware(); + + static M2MFirmware* get_instance(); + +public: + + /** + * \brief Deletes a M2MFirmware instance. + */ + static void delete_instance(); + + /** + * \brief Creates a new resource for a given resource enum. + * \param resource With this function, the following resources can be created: + * 'PackageUri', 'PackageName','PackageVersion'. + * \param value The value to be set on the resource, in string format. + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(FirmwareResource resource, const String &value); + + /** + * \brief Creates a new resource for a given resource enum. + * \param resource With this function, the following resources can be created: + * 'State','UpdateSupportedObjects','UpdateResult'. + * \param value The value to be set on the resource, in integer format. + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(FirmwareResource resource, int64_t value); + + /** + * \brief Deletes a resource with a given resource enum. + * Mandatory resources cannot be deleted. + * \param resource The name of the resource to be deleted. + * \return True if deleted, else false. + */ + bool delete_resource(FirmwareResource resource); + + /** + * \brief Sets a value of a given resource enum. + * \param resource With this function, a value can be set on the following resources: + * 'Package', 'PackageUri', 'PackageName','PackageVersion'. + * \param value The value to be set on the resource, in string format. + * \return True if successfully set, else false. + */ + bool set_resource_value(FirmwareResource resource, + const String &value); + + /** + * \brief Sets a value of a given resource enum. + * \param resource With this function, a value can be set for the following resources: + * 'State','UpdateSupportedObjects','UpdateResult'. + * \param value The value to be set on the resource, in integer format. + * \return True if successfully set, else false. + */ + bool set_resource_value(FirmwareResource resource, + int64_t value); + + /** + * \brief Sets a value of a given resource enum. + * \param resource With this function, a value can be set for the following resources: + * 'Package'. + * \param value The value to be set on the resource, in uint8_t format. + * \param size The size of the buffer value to be set on the resource. + * \return True if successfully set, else false. + */ + bool set_resource_value(FirmwareResource resource, + const uint8_t *value, + const uint32_t length); + + /** + * \brief Returns a value of a given resource enum, in string format. + * \param resource With this function, the following resources can return a value: + * 'PackageUri', 'PackageName','PackageVersion'. + * \return The value associated with that resource, if the key is not valid it returns NULL. + */ + String resource_value_string(FirmwareResource resource) const; + + /** + * \brief Returns a value of a given resource key name, in integer format. + * \param resource With this function, the following resources can return a value: + * 'State','UpdateSupportedObjects','UpdateResult'. + * \return The value associated with that resource. If the resource is not valid -1 is returned. + */ + int64_t resource_value_int(FirmwareResource resource) const; + + /** + * \brief Populates the data buffer and returns the size of the buffer. + * \param resource With this function, the following resources can return a value: + * 'Package'. + * \param [OUT]data The data buffer containing the value. + * Tha value of the pointer MUST be set as NULL before calling this function unless it has been + * allocated using malloc. In that case the data is freed when calling this function. + * The buffer is allocated using malloc when this function is called and MUST be passed to function free after use. + * \return The size of the buffer populated. + */ + uint32_t resource_value_buffer(FirmwareResource resource, + uint8_t *&data) const; + + /** + * \brief Returns whether a resource instance with a given resource enum exists or not. + * \param resource The resource enum. + * \return True if at least one instance exists, else false. + */ + bool is_resource_present(FirmwareResource resource) const; + + /** + * \brief Returns the number of resources for a whole firmware object. + * \return Total number of resources belonging to the firmware object. + */ + uint16_t total_resource_count() const; + + /** + * \brief Returns the number of resources for a given resource enum. + * \param resource The resource enum. + * \return The number of resources for a given resource enum. Returns 1 for the + * mandatory resources. Can be 0 as well if no instances exist for an + * optional resource. + */ + uint16_t per_resource_count(FirmwareResource resource) const; + + +private: + + M2MResource* get_resource(FirmwareResource resource) const; + + static const char* resource_name(FirmwareResource resource); + + void create_mandatory_resources(); + + bool check_value_range(FirmwareResource resource, const int64_t value) const; + +private : + + M2MObjectInstance* _firmware_instance; //Not owned + +protected: + + static M2MFirmware* _instance; + + friend class Test_M2MFirmware; + friend class Test_M2MInterfaceFactory; +}; + + +#endif // M2MFIRMWARE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2minterface.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_INTERFACE_H +#define M2M_INTERFACE_H + +#include <stdint.h> +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mconfig.h" +#include "mbed-client/functionpointer.h" + +//FORWARD DECLARATION +class M2MSecurity; +class M2MObject; +class M2MInterfaceObserver; + +typedef Vector<M2MObject *> M2MObjectList; +typedef FP callback_handler; + +/*! \file m2minterface.h + * \brief M2MInterface. + * This class provides an interface for handling all mbed Client interface operations + * defined in the OMA LWM2M specifications. + * This includes Bootstrapping, Client Registration, Device Management & + * Service Enablement and Information Reporting. + */ + +class M2MInterface { + +public: + + /** + * \brief An enum defining different kinds of errors + * that can occur during various client operations. + */ + typedef enum { + ErrorNone = 0, + AlreadyExists, + BootstrapFailed, + InvalidParameters, + NotRegistered, + Timeout, + NetworkError, + ResponseParseFailed, + UnknownError, + MemoryFail, + NotAllowed, + SecureConnectionFailed, + DnsResolvingFailed + }Error; + + /** + * \brief An enum defining different kinds of binding + * modes handled for client operations. + */ + typedef enum { + NOT_SET = 0, + UDP = 0x01, + UDP_QUEUE = 0x03, + SMS = 0x04, + SMS_QUEUE =0x06, + UDP_SMS_QUEUE = 0x07, + TCP = 0x09, //not real value, spec does not have one! + //this has nsdl binding mode bit UDP set + TCP_QUEUE = 0x0b //not real value, spec does not have one! + //this has nsdl binding mode bits, UDP and UDP_QUEUE set + }BindingMode; + + /** + * \brief An enum defining different kinds of network + * stacks that can be used by mbed Client. + */ + typedef enum { + Uninitialized = 0, + LwIP_IPv4, + LwIP_IPv6, + Reserved, + Nanostack_IPv6, + ATWINC_IPv4, + Unknown + }NetworkStack; + +public: + + virtual ~M2MInterface(){} + + /** + * \brief Initiates bootstrapping of the client with the provided Bootstrap + * Server information. + * NOTE: This API is not supported for developers!! + * \param security_object A security object that contains information + * required for successful bootstrapping of the client. + */ + virtual void bootstrap(M2MSecurity *security_object) = 0; + + /** + * \brief Cancels an ongoing bootstrapping operation of the client. If the client has + * already successfully bootstrapped, this function deletes the existing + * bootstrap information from the client. + * NOTE: This API is not supported for developers!! + */ + virtual void cancel_bootstrap() = 0; + + /** + * \brief Initiates the registration of a provided security object to the + * corresponding LWM2M server. + * \param security_object The security object that contains information + * required for registering to the LWM2M server. + * If the client wants to register to multiple LWM2M servers, it must call + * this function once for each of the LWM2M server objects separately. + * \param object_list Objects that contain information about the + * client attempting to register to the LWM2M server. + */ + virtual void register_object(M2MSecurity *security_object, const M2MObjectList &object_list) = 0; + + /** + * \brief Updates or refreshes the client's registration on the LWM2M + * server. + * \param security_object A security object from which the device object + * needs to update the registration. If there is only one LWM2M server registered, + * this parameter can be NULL. + * \param lifetime The lifetime of the endpoint client in seconds. If the same value + * has to be passed, set the default value to 0. + */ + virtual void update_registration(M2MSecurity *security_object, const uint32_t lifetime = 0) = 0; + + /** + * \brief Updates or refreshes the client's registration on the LWM2M + * server. Use this function to publish new objects to LWM2M server. + * \param security_object The security object from which the device object + * needs to update the registration. If there is only one LWM2M server registered, + * this parameter can be NULL. + * \param object_list Objects that contain information about the + * client attempting to register to the LWM2M server. + * \param lifetime The lifetime of the endpoint client in seconds. If the same value + * has to be passed, set the default value to 0. + */ + virtual void update_registration(M2MSecurity *security_object, const M2MObjectList &object_list, + const uint32_t lifetime = 0) = 0; + + /** + * \brief Unregisters the registered object from the LWM2M server. + * \param security_object The security object from which the device object + * needs to be unregistered. If there is only one LWM2M server registered, + * this parameter can be NULL. + */ + virtual void unregister_object(M2MSecurity* security_object = NULL) = 0; + + /** + * \brief Sets the function that is called for indicating that the client + * is going to sleep when the binding mode is selected with queue mode. + * \param callback A function pointer that is called when the client + * goes to sleep. + */ + virtual void set_queue_sleep_handler(callback_handler handler) = 0; + + /** + * \brief Sets the function callback that is called by mbed Client to + * fetch a random number from an application to ensure strong entropy. + * \param random_callback A function pointer that is called by mbed Client + * while performing a secure handshake. + * The function signature should be uint32_t (*random_number_callback)(void); + */ + virtual void set_random_number_callback(random_number_cb callback) = 0; + + /** + * \brief Sets the function callback that is called by mbed Client to + * provide an entropy source from an application to ensure strong entropy. + * \param entropy_callback A function pointer that is called by mbed Client + * while performing a secure handshake. + * Function signature, if using mbed-client-mbedtls, should be + * int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, + * size_t len, size_t *olen); + */ + virtual void set_entropy_callback(entropy_cb callback) = 0; + + /** + * \brief Sets the network interface handler that is used by mbed Client to connect + * to a network over IP. + * \param handler A network interface handler that is used by mbed Client to connect. + * This API is optional but it provides a mechanism for different platforms to + * manage the usage of underlying network interface by the client. + */ + virtual void set_platform_network_handler(void *handler = NULL) = 0; +}; + +#endif // M2M_INTERFACE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2minterfacefactory.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_INTERFACE_FACTORY_H +#define M2M_INTERFACE_FACTORY_H + +#include <stdlib.h> +#include "mbed-client/m2msecurity.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2minterfaceobserver.h" + +//FORWARD DECLARATION +class M2MDevice; +class M2MServer; +class M2MInterfaceImpl; +class M2MFirmware; + +/*! \file m2minterfacefactory.h + * \brief M2MInterfaceFactory. + * This is a factory class that provides an interface for creating an mbed Client Interface + * object for an application to utilize the LWM2M features provided by the client. + */ + +class M2MInterfaceFactory { +private: + // Prevents the use of an assignment operator by accident. + M2MInterfaceFactory& operator=( const M2MInterfaceFactory& /*other*/ ); + + // Prevents the use of a copy constructor by accident. + M2MInterfaceFactory( const M2MInterfaceFactory& /*other*/ ); + +public: + + /** + * \brief Creates an interface object for the mbed Client Inteface. With this, the + * client can handle client operations like Bootstrapping, Client + * Registration, Device Management and Information Reporting. + * \param endpoint_name The endpoint name of mbed Client. + * \param endpoint_type The endpoint type of mbed Client, default is empty. + * \param life_time The lifetime of the endpoint in seconds, + * if -1 it is optional. + * \param listen_port The listening port for the endpoint, default is 5683. + * \param domain The domain of the endpoint, default is empty. + * \param mode The binding mode of the endpoint, default is NOT_SET. + * \param stack The underlying network stack to be used for the connection, + * default is LwIP_IPv4. + * \param context_address The context address for M2M-HTTP, not used currently. + * \return M2MInterfaceImpl An object for managing other client operations. + */ + static M2MInterface *create_interface(M2MInterfaceObserver &observer, + const String &endpoint_name, + const String &endpoint_type = "", + const int32_t life_time = -1, + const uint16_t listen_port = 5683, + const String &domain = "", + M2MInterface::BindingMode mode = M2MInterface::NOT_SET, + M2MInterface::NetworkStack stack = M2MInterface::LwIP_IPv4, + const String &context_address = ""); + + /** + * \brief Creates a security object for the mbed Client Inteface. With this, the + * client can manage Bootstrapping and Client Registration. + * \param ServerType The type of the Security Object, bootstrap or LWM2M server. + * \return M2MSecurity An object for managing other client operations. + */ + static M2MSecurity *create_security(M2MSecurity::ServerType server_type); + + /** + * \brief Creates a server object for the mbed Client Inteface. With this, the + * client can manage the server resources used for client operations + * such as Client Registration, server lifetime. + * \return M2MServer An object for managing server client operations. + */ + static M2MServer *create_server(); + + /** + * \brief Creates a device object for the mbed Client Inteface. With this, the + * client can manage the device resources used for client operations + * such as Client Registration, Device Management and Information Reporting. + * \param name The name of the device object. + * \return M2MDevice An object for managing other client operations. + */ + static M2MDevice *create_device(); + + /** + * \brief Creates a firmware object for the mbed Client Inteface. With this, the + * client can manage the firmware resources used for the client operations + * such as Client Registration, Device Management and Information Reporting. + * \return M2MFirmware An object for managing other client operations. + */ + static M2MFirmware *create_firmware(); + + /** + * \brief Creates a generic object for the mbed Client Inteface. With this, the + * client can manage its own customized resources used for registering + * Device Management and Information Reporting for those resources. + * \param name The name of the object. + * \param id A unique ID for the object. It should be other than the reserved + * LWM2M object IDs. + * \return M2MObject An object for managing other mbed Client operations. + */ + static M2MObject *create_object(const String &name); + + + friend class Test_M2MInterfaceFactory; +}; + +#endif // M2M_INTERFACE_FACTORY_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2minterfaceobserver.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_INTERFACE_OBSERVER_H +#define M2M_INTERFACE_OBSERVER_H + +#include "mbed-client/m2mbase.h" +#include "mbed-client/m2minterface.h" + +//FORWARD DECLARATION +class M2MServer; + +/*! \file m2minterfaceobserver.h + * \brief M2MInterfaceObserver + * This is an observer class that updates the calling application about + * various events associated with various Interface operations. + * Also, it informs about various errors that can occur during any of the above + * operations. + */ +class M2MInterfaceObserver { + +public: + + /** + * \brief A callback indicating that the bootstap has been performed successfully. + * \param server_object The server object that contains information fetched + * about the LWM2M server from the bootstrap server. This object can be used + * to register to the LWM2M server. The object ownership is passed. + */ + virtual void bootstrap_done(M2MSecurity *server_object) = 0; + + /** + * \brief A callback indicating that the device object has been registered + * successfully to the LWM2M server. + * \param security_object The server object on which the device object is + * registered. The object ownership is passed. + * \param server_object An object containing information about the LWM2M server. + * The client maintains the object. + */ + virtual void object_registered(M2MSecurity *security_object, const M2MServer &server_object) = 0; + + /** + * \brief A callback indicating that the device object has been successfully unregistered + * from the LWM2M server. + * \param server_object The server object from which the device object is + * unregistered. The object ownership is passed. + */ + virtual void object_unregistered(M2MSecurity *server_object) = 0; + + /** + * \brief A callback indicating that the device object registration has been successfully + * updated on the LWM2M server. + * \param security_object The server object on which the device object registration + * updated. The object ownership is passed. + * \param server_object An object containing information about the LWM2M server. + * The client maintains the object. + */ + virtual void registration_updated(M2MSecurity *security_object, const M2MServer & server_object) = 0; + + /** + * \brief A callback indicating that there was an error during the operation. + * \param error An error code for the occurred error. + */ + virtual void error(M2MInterface::Error error) = 0; + + /** + * \brief A callback indicating that the value of the resource object is updated by the server. + * \param base The object whose value is updated. + * \param type The type of the object. + */ + virtual void value_updated(M2MBase *base, M2MBase::BaseType type) = 0; +}; + +#endif // M2M_INTERFACE_OBSERVER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mobject.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_OBJECT_H +#define M2M_OBJECT_H + +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mbase.h" +#include "mbed-client/m2mobjectinstance.h" + +//FORWARD DECLARATION +typedef Vector<M2MObjectInstance *> M2MObjectInstanceList; + +/*! \file m2mobject.h + * \brief M2MObject. + * This class is the base class for the mbed Client Objects. All defined + * LWM2M object models can be created based on it. This class also holds all object + * instances associated with the given object. + */ + +class M2MObject : public M2MBase +{ + +friend class M2MInterfaceFactory; + +protected : + + /** + * \brief Constructor + * \param name The name of the object. + * \param path Path of the object like 3/0/1 + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + */ + M2MObject(const String &object_name, + char *path, + bool external_blockwise_store = false); + + // Prevents the use of default constructor. + M2MObject(); + + // Prevents the use of assignment operator. + M2MObject& operator=( const M2MObject& /*other*/ ); + + // Prevents the use of copy constructor. + M2MObject( const M2MObject& /*other*/ ); + + /** + * \brief Constructor + * \param name The name of the object. + */ + M2MObject(const M2MBase::lwm2m_parameters_s* static_res); + +public: + + /** + * \brief Destructor + */ + virtual ~M2MObject(); + + /** + * \brief Creates a new object instance for a given mbed Client Interface object. With this, + * the client can respond to server's GET methods with the provided value. + * \return M2MObjectInstance. An object instance for managing other client operations. + */ + M2MObjectInstance* create_object_instance(uint16_t instance_id = 0); + + /** + * TODO!! + */ + M2MObjectInstance* create_object_instance(const lwm2m_parameters_s* s); + + /** + * \brief Removes the object instance resource with the given instance id. + * \param instance_id The instance ID of the object instance to be removed, default is 0. + * \return True if removed, else false. + */ + virtual bool remove_object_instance(uint16_t instance_id = 0); + + /** + * \brief Returns the object instance with the the given instance ID. + * \param instance_id The instance ID of the requested object instance ID, default is 0. + * \return Object instance reference if found, else NULL. + */ + virtual M2MObjectInstance* object_instance(uint16_t instance_id = 0) const; + + /** + * \brief Returns a list of object instances. + * \return A list of object instances. + */ + virtual const M2MObjectInstanceList& instances() const; + + /** + * \brief Returns the total number of object instances- + * \return The total number of the object instances. + */ + virtual uint16_t instance_count() const; + + /** + * \brief Returns the object type. + * \return BaseType. + */ + virtual M2MBase::BaseType base_type() const; + + /** + * \brief Adds the observation level for the object. + * \param observation_level The level of observation. + */ + virtual void add_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Removes the observation level from the object. + * \param observation_level The level of observation. + */ + virtual void remove_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Handles GET request for the registered objects. + * \param nsdl The NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler The handler object for sending + * observation callbacks. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler = NULL); + + /** + * \brief Handles PUT request for the registered objects. + * \param nsdl The NSDL handler for the CoAP library. + * \param received_coap_header The received CoAP message from the server. + * \param observation_handler The handler object for sending + * observation callbacks. + * \param execute_value_updated True will execute the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated); + + /** + * \brief Handles GET request for the registered objects. + * \param nsdl The NSDL handler for the CoAP library. + * \param received_coap_header The received CoAP message from the server. + * \param observation_handler The handler object for sending + * observation callbacks. + * \param execute_value_updated True will execute the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_post_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated, + sn_nsdl_addr_s *address = NULL); + + virtual void notification_update(uint16_t obj_instance_id); + +protected : + + +private: + + M2MObjectInstanceList _instance_list; // owned + uint16_t _max_instance_count; + +friend class Test_M2MObject; +friend class Test_M2MInterfaceImpl; +friend class Test_M2MNsdlInterface; +friend class Test_M2MTLVSerializer; +friend class Test_M2MTLVDeserializer; +friend class Test_M2MDevice; +friend class Test_M2MFirmware; +friend class Test_M2MBase; +friend class Test_M2MObjectInstance; +friend class Test_M2MResource; +friend class Test_M2MSecurity; +friend class Test_M2MServer; +friend class Test_M2MResourceInstance; +}; + +#endif // M2M_OBJECT_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mobjectinstance.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_OBJECT_INSTANCE_H +#define M2M_OBJECT_INSTANCE_H + +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mresource.h" + +//FORWARD DECLARATION +typedef Vector<M2MResource *> M2MResourceList; +typedef Vector<M2MResourceInstance *> M2MResourceInstanceList; + + +class M2MObject; + +/*! \file m2mobjectinstance.h + * \brief M2MObjectInstance. + * This class is the instance class for mbed Client Objects. All defined + * LWM2M object models can be created based on it. This class also holds all resource + * instances associated with the given object. + */ + +class M2MObjectInstance : public M2MBase +{ + +friend class M2MObject; + +private: // Constructor and destructor are private which means + // that these objects can be created or + // deleted only through function provided by M2MObject. + + /** + * \brief Constructor + * \param name Name of the object + */ + M2MObjectInstance(M2MObject& parent, const String &object_name, + const String &resource_type, + char *path, + bool external_blockwise_store = false); + + M2MObjectInstance(M2MObject& parent, const lwm2m_parameters_s* static_res); + + // Prevents the use of default constructor. + M2MObjectInstance(); + + // Prevents the use of assignment operator. + M2MObjectInstance& operator=( const M2MObjectInstance& /*other*/ ); + + // Prevents the use of copy constructor. + M2MObjectInstance( const M2MObjectInstance& /*other*/ ); + + /** + * Destructor + */ + virtual ~M2MObjectInstance(); + +public: + + /** + * \brief TODO! + * \return M2MResource The resource for managing other client operations. + */ + M2MResource* create_static_resource(const lwm2m_parameters_s* static_res, + M2MResourceInstance::ResourceType type); + + /** + * \brief Creates a static resource for a given mbed Client Inteface object. With this, the + * client can respond to server's GET methods with the provided value. + * \param resource_name The name of the resource. + * \param resource_type The type of the resource. + * \param value A pointer to the value of the resource. + * \param value_length The length of the value in the pointer. + * \param multiple_instance A resource can have + * multiple instances, default is false. + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + * \return M2MResource The resource for managing other client operations. + */ + M2MResource* create_static_resource(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + bool multiple_instance = false, + bool external_blockwise_store = false); + + /** + * \brief Creates a dynamic resource for a given mbed Client Inteface object. With this, + * the client can respond to different queries from the server (GET,PUT etc). + * This type of resource is also observable and carries callbacks. + * \param resource_name The name of the resource. + * \param resource_type The type of the resource. + * \param observable Indicates whether the resource is observable or not. + * \param multiple_instance The resource can have + * multiple instances, default is false. + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + * \return M2MResource The resource for managing other client operations. + */ + M2MResource* create_dynamic_resource(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + bool multiple_instance = false, + bool external_blockwise_store = false); + + /** + * \brief TODO! + * \return M2MResource The resource for managing other client operations. + */ + M2MResource* create_dynamic_resource(const lwm2m_parameters_s* static_res, + M2MResourceInstance::ResourceType type, + bool observable); + + /** + * \brief Creates a static resource instance for a given mbed Client Inteface object. With this, + * the client can respond to server's GET methods with the provided value. + * \param resource_name The name of the resource. + * \param resource_type The type of the resource. + * \param value A pointer to the value of the resource. + * \param value_length The length of the value in pointer. + * \param instance_id The instance ID of the resource. + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + * \return M2MResourceInstance The resource instance for managing other client operations. + */ + M2MResourceInstance* create_static_resource_instance(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + uint16_t instance_id, + bool external_blockwise_store = false); + + /** + * \brief Creates a dynamic resource instance for a given mbed Client Inteface object. With this, + * the client can respond to different queries from the server (GET,PUT etc). + * This type of resource is also observable and carries callbacks. + * \param resource_name The name of the resource. + * \param resource_type The type of the resource. + * \param observable Indicates whether the resource is observable or not. + * \param instance_id The instance ID of the resource. + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + * \return M2MResourceInstance The resource instance for managing other client operations. + */ + M2MResourceInstance* create_dynamic_resource_instance(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + uint16_t instance_id, + bool external_blockwise_store = false); + + /** + * \brief Removes the resource with the given name. + * \param name The name of the resource to be removed. + * Note: this will be removed in next version, please use the + * remove_resource(const char*) version instead. + * \return True if removed, else false. + */ + virtual bool remove_resource(const String &name); + + /** + * \brief Removes the resource with the given name. + * \param name The name of the resource to be removed. + * \return True if removed, else false. + */ + virtual bool remove_resource(const char *name); + + /** + * \brief Removes the resource instance with the given name. + * \param resource_name The name of the resource instance to be removed. + * \param instance_id The instance ID of the instance. + * \return True if removed, else false. + */ + virtual bool remove_resource_instance(const String &resource_name, + uint16_t instance_id); + + /** + * \brief Returns the resource with the given name. + * \param name The name of the requested resource. + * \return Resource reference if found, else NULL. + */ + virtual M2MResource* resource(const String &name) const; + + virtual M2MResource* resource(const char *resource) const; + + /** + * \brief Returns a list of M2MResourceBase objects. + * \return A list of M2MResourceBase objects. + */ + virtual const M2MResourceList& resources() const; + + /** + * \brief Returns the total number of resources with the object. + * \return Total number of the resources. + */ + virtual uint16_t resource_count() const; + + /** + * \brief Returns the total number of single resource instances. + * Note: this will be removed in next version, please use the + * resource_count(const char*) version instead. + * \param resource The name of the resource. + * \return Total number of the resources. + */ + virtual uint16_t resource_count(const String& resource) const; + + /** + * \brief Returns the total number of single resource instances. + * \param resource The name of the resource. + * \return Total number of the resources. + */ + virtual uint16_t resource_count(const char *resource) const; + + /** + * \brief Returns the object type. + * \return BaseType. + */ + virtual M2MBase::BaseType base_type() const; + + /** + * \brief Adds the observation level for the object. + * \param observation_level The level of observation. + */ + virtual void add_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Removes the observation level from the object. + * \param observation_level The level of observation. + */ + virtual void remove_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Handles GET request for the registered objects. + * \param nsdl The NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler The handler object for sending + * observation callbacks. + * return sn_coap_hdr_s The message that needs to be sent to the server. + */ + virtual sn_coap_hdr_s* handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler = NULL); + /** + * \brief Handles PUT request for the registered objects. + * \param nsdl The NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler The handler object for sending + * observation callbacks. + * \param execute_value_updated True will execute the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated); + + /** + * \brief Handles POST request for the registered objects. + * \param nsdl The NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler The handler object for sending + * observation callbacks. + * \param execute_value_updated True will execute the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to server. + */ + virtual sn_coap_hdr_s* handle_post_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated, + sn_nsdl_addr_s *address = NULL); + + inline M2MObject& get_parent_object() const; + + // callback used from M2MResource/M2MResourceInstance + virtual void notification_update(M2MBase::Observation observation_level); + +private: + + M2MObject &_parent; + + M2MResourceList _resource_list; // owned + + friend class Test_M2MObjectInstance; + friend class Test_M2MObject; + friend class Test_M2MDevice; + friend class Test_M2MSecurity; + friend class Test_M2MServer; + friend class Test_M2MNsdlInterface; + friend class Test_M2MFirmware; + friend class Test_M2MTLVSerializer; + friend class Test_M2MTLVDeserializer; + friend class Test_M2MBase; + friend class Test_M2MResource; + friend class Test_M2MResourceInstance; +}; + +inline M2MObject& M2MObjectInstance::get_parent_object() const +{ + return _parent; +} + +#endif // M2M_OBJECT_INSTANCE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mobservationhandler.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_OBSERVATION_HANDLER_H +#define M2M_OBSERVATION_HANDLER_H + +//FORWARD DECLARATION +class M2MBase; +class M2MResourceInstance; + +/*! \file m2mobservationhandler.h + * \brief M2MObservationHandler. + * An interface for handling observation + * callbacks from different objects. + * + */ +class M2MObservationHandler +{ + public: + + /** + * \brief The observation callback to be sent to the + * server due to a change in a parameter under observation. + * \param object The observed object whose information needs to be sent. + * \param obs_number The observation number. + * \param changed_instance_ids A list of changed object instance IDs. + * \param send_object Indicates whether the whole object will be sent or not. + */ + virtual void observation_to_be_sent(M2MBase *object, + uint16_t obs_number, + m2m::Vector<uint16_t> changed_instance_ids, + bool send_object = false) = 0; + + /** + * \brief A callback for removing an NSDL resource from the data structures. + * \param The M2MBase derived observed object whose information + * needs to be removed. + */ + virtual void resource_to_be_deleted(M2MBase *base) = 0; + + /** + * \brief A callback indicating that the value of the resource object is updated by server. + * \param base The object whose value is updated. + * \param object_name The name of the updated resource, default is empty. + */ + virtual void value_updated(M2MBase *base, const String &object_name = "") = 0; + + /** + * \brief A callback for removing an object from the list. + * \param object The M2MObject to be removed. + */ + virtual void remove_object(M2MBase *object) = 0; + + /** + * \brief A delayed response callback to be sent to the + * server due to a changed response. + * \param base The resource sending the response. + */ + virtual void send_delayed_response(M2MBase *base) = 0; + +}; + + +#endif // M2M_OBSERVATION_HANDLER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mreportobserver.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2MREPORTOBSERVER_H +#define M2MREPORTOBSERVER_H + +#include <inttypes.h> +#include <mbed-client/m2mvector.h> + +/*! \file m2mreportobserver.h + * \brief M2MReportObserver. + * An interface for inviting the base class + * to send a report to the server. + * + */ +class M2MReportObserver +{ + public: + + /** + * \brief An observation callback to be sent to the + * server due to a change in the observed parameter. + * \param changed_instance_ids A list of changed object instance IDs. + * \param send_object Indicates whether the whole object will be sent or not. + */ + virtual void observation_to_be_sent(m2m::Vector<uint16_t> changed_instance_ids, + bool send_object = false) = 0; + +}; + +#endif // M2MREPORTOBSERVER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mresource.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_RESOURCE_H +#define M2M_RESOURCE_H + +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mresourceinstance.h" + +//FORWARD DECLARATION +class M2MObjectInstance; +typedef Vector<M2MResourceInstance *> M2MResourceInstanceList; + +class M2MResourceCallback { +public: + virtual void notification_update() = 0; +}; + +/*! \file m2mresource.h + * \brief M2MResource. + * This class is the base class for mbed Client Resources. All defined + * LWM2M object models can be created using it. This class will also hold all resources + * instances associated with the given object. + */ + +class M2MResource : public M2MResourceInstance, M2MResourceCallback { + + friend class M2MObjectInstance; + +public: + class M2MExecuteParameter; + +private: // Constructor and destructor are private, + // which means that these objects can be created or + // deleted only through a function provided by the M2MObjectInstance. + + M2MResource(M2MObjectInstance &_parent, + const lwm2m_parameters_s* s, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id); + /** + * \brief Constructor + * \param resource_name The resource name of the object. + * \param resource_type The resource type of the object. + * \param type The resource data type of the object. + * \param value The value pointer of the object. + * \param value_length The length of the value pointer. + * \param path Full path of the resource, eg. 1/2/3. Ownership of the memory is transferred. + * \param object_instance_id The instance ID of the object where the resource exists. + * \param object_name The name of the object where the resource exists. + * \param multiple_instance True if the resource supports instances. + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + */ + M2MResource(M2MObjectInstance &_parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + char *path, + const uint16_t object_instance_id = 0, + bool multiple_instance = false, + bool external_blockwise_store = false); + + /** + * \brief Constructor + * \param resource_name The resource name of the object. + * \param resource_type The resource type of the object. + * \param type The resource data type of the object. + * \param observable Indicates whether the resource is observable or not. + * \param path Full path of the resource, eg. 1/2/3. Ownership of the memory is transferred. + * \param object_instance_id The ID of the object instance where the resource exists. + * \param object_name The name of the object where the resource exists. + * \param multiple_instance True if the resource supports instances. + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + */ + M2MResource(M2MObjectInstance &_parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + char *path, + const uint16_t object_instance_id = 0, + bool multiple_instance = false, + bool external_blockwise_store = false); + + // Prevents the use of a default constructor. + M2MResource(); + + // Prevents the use of an assignment operator. + M2MResource& operator=( const M2MResource& /*other*/ ); + + // Prevents the use of a copy constructor + M2MResource( const M2MResource& /*other*/ ); + + /** + * Destructor + */ + virtual ~M2MResource(); + +public: + + /** + * \brief Adds resource instances to a M2MResource. + * \param resource_instance The resource instance to be added. + */ + void add_resource_instance(M2MResourceInstance *resource_instance); + + /** + * \brief Returns whether the resource has multiple + * resource instances or not. + * \return True if the resource base has multiple instances, + * else false. + */ + bool supports_multiple_instances() const; + + /** + * \brief Sets whether the resource should send a delayed response for a POST request. + * \param delayed_response A boolean value to set the delayed response. + */ + void set_delayed_response(bool delayed_response); + + /** + * \brief A trigger to send the delayed response for the POST request. + * The delayed_response flag must be set before receiving the POST request + * and the value of the resource must be updated before calling this function. + * \return True if a response is sent, else false. + */ + bool send_delayed_post_response(); + + /** + * \brief Provides the value of the given token. + * \param value[OUT] A pointer to the token value. + * \param value_length[OUT] The length of the token pointer. + */ + void get_delayed_token(uint8_t *&token, uint8_t &token_length); + + /** + * \brief Removes a resource with a given name. + * \param name The name of the resource to be removed. + * \param instance_id The instance ID of the resource to be removed, default is 0. + * \return True if removed, else false. + */ + virtual bool remove_resource_instance(uint16_t instance_id = 0); + + /** + * \brief Returns a resource instance with a given name. + * \param instance_id The instance ID of the requested resource, default is 0 + * \return M2MResourceInstance object if found, else NULL. + */ + virtual M2MResourceInstance* resource_instance(uint16_t instance_id = 0) const; + + /** + * \brief Returns a list of resources. + * \return A list of resources. + */ + virtual const M2MResourceInstanceList& resource_instances() const; + + /** + * \brief Returns the total number of resources. + * \return The total number of resources. + */ + virtual uint16_t resource_instance_count() const; + + /** + * \brief Returns the value set for delayed response. + * \return The value for delayed response. + */ + bool delayed_response() const; + + /** + * \brief Parses the received query for a notification + * attribute. + * \return True if required attributes are present, else false. + */ + virtual bool handle_observation_attribute(const char *query); + + /** + * \brief Adds the observation level for the object. + * \param observation_level The level of observation. + */ + virtual void add_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Removes the observation level from an object. + * \param observation_level The level of observation. + */ + virtual void remove_observation_level(M2MBase::Observation observation_level); + + /** + * \brief Handles the GET request for registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \return sn_coap_hdr_s The message that needs to be sent to the server. + */ + virtual sn_coap_hdr_s* handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler = NULL); + /** + * \brief Handles the PUT request for registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \param execute_value_updated True executes the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to the server. + */ + virtual sn_coap_hdr_s* handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated); + /** + * \brief Handles the POST request for registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \param execute_value_updated True executes the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to the server. + */ + virtual sn_coap_hdr_s* handle_post_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated, + sn_nsdl_addr_s *address = NULL); + + M2MObjectInstance& get_parent_object_instance() const; + + /** + * \brief Returns the name of the object where the resource exists. + * \return Object name. + */ + virtual const char* object_name() const; + +protected: + virtual void notification_update(); + + +private: + M2MObjectInstance &_parent; + + M2MResourceInstanceList _resource_instance_list; // owned + uint8_t *_delayed_token; + uint8_t _delayed_token_len; + bool _has_multiple_instances; + bool _delayed_response; + +friend class Test_M2MResource; +friend class Test_M2MObjectInstance; +friend class Test_M2MObject; +friend class Test_M2MDevice; +friend class Test_M2MSecurity; +friend class Test_M2MServer; +friend class Test_M2MNsdlInterface; +friend class Test_M2MFirmware; +friend class Test_M2MTLVSerializer; +friend class Test_M2MTLVDeserializer; +friend class Test_M2MBase; +friend class Test_M2MResourceInstance; +}; + +/** + * \brief M2MResource::M2MExecuteParameter. + * This class handles the "Execute" operation arguments. + */ +class M2MResource::M2MExecuteParameter { + +private: + + /** + * \brief Constructor + */ + M2MExecuteParameter(); + + /** + * Destructor + */ + ~M2MExecuteParameter(); + +public: + + /** + * \brief Returns the value of an argument. + * \return uint8_t * The argument value. + */ + uint8_t *get_argument_value() const; + + /** + * \brief Returns the length of the value argument. + * \return uint8_t The argument value length. + */ + uint16_t get_argument_value_length() const; + + /** + * \brief Returns the name of the object where the resource exists. + * \return Object name. + */ + const String& get_argument_object_name() const; + + /** + * \brief Returns the resource name. + * \return Resource name. + */ + const String& get_argument_resource_name() const; + + /** + * \brief Returns the instance ID of the object where the resource exists. + * \return Object instance ID. + */ + uint16_t get_argument_object_instance_id() const; + +private: + + String _object_name; + String _resource_name; + uint8_t * _value; + uint16_t _value_length; + uint16_t _object_instance_id; + + +friend class Test_M2MResource; +friend class M2MResource; +}; + +#endif // M2M_RESOURCE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mresourceinstance.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,351 @@ + /* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_RESOURCE_INSTANCE_H +#define M2M_RESOURCE_INSTANCE_H + +#include "mbed-client/m2mbase.h" +#include "mbed-client/functionpointer.h" + + +/*! \file m2mresourceinstance.h + * \brief M2MResourceInstance. + * This class is the base class for mbed Client Resources. All defined + * LWM2M resource models can be created based on it. + */ +class M2MBlockMessage; + +typedef FP1<void,void*> execute_callback; +typedef void(*execute_callback_2) (void *arguments); + +typedef FP0<void> notification_sent_callback; +typedef void(*notification_sent_callback_2) (void); + +typedef FP1<void, M2MBlockMessage *> incoming_block_message_callback; +typedef FP3<void, const String &, uint8_t *&, uint32_t &> outgoing_block_message_callback; + +class M2MResource; +class M2MResourceCallback; + +class M2MResourceInstance : public M2MBase { + +friend class M2MObjectInstance; +friend class M2MResource; + +public: + + /** + * An enum defining a resource type that can be + * supported by a given resource. + */ + typedef enum { + STRING, + INTEGER, + FLOAT, + BOOLEAN, + OPAQUE, + TIME, + OBJLINK + }ResourceType; + + +private: // Constructor and destructor are private + // which means that these objects can be created or + // deleted only through a function provided by the M2MObjectInstance. + + M2MResourceInstance(M2MResource &parent, + const lwm2m_parameters_s* s, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id); + /** + * \brief A constructor for creating a resource. + * \param resource_name The name of the resource. + * \param resource_type The type of the resource. + * \param type The resource data type of the object. + * \param object_instance_id Object instance id where resource exists. + * \param object_name Object name where resource exists. + * \param path Path of the object like 3/0/1 + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + */ + M2MResourceInstance(M2MResource &parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id, + char* path, + bool external_blockwise_store); + + /** + * \brief A Constructor for creating a resource. + * \param resource_name The name of the resource. + * \param resource_type The type of the resource. + * \param type The resource data type of the object. + * \param value The value pointer of the object. + * \param value_length The length of the value pointer. + * \param value_length The length of the value pointer. + * \param object_instance_id Object instance id where resource exists. + * \param object_name Object name where resource exists. + * \param path Path of the object like 3/0/1 + * \param external_blockwise_store If true CoAP blocks are passed to application through callbacks + * otherwise handled in mbed-client-c. + */ + M2MResourceInstance(M2MResource &parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + const uint16_t object_instance_id, + char* path, + bool external_blockwise_store); + + // Prevents the use of default constructor. + M2MResourceInstance(); + + // Prevents the use of assignment operator. + M2MResourceInstance& operator=( const M2MResourceInstance& /*other*/ ); + + // Prevents the use of copy constructor + M2MResourceInstance( const M2MResourceInstance& /*other*/ ); + + /** + * Destructor + */ + virtual ~M2MResourceInstance(); + +public: + + /** + * \brief Returns the object type. + * \return BaseType. + */ + virtual M2MBase::BaseType base_type() const; + + /** + * \brief Returns the resource data type. + * \return ResourceType. + */ + virtual M2MResourceInstance::ResourceType resource_instance_type() const; + + /** + * \brief Parses the received query for a notification + * attribute. + * \return True if required attributes are present, else false. + */ + virtual bool handle_observation_attribute(const char *query); + + /** + * \brief Sets the function that should be executed when this + * resource receives a POST command. + * \param callback The function pointer that needs to be executed. + */ + virtual void set_execute_function(execute_callback callback); + + /** + * \brief Sets the function that should be executed when this + * resource receives a POST command. + * \param callback The function pointer that needs to be executed. + */ + virtual void set_execute_function(execute_callback_2 callback); + + /** + * \brief Sets a value of a given resource. + * \param value A pointer to the value to be set on the resource. + * \param value_length The length of the value pointer. + * \return True if successfully set, else false. + */ + virtual bool set_value(const uint8_t *value, const uint32_t value_length); + + /** + * \brief Sets a value of a given resource. + * \param value, A new value formatted as a string + * and set on the resource. + * \return True if successfully set, else false. + */ + virtual bool set_value(int64_t value); + + /** + * \brief Clears the value of a given resource. + */ + virtual void clear_value(); + + /** + * \brief Executes the function that is set in "set_execute_function". + * \param arguments The arguments that are passed to be executed. + */ + void execute(void *arguments); + + /** + * \brief Provides the value of the given resource. + * \param value[OUT] A pointer to the resource value. + * \param value_length[OUT] The length of the value pointer. + */ + virtual void get_value(uint8_t *&value, uint32_t &value_length); + + /** + * \brief Converts a value to integer and returns it. Note: Conversion + * errors are not detected. + */ + int get_value_int(); + + /** + * Get the value as a string object. No encoding/charset conversions + * are done for the value, just a raw copy. + */ + String get_value_string() const; + + /** + * \brief Returns the value pointer of the object. + * \return The value pointer of the object. + */ + uint8_t* value() const; + + /** + * \brief Returns the length of the value pointer. + * \return The length of the value pointer. + */ + uint32_t value_length() const; + + /** + * \brief Handles the GET request for the registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \return sn_coap_hdr_s The message that needs to be sent to the server. + */ + virtual sn_coap_hdr_s* handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler = NULL); + /** + * \brief Handles the PUT request for the registered objects. + * \param nsdl An NSDL handler for the CoAP library. + * \param received_coap_header The CoAP message received from the server. + * \param observation_handler A handler object for sending + * observation callbacks. + * \param execute_value_updated True will execute the "value_updated" callback. + * \return sn_coap_hdr_s The message that needs to be sent to the server. + */ + virtual sn_coap_hdr_s* handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated); + + /** + * \brief Returns the instance ID of the object where the resource exists. + * \return Object instance ID. + */ + uint16_t object_instance_id() const; + + /** + * \brief Returns the name of the object where the resource exists. + * \return Object name. + */ + virtual const char* object_name() const; + + /** + * @brief Sets the function that is executed when this + * object receives a block-wise message. + * @param callback The function pointer that is called. + */ + virtual void set_incoming_block_message_callback(incoming_block_message_callback callback); + + /** + * @brief Sets the function that is executed when this + * object receives a GET request. + * This is called if resource values are stored on the application side. + * NOTE! Due to a limitation in the mbed-client-c library, a GET request can only contain data size up to 65KB. + * @param callback The function pointer that is called. + */ + virtual void set_outgoing_block_message_callback(outgoing_block_message_callback callback); + + /** + * \brief Returns the block message object. + * \return Block message. + */ + virtual M2MBlockMessage* block_message() const; + + /** + * @brief Sets the function that is executed when this object receives + * response(Empty ACK) for notification message. + * @param callback The function pointer that is called. + */ + void set_notification_sent_callback(notification_sent_callback callback); + + /** + * @brief Sets the function that is executed when this object receives + * response(Empty ACK) for notification message. + * @param callback The function pointer that is called. + */ + void set_notification_sent_callback(notification_sent_callback_2 callback); + + /** + * \brief Executes the function that is set in "set_notification_sent_callback". + */ + void notification_sent(); + + M2MResource& get_parent_resource() const; + +protected: + + /** + * \brief Set an observer for sending the notification update. + * \param resource The callback handle. + */ + void set_resource_observer(M2MResourceCallback *resource); + +private: + + void report(); + + bool is_value_changed(const uint8_t* value, const uint32_t value_len); + +private: + + // XXX: since the M2MResource is inherited from this class, the resource actually has back + // pointer to itself. If this inheritance was broken, we could save some memory. + M2MResource &_parent_resource; + + uint8_t *_value; + uint32_t _value_length; + M2MBlockMessage *_block_message_data; + execute_callback *_execute_callback; + M2MResourceCallback *_resource_callback; // Not owned + FP1<void, void*> *_execute_function_pointer; + FP0<void> *_notification_sent_function_pointer; + + // Note: these two callbacks should be moved behind ifdef, as they are not needed by all/most apps. + incoming_block_message_callback *_incoming_block_message_cb; + outgoing_block_message_callback *_outgoing_block_message_cb; + + notification_sent_callback *_notification_sent_callback; + uint16_t _object_instance_id; + ResourceType _resource_type; + + friend class Test_M2MResourceInstance; + friend class Test_M2MResource; + friend class Test_M2MObjectInstance; + friend class Test_M2MObject; + friend class Test_M2MDevice; + friend class Test_M2MSecurity; + friend class Test_M2MServer; + friend class Test_M2MNsdlInterface; + friend class Test_M2MFirmware; + friend class Test_M2MTLVSerializer; + friend class Test_M2MTLVDeserializer; +}; + +#endif // M2M_RESOURCE_INSTANCE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2msecurity.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_SECURITY_H +#define M2M_SECURITY_H + +#include "mbed-client/m2mobject.h" + +// FORWARD DECLARATION +class M2MResource; + +/*! \file m2msecurity.h + * \brief M2MSecurity. + * This class represents an interface for the Security Object model of the LWM2M framework. + * It handles the security object instances and all corresponding + * resources. + */ + +class M2MSecurity : public M2MObject { + +friend class M2MInterfaceFactory; +friend class M2MNsdlInterface; + +public: + + /** + * \brief An enum defining all resources associated with a + * Security Object in the LWM2M framework. + */ + typedef enum { + M2MServerUri, + BootstrapServer, + SecurityMode, + PublicKey, + ServerPublicKey, + Secretkey, + SMSSecurityMode, + SMSBindingKey, + SMSBindingSecretKey, + M2MServerSMSNumber, + ShortServerID, + ClientHoldOffTime + }SecurityResource; + + /** + * \brief An enum defining the type of the security attribute + * used by the Security Object. + */ + typedef enum { + SecurityNotSet = -1, + Psk = 0, + Certificate = 2, + NoSecurity = 3 + } SecurityModeType; + + /** + * \brief An enum defining an interface operation that can be + * handled by the Security Object. + */ + typedef enum { + Bootstrap = 0x0, + M2MServer = 0x1 + } ServerType; + +private: + + /** + * \brief Constructor + * \param server_type The type of the security object created. Either bootstrap or LWM2M server. + */ + M2MSecurity(ServerType server_type); + + // Prevents the use of default constructor. + M2MSecurity(); + + // Prevents the use of assignment operator. + M2MSecurity& operator=( const M2MSecurity& /*other*/ ); + + // Prevents the use of copy constructor + M2MSecurity( const M2MSecurity& /*other*/ ); + +public: + + /** + * \brief Destructor + */ + virtual ~M2MSecurity(); + + /** + * \brief Creates a new resource for a given resource enum. + * \param rescource With this function, the following resources can be created: + * ' BootstrapServer', 'SecurityMode', 'SMSSecurityMode', + * 'M2MServerSMSNumber', 'ShortServerID', 'ClientHoldOffTime'. + * \param value The value to be set on the resource, in integer format. + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(SecurityResource rescource, uint32_t value); + + /** + * \brief Deletes a resource with a given resource enum. + * Mandatory resources cannot be deleted. + * \param resource The resource to be deleted. + * \return True if deleted, else false. + */ + bool delete_resource(SecurityResource rescource); + + /** + * \brief Sets the value of a given resource enum. + * \param resource With this function, a value can be set for the following resources: + * 'M2MServerUri', 'SMSBindingKey', 'SMSBindingSecretKey'. + * \param value The value to be set on the resource, in string format. + * \return True if successfully set, else false. + */ + bool set_resource_value(SecurityResource resource, + const String &value); + + /** + * \brief Sets the value of a given resource enum. + * \param resource With this function, a value can be set for the following resourecs: + * 'BootstrapServer', 'SecurityMode', 'SMSSecurityMode', + * 'M2MServerSMSNumber', 'ShortServerID', 'ClientHoldOffTime'. + * \param value The value to be set on the resource, in integer format. + * \return True if successfully set, else false. + */ + bool set_resource_value(SecurityResource resource, + uint32_t value); + + /** + * \brief Sets the value of a given resource enum. + * \param resource With this function, a value can be set for the follwing resources: + * 'PublicKey', 'ServerPublicKey', 'Secretkey'. + * \param value The value to be set on the resource, in uint8_t format. + * \param size The size of the buffer value to be set on the resource. + * \return True if successfully set, else false. + */ + bool set_resource_value(SecurityResource resource, + const uint8_t *value, + const uint16_t length); + + /** + * \brief Returns the value of a given resource enum, in string format. + * \param resource With this function, the following resources can return a value: + * 'M2MServerUri','SMSBindingKey', 'SMSBindingSecretKey'. + * \return The value associated with the resource. If the resource is not valid an empty string is returned. + */ + String resource_value_string(SecurityResource resource) const; + + /** + * \brief Populates the data buffer and returns the size of the buffer. + * \param resource With this function, the following resources can return a value: + * 'PublicKey', 'ServerPublicKey', 'Secretkey'. + * \param [OUT]data A copy of the data buffer that contains the value. The caller + * is responsible for freeing this buffer. + * \return The size of the populated buffer. + */ + uint32_t resource_value_buffer(SecurityResource resource, + uint8_t *&data) const; + + /** + * \brief Returns a pointer to the value and size of the buffer. + * \param resource With this function, the following resources can return a value: + * 'PublicKey', 'ServerPublicKey', 'Secretkey'. + * \param [OUT]data A pointer to the data buffer that contains the value. + * \return The size of the populated buffer. + */ + uint32_t resource_value_buffer(SecurityResource resource, + const uint8_t *&data) const; + + /** + * \brief Returns the value of a given resource name, in integer format. + * \param resource With this function, the following resources can return a value: + * 'BootstrapServer', 'SecurityMode', 'SMSSecurityMode', + * 'M2MServerSMSNumber', 'ShortServerID', 'ClientHoldOffTime'. + * \return The value associated with the resource. If the resource is not valid 0 is returned. + */ + uint32_t resource_value_int(SecurityResource resource) const; + + + /** + * \brief Returns whether a resource instance with a given resource enum exists or not + * \param resource Resource enum. + * \return True if at least one instance exists, else false. + */ + bool is_resource_present(SecurityResource resource)const; + + /** + * \brief Returns the total number of resources for a security object. + * \return The total number of resources. + */ + uint16_t total_resource_count()const; + + /** + * \brief Returns the type of the Security Object. It can be either + * Bootstrap or M2MServer. + * \return ServerType The type of the Security Object. + */ + ServerType server_type() const; + +private: + + M2MResource* get_resource(SecurityResource resource) const; + void clear_resources(); + +private: + + M2MObjectInstance* _server_instance; + ServerType _server_type; + + friend class Test_M2MSecurity; + friend class Test_M2MInterfaceImpl; + friend class Test_M2MConnectionSecurityImpl; + friend class Test_M2MConnectionHandlerPimpl_linux; + friend class Test_M2MConnectionHandlerPimpl_mbed; + friend class Test_M2MConnectionSecurityPimpl; + friend class Test_M2MNsdlInterface; + friend class Test_M2MConnectionHandlerPimpl_classic; +}; + +#endif // M2M_SECURITY_H + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mserver.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_SERVER_H +#define M2M_SERVER_H + +#include "mbed-client/m2mobject.h" + +// FORWARD DECLARATION +class M2MResource; + +/*! \file m2mserver.h + * \brief M2MServer. + * This class represents an interface for the Server Object model of the LWM2M framework. + * It handles the server object and all its corresponding + * resources. + */ + +class M2MServer : public M2MObject +{ + +friend class M2MInterfaceFactory; +friend class M2MNsdlInterface; + +public: + + /** + * \brief Am enum defining all resources associated with + * a Server Object in the LWM2M framework. + */ + typedef enum { + ShortServerID, + Lifetime, + DefaultMinPeriod, + DefaultMaxPeriod, + Disable, + DisableTimeout, + NotificationStorage, + Binding, + RegistrationUpdate + }ServerResource; + +private: + + /** + * \brief Constructor + */ + M2MServer(); + + + // Prevents the use of assignment operator. + M2MServer& operator=( const M2MServer& /*other*/ ); + + // Prevents the use of copy constructor + M2MServer( const M2MServer& /*other*/ ); + +public: + + /** + * \brief Destructor + */ + virtual ~M2MServer(); + + /** + * \brief Creates a new resource for a given resource enum. + * \param resource With this function, a value can be set to the following resources: + * 'ShortServerID','Lifetime','DefaultMinPeriod','DefaultMaxPeriod','DisableTimeout', + * 'NotificationStorage'. + * \param value The value to be set on the resource, in integer format. + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(ServerResource resource, uint32_t value); + + /** + * \brief Creates a new resource for a given resource enum. + * \param resource With this function, the following resources can be created: + * 'Disable', 'RegistrationUpdate' + * \return M2MResource if created successfully, else NULL. + */ + M2MResource* create_resource(ServerResource resource); + + /** + * \brief Deletes the resource with the given resource enum. + * Mandatory resources cannot be deleted. + * \param resource The name of the resource to be deleted. + * \return True if deleted, else false. + */ + bool delete_resource(ServerResource rescource); + + /** + * \brief Sets the value of a given resource enum. + * \param resource With this function, a value can be set on the following resources: + * 'Binding'. + * \param value The value to be set on the resource, in string format. + * \return True if successfully set, else false. + */ + bool set_resource_value(ServerResource resource, + const String &value); + + /** + * \brief Sets the value of a given resource enum. + * \param resource With this function, a value can be set to the following resources: + * 'ShortServerID','Lifetime','DefaultMinPeriod','DefaultMaxPeriod','DisableTimeout', + * 'NotificationStorage'. + * \param value The value to be set on the resource, in integer format. + * \return True if successfully set, else false. + */ + bool set_resource_value(ServerResource resource, + uint32_t value); + /** + * \brief Returns the value of the given resource enum, in string format. + * \param resource With this function, the following resources can return a value: + * 'Binding'. + * \return The value associated with the resource. If the resource is not valid an empty string is returned. + */ + String resource_value_string(ServerResource resource) const; + + /** + * \brief Returns the value of a given resource name, in integer format. + * \param resource With this function, the following resources can return a value: + * 'ShortServerID','Lifetime','DefaultMinPeriod','DefaultMaxPeriod','DisableTimeout', + * 'NotificationStorage' + * \return The value associated with the resource. If the resource is not valid -1 is returned. + */ + uint32_t resource_value_int(ServerResource resource) const; + + /** + * \brief Returns whether the resource instance with the given resource enum exists or not. + * \param resource Resource enum. + * \return True if at least one instance exists, else false. + */ + bool is_resource_present(ServerResource resource)const; + + /** + * \brief Returns the total number of resources for the server object. + * \return The total number of resources. + */ + uint16_t total_resource_count()const; + +private: + + M2MResource* get_resource(ServerResource res) const; + + +private: + + M2MObjectInstance* _server_instance; + + friend class Test_M2MServer; + friend class Test_M2MNsdlInterface; +}; + +#endif // M2M_SERVER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mstring.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_STRING_H +#define M2M_STRING_H + +#include <stddef.h> // size_t +#include <stdint.h> + +class Test_M2MString; + +namespace m2m +{ + +/*! \file m2mstring.h +* \brief A simple C++ string class, used as replacement for std::string. + */ + class String + { + char* p; ///< The data. + size_t allocated_; ///< The allocated memory size (including trailing NULL). + size_t size_; ///< The currently used memory size (excluding trailing NULL). + + public: + typedef size_t size_type; + static const size_type npos; + + String(); + ~String(); + String(const String&); + String(const char*); + String(const char*, size_t); + + String& operator=(const char*); + String& operator=(const String&); + + String& operator+=(const String&); + String& operator+=(const char*); + String& operator+=(char); + void push_back(char); + + bool operator==(const char*) const; + bool operator==(const String&) const; + + void clear(); // Set the string to empty (memory remains reserved). + + size_type size() const { return size_; } ///< size without terminating NULL + size_type length() const { return size_; } ///< as size() + + size_type capacity() const { return allocated_-1; } + + bool empty() const { return size_ == 0; } + + const char* c_str() const { return p; } ///< raw data + + /** Reserve internal string memory so that n characters can be put into the + string (plus 1 for the NULL char). If there is already enough memory, + nothing happens, if not, the memory is realloated to exactly this + amount. + */ + void reserve( size_type n); + + /** Resize string. If n is less than the current size, the string is truncated. + If n is larger, the memory is reallocated to exactly this amount, and + the additional characters are NULL characters. + */ + void resize( size_type n); + + /** Resize string. If n is less than the current size, the string is truncated. + If n is larger, the memory is reallocated to exactly this amount, and + the additional characters are c characters. + */ + void resize( size_type n, char c); + + /// swap contents + void swap( String& ); + + String substr(const size_type pos, size_type length) const; + + // unchecked access: + char& operator[](const size_type i) { return p[i]; } + char operator[](const size_type i) const { return p[i]; } + // checked access: + char at(const size_type i) const; + + /// erase len characters at position pos + String& erase(size_type pos, size_type len); + /// Append n characters of a string + String& append(const char* str, size_type n); + + // Append n characters of a non-zero-terminated string + // (in contrast with other append(), which performs strlen() for the given string). + String& append_raw(const char*, size_type); + + // convert int to ascii and append it to end of string + void append_int(int); + + int compare( size_type pos, size_type len, const String& str ) const; + int compare( size_type pos, size_type len, const char* str ) const; + + int find_last_of(char c) const; + + static uint8_t* convert_integer_to_array(int64_t value, uint8_t &size, uint8_t *array = NULL, uint32_t array_size = 0); + static int64_t convert_array_to_integer(uint8_t *value, uint32_t size); + + private: + // reallocate the internal memory + void new_realloc( size_type n); + char* strdup(const char* other); + + friend class ::Test_M2MString; + + }; + // class + + bool operator<(const String&, const String&); + + void reverse(char s[], uint32_t length); + + uint32_t itoa_c (int64_t n, char s[]); +} // namespace + + +#endif // M2M_STRING_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mstringbuffer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef __STRING_BUFFER_H__ +#define __STRING_BUFFER_H__ + +#include "mbed-client/m2mstringbufferbase.h" + +#include <assert.h> +#include <stddef.h> + +template <int SIZE> +class StringBuffer : private StringBufferBase +{ +public: + /** + * Initialize a empty buffer with zero length and zero content. + */ + inline StringBuffer(); + + // + // This is not implemented on purpose, as the given string may conflict with + // templated size. Otoh, if we used compile time assert, the overflow + // could be prevented at compile time. + // + // inline StringBuffer(const char *initial_string); + + /** + * Verify, if the buffer has still room for given amount of bytes. + * Note: the given size value must include the zero terminator as it is not + * implicitly taken into account for. + */ + bool ensure_space(size_t required_size) const; + + /** + * Append given char to end of string. + * Return false if the buffer would overflow, true otherwise. + */ + bool append(char data); + + /** + * Append given zero terminated string to end of buffer. + * + * Return false if the buffer would overflow, true otherwise. + * + * Note: the whole string, including the zero terminator must fit + * to buffer or the append operation is not done and false is returned. + */ + bool append(const char *data); + + /** + * Append given block of chars to end of buffer. + * + * Return false if the buffer would overflow, true otherwise. + * + * Note: the whole string, including the zero terminator must fit + * to buffer or the append operation is not done and false is returned. + */ + bool append(const char *data, size_t data_len); + + /** + * Convert given uint16_t into string representation and add it to the + * end of buffer. + * + * Note: the whole string, including the zero terminator must fit + * to buffer or the append operation is not done and false is returned. + */ + bool append_int(uint16_t data); + + /** + * Get the amount of bytes added to the buffer. + * + * Note: the size does not include the terminating zero, so this is + * functionally equal to strlen(). + */ + inline size_t get_size() const; + + // API functionality copied from m2mstring: + + // find the index of last occurance of given char in string, or negative if not found + int find_last_of(char search_char) const; + + /** + * Get a read only pointer to the data. + */ + inline const char* c_str() const; + + // Add this only if needed + //inline char* c_str(); +private: + char _buff[SIZE]; +}; + +template <int SIZE> +inline StringBuffer<SIZE>::StringBuffer() +{ + // actually a assert_compile() would be better as this is completely a code problem + assert(SIZE > 0); + + _buff[0] = '\0'; +} + +template <int SIZE> +bool StringBuffer<SIZE>::ensure_space(size_t required_size) const +{ + return StringBufferBase::ensure_space(SIZE, required_size); +} + +template <int SIZE> +bool StringBuffer<SIZE>::append(const char *data) +{ + return StringBufferBase::append(_buff, SIZE, data); +} + +template <int SIZE> +bool StringBuffer<SIZE>::append(const char *data, size_t data_len) +{ + return StringBufferBase::append(_buff, SIZE, data, data_len); +} + +template <int SIZE> +inline bool StringBuffer<SIZE>::append(char data) +{ + return StringBufferBase::append(_buff, SIZE, data); +} + +template <int SIZE> +bool StringBuffer<SIZE>::append_int(uint16_t data) +{ + return StringBufferBase::append_int(_buff, SIZE, data); +} + +template <int SIZE> +int StringBuffer<SIZE>::find_last_of(char search_char) const +{ + return StringBufferBase::find_last_of(_buff, search_char); +} + +template <int SIZE> +inline const char* StringBuffer<SIZE>::c_str() const +{ + return _buff; +} + +template <int SIZE> +inline size_t StringBuffer<SIZE>::get_size() const +{ + return _curr_size; +} + +#endif // !__STRING_BUFFER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mstringbufferbase.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef __STRING_BUFFER_BASE_H__ +#define __STRING_BUFFER_BASE_H__ + +#include <stdint.h> +#include <stddef.h> + +class StringBufferBase +{ +protected: + + // inline version of this produces smaller code + inline StringBufferBase(); + + // all the docs are at template level, as it is the only public API + + bool ensure_space(size_t max_size, size_t required_size) const; + + bool append(char *buff, size_t max_size, char data); + + bool append(char *buff, size_t max_size, const char *data); + + bool append(char *buff, size_t max_size, const char *data, size_t data_len); + + bool append_int(char *buff, size_t max_size, uint16_t data); + + int find_last_of(const char *buff, char search_char) const; + +protected: + //const size_t _max_size; + size_t _curr_size; +}; + +inline StringBufferBase::StringBufferBase() : _curr_size(0) +{ +} + +#endif // !__STRING_BUFFER_BASE_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mtimer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TIMER_H +#define M2M_TIMER_H + +#include <stdint.h> +#include "mbed-client/m2mtimerobserver.h" + +class M2MTimerPimpl; + +/*! \file m2mtimer.h +* \brief M2MTimer. +* Timer class for mbed client. +*/ +class M2MTimer +{ +private: + // Prevents the use of assignment operator + M2MTimer& operator=(const M2MTimer& other); + + // Prevents the use of copy constructor + M2MTimer(const M2MTimer& other); + +public: + + /** + * Constructor. + */ + M2MTimer(M2MTimerObserver& observer); + + /** + * Destructor. + */ + ~M2MTimer(); + + /** + * \brief Starts the timer. + * \param interval The timer interval in milliseconds. + * \param single_shot Defines whether the timer is ticked once or restarted every time at expiry. + */ + void start_timer(uint64_t interval, M2MTimerObserver::Type type, bool single_shot = true); + + /** + * \brief Starts the timer in DTLS manner. + * \param intermediate_interval The intermediate interval to use, must be smaller than total (usually 1/4 of total). + * \param total_interval The total interval to use; This is the timeout value of a DTLS packet. + * \param type The type of the timer. + */ + void start_dtls_timer(uint64_t intermediate_interval, uint64_t total_interval, M2MTimerObserver::Type type = M2MTimerObserver::Dtls); + + /** + * \brief Stops the timer. + * This cancels the ongoing timer. + */ + void stop_timer(); + + /** + * \brief Checks if the intermediate interval has passed. + * \return True if the interval has passed, else false. + */ + bool is_intermediate_interval_passed(); + + /** + * \brief Checks if the total interval has passed. + * \return True if the interval has passed, else false. + */ + bool is_total_interval_passed(); + +private: + + M2MTimerObserver& _observer; + M2MTimerPimpl *_private_impl; + friend class Test_M2MTimerImpl_linux; +}; + +#endif // M2M_TIMER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mtimerobserver.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TIMER_OBSERVER_H +#define M2M_TIMER_OBSERVER_H + +/*! \file m2mtimerobserver.h + * \brief M2MTimerObserver. + * Observer class for indicating the timer expiry to the parent class. + */ +class M2MTimerObserver +{ +public: + /** + * \enum Defines the types of timer + * that can be created for mbed Client. + */ + typedef enum { + Notdefined, + Registration, + NsdlExecution, + PMinTimer, + PMaxTimer, + Dtls, + QueueSleep, + RetryTimer, + BootstrapTimer + }Type; + + /** + * \brief Indicates that the timer has expired. + * \param type The type of the timer that has expired. + */ + virtual void timer_expired(M2MTimerObserver::Type type = + M2MTimerObserver::Notdefined) = 0; +}; + +#endif // M2M_TIMER_OBSERVER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed-client/m2mvector.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2015-2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef M2M_VECTOR_H +#define M2M_VECTOR_H + +/*! \file m2mvector.h +* \brief A simple C++ Vector class, used as replacement for std::vector. +*/ + + +namespace m2m +{ + +template <typename ObjectTemplate> + +class Vector +{ + public: + explicit Vector( int init_size = MIN_CAPACITY) + : _size(0), + _capacity((init_size >= MIN_CAPACITY) ? init_size : MIN_CAPACITY) { + _object_template = new ObjectTemplate[ _capacity ]; + } + + Vector(const Vector & rhs ): _object_template(0) { + operator=(rhs); + } + + ~Vector() { + delete [] _object_template; + } + + const Vector & operator=(const Vector & rhs) { + if(this != &rhs) { + delete[] _object_template; + _size = rhs.size(); + _capacity = rhs._capacity; + + _object_template = new ObjectTemplate[capacity()]; + for(int k = 0; k < size(); k++) { + _object_template[k] = rhs._object_template[k]; + } + } + return *this; + } + + void resize(int new_size) { + if(new_size > _capacity) { + reserve(new_size * 2 + 1); + } + _size = new_size; + } + + void reserve(int new_capacity) { + if(new_capacity < _size) { + return; + } + ObjectTemplate *old_array = _object_template; + + _object_template = new ObjectTemplate[new_capacity]; + for(int k = 0; k < _size; k++) { + _object_template[k] = old_array[k]; + } + _capacity = new_capacity; + delete [] old_array; + } + + ObjectTemplate & operator[](int idx) { + return _object_template[idx]; + } + + const ObjectTemplate& operator[](int idx) const { + return _object_template[idx]; + } + + bool empty() const{ + return size() == 0; + } + + int size() const { + return _size; + } + + int capacity() const { + return _capacity; + } + + void push_back(const ObjectTemplate& x) { + if(_size == _capacity) { + reserve(2 * _capacity + 1); + } + _object_template[_size] = x; + _size++; + } + + void pop_back() { + _size--; + } + + void clear() { + _size = 0; + } + + const ObjectTemplate& back() const { + return _object_template[_size - 1]; + } + + typedef ObjectTemplate* iterator; + typedef const ObjectTemplate* const_iterator; + + iterator begin() { + return &_object_template[0]; + } + + const_iterator begin() const { + return &_object_template[0]; + } + + iterator end() { + return &_object_template[_size]; + } + + const_iterator end() const { + return &_object_template[_size]; + } + + void erase(int position) { + if(position < _size) { + _object_template[position] = 0; + for(int k = position; k + 1 < _size; k++) { + _object_template[k] = _object_template[k + 1]; + } + _size--; + } + } + + enum { + MIN_CAPACITY = 1 + }; + + private: + int _size; + int _capacity; + ObjectTemplate* _object_template; +}; + +} // namespace + +#endif // M2M_VECTOR_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mbed_lib.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,20 @@ +{ + "name": "mbed-client", + "config": { + "event-loop-size": 1024, + "reconnection-count": 3, + "reconnection-interval": 5, + "tcp-keepalive-time": 300, + "disable-bootstrap-feature": null, + "coap-disable-obs-feature":null, + "reconnection-loop": 1, + "sn-coap-max-blockwise-payload-size" : 0, + "sn-coap-duplication-max-msgs-count": null, + "sn-coap-max-incoming-message-size": null, + "sn-coap-resending-queue-size-msgs": null, + "sn-coap-resending-queue-size-bytes": null + }, + "macros" : [ + "MBED_CLIENT_C_NEW_API" + ] +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/mkdocs.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,17 @@ +site_name: ARM mbed Client Guide +theme: readthedocs +use directory_urls: false +pages: +- ['index.md','ARM mbed Client Guide'] +- ['Introduction.md','Introduction to mbed Client'] +- ['client_reg_dereg.md','Features','Client Registration'] +- ['dev_man_serv_enable.md','Features','Device Management and Service Enablement'] +- ['info_reporting.md','Features','Information Reporting'] +- ['data_types.md','Data types'] +- ['Howto.md','Quick start guide for using mbed Client API'] +- ['porting-guide.md','Porting mbed Client'] +- ['further-reading.md','mbed Device Connector service'] + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/module.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,23 @@ +{ + "name": "mbed-client", + "version": "2.0.2", + "description": "mbed Client C++ API", + "keywords": [], + "author": "Yogesh Pande <yogesh.pande@arm.com>", + "homepage": "https://github.com/ARMmbed/mbed-client", + "license": "Apache-2.0", + "dependencies": { + "mbed-client-c": "^4.0.0", + "mbed-trace": ">=0.2.0,<2.0.0" + }, + "targetDependencies": { + "arm": { + "mbed-client-mbed-os": "^3.0.0", + "mbed-client-mbedtls": "^3.0.0" + }, + "linux": { + "mbed-client-linux": "^3.0.0", + "mbed-client-mbedtls": "^3.0.0" + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/run_unit_tests.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,66 @@ +#!/bin/bash +# Copyright (c) 2015 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. + +echo +echo "Build mbed Client API unit tests" +echo +yt target x86-linux-native-coverage +yt clean +yt build +yt test --no-build -- -ojunit +echo +echo Create results +echo +rm -rf results +rm -rf coverage +mkdir results +mkdir coverage + +find ./build -name '*.xml' | xargs cp -t ./results/ +find ./build/x86-linux-native-coverage/test -name '*.gcno' | xargs cp -t ./coverage/ +find ./build/x86-linux-native-coverage/test -name '*.gcda' | xargs cp -t ./coverage/ +touch coverage/*.gcda +exclude_files="${PWD}/test/" +gcovr -r ./ --gcov-filter='.*source*.' --exclude-unreachable-branches --exclude $exclude_files --object-directory ./coverage -x -o ./results/gcovr.xml +echo +echo "Create coverage document" +echo +lcov -b ./ -d ./coverage -c -o ./coverage/app.info +lcov -q -r ./coverage/app.info "/test/mbedclient/*" -o ./coverage/app.info +lcov -q -r ./coverage/app.info "/usr*" -o ./coverage/app.info +genhtml -q --no-branch-coverage --function-coverage --demangle-cpp --title "mbed Client coverage" ./coverage/app.info -o ./coverage +rm -f ./coverage/*.gcno +rm -f ./coverage/*.gcda +echo +echo "Creating report" +echo +echo '<?xml version="1.0" encoding="UTF-8" ?> +<?xml-stylesheet type="text/xsl" href="junit_xsl.xslt"?> +<list>' >> index.xml + +for f in results/*.xml +do +name=${f##*/} +echo '<entry name="results/'"$name"'" />'>> index.xml +done + +echo '</list>' >> index.xml + +echo +echo "Report created to index.xml (outputs html)" +echo +xsltproc -o results/testresults.html junit_xsl.xslt index.xml +rm -f index.xml +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/run_unit_tests_with_valgrind.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,13 @@ +#!/bin/bash +# Execute script with root path where to find binaries. +# For example ./run_unit_tests_with_valgrind.sh ./build/x86-linux-native-coverage/test/mbedclient/ + +input="binaries.txt" +valgrind_logs="valgrind_logs" +rm -rf $valgrind_logs +mkdir $valgrind_logs +find $1 -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print > $input +while file= read -r binary +do + valgrind --track-origins=yes --xml=yes --xml-file="${valgrind_logs}/valgrind_$(basename $binary).xml" "$binary" +done < "$input"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/eventdata.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef EVENT_DATA_H +#define EVENT_DATA_H + +#include "mbed-client/m2mvector.h" + +//FORWARD DECLARATION +class M2MObject; + + +typedef Vector<M2MObject *> M2MObjectList; + +class M2MSecurity; + +class EventData +{ +public: + virtual ~EventData() {} +}; + +class M2MSecurityData : public EventData +{ +public: + M2MSecurityData() + :_object(NULL){} + virtual ~M2MSecurityData() {} + M2MSecurity *_object; +}; + +class ResolvedAddressData : public EventData +{ +public: + ResolvedAddressData() + :_address(NULL), + _port(0){} + virtual ~ResolvedAddressData() {} + const M2MConnectionObserver::SocketAddress *_address; + uint16_t _port; +}; + +class ReceivedData : public EventData +{ +public: + ReceivedData() + :_data(NULL), + _size(0), + _port(0), + _address(NULL){} + virtual ~ReceivedData() {} + uint8_t *_data; + uint16_t _size; + uint16_t _port; + const M2MConnectionObserver::SocketAddress *_address; +}; + +class M2MRegisterData : public EventData +{ +public: + M2MRegisterData() + :_object(NULL){} + virtual ~M2MRegisterData() {} + M2MSecurity *_object; + M2MObjectList _object_list; +}; + +class M2MUpdateRegisterData : public EventData +{ +public: + M2MUpdateRegisterData() + :_object(NULL), + _lifetime(0){} + virtual ~M2MUpdateRegisterData() {} + M2MSecurity *_object; + uint32_t _lifetime; + M2MObjectList _object_list; +}; + + +#endif //EVENT_DATA_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/m2minterfaceimpl.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_INTERFACE_IMPL_H +#define M2M_INTERFACE_IMPL_H + +#include "mbed-client/m2minterface.h" +#include "mbed-client/m2mserver.h" +#include "mbed-client/m2mconnectionobserver.h" +#include "mbed-client/m2mconnectionsecurity.h" +#include "include/m2mnsdlobserver.h" +#include "include/m2mnsdlinterface.h" +#include "mbed-client/m2mtimerobserver.h" +#include "mbed-client/m2mtimer.h" +#include "mbed-client/m2mconnectionhandler.h" + +//FORWARD DECLARATION +class M2MConnectionSecurity; +class EventData; +class M2MUpdateRegisterData; +/** + * @brief M2MInterfaceImpl. + * This class implements handling of all mbed Client Interface operations + * defined in OMA LWM2M specifications. + * This includes Bootstrapping, Client Registration, Device Management & + * Service Enablement and Information Reporting. + */ + +class M2MInterfaceImpl : public M2MInterface, + public M2MNsdlObserver, + public M2MConnectionObserver, + public M2MTimerObserver +{ +private: + // Prevents the use of assignment operator by accident. + M2MInterfaceImpl& operator=( const M2MInterfaceImpl& /*other*/ ); + + // Prevents the use of copy constructor by accident + M2MInterfaceImpl( const M2MInterfaceImpl& /*other*/ ); + +friend class M2MInterfaceFactory; + +private: + + /** + * @brief Constructor + * @param observer, Observer to pass the event callbacks for various + * interface operations. + * @param endpoint_name Endpoint name of the client. + * @param endpoint_type Endpoint type of the client. + * @param life_time Life time of the client in seconds + * @param listen_port Listening port for the endpoint, default is 8000. + * @param domain Domain of the client. + * @param mode Binding mode of the client, default is UDP + * @param stack Network stack to be used for connection, default is LwIP_IPv4. + * @param context_address Context address, default is empty. + */ + M2MInterfaceImpl(M2MInterfaceObserver& observer, + const String &endpoint_name, + const String &endpoint_type, + const int32_t life_time, + const uint16_t listen_port, + const String &domain = "", + BindingMode mode = M2MInterface::NOT_SET, + M2MInterface::NetworkStack stack = M2MInterface::LwIP_IPv4, + const String &context_address = ""); + +public: + + /** + * @brief Destructor + */ + virtual ~M2MInterfaceImpl(); + + /** + * @brief Initiates bootstrapping of the client with the provided Bootstrap + * server information. + * @param security_object Security object which contains information + * required for successful bootstrapping of the client. + */ + virtual void bootstrap(M2MSecurity *security); + + /** + * @brief Cancels on going bootstrapping operation of the client. If the client has + * already successfully bootstrapped then this function deletes existing + * bootstrap information from the client. + */ + virtual void cancel_bootstrap(); + + /** + * @brief Initiates registration of the provided Security object to the + * corresponding LWM2M server. + * @param security_object Security object which contains information + * required for registering to the LWM2M server. + * If client wants to register to multiple LWM2M servers then it has call + * this function once for each of LWM2M server object separately. + * @param object_list Objects which contains information + * which the client want to register to the LWM2M server. + */ + virtual void register_object(M2MSecurity *security_object, const M2MObjectList &object_list); + + /** + * @brief Updates or refreshes the client's registration on the LWM2M + * server. + * @param security_object Security object from which the device object + * needs to update registration, if there is only one LWM2M server registered + * then this parameter can be NULL. + * @param lifetime Lifetime for the endpoint client in seconds. + */ + virtual void update_registration(M2MSecurity *security_object, const uint32_t lifetime = 0); + + /** + * @brief Updates or refreshes the client's registration on the LWM2M + * server. Use this function to publish new objects to LWM2M server. + * @param security_object The security object from which the device object + * needs to update the registration. If there is only one LWM2M server registered, + * this parameter can be NULL. + * @param object_list Objects that contain information about the + * client attempting to register to the LWM2M server. + * @param lifetime The lifetime of the endpoint client in seconds. If the same value + * has to be passed, set the default value to 0. + */ + virtual void update_registration(M2MSecurity *security_object, const M2MObjectList &object_list, + const uint32_t lifetime = 0); + + /** + * @brief Unregisters the registered object from the LWM2M server + * @param security_object Security object from which the device object + * needs to be unregistered. If there is only one LWM2M server registered + * this parameter can be NULL. + */ + virtual void unregister_object(M2MSecurity* security = NULL); + + /** + * @brief Sets the function which will be called indicating client + * is going to sleep when the Binding mode is selected with Queue mode. + * @param callback A function pointer that will be called when client + * goes to sleep. + */ + virtual void set_queue_sleep_handler(callback_handler handler); + + /** + * @brief Sets the network interface handler that is used by client to connect + * to a network over IP. + * @param handler A network interface handler that is used by client to connect. + * This API is optional but provides a mechanism for different platforms to + * manage usage of underlying network interface by client. + */ + virtual void set_platform_network_handler(void *handler = NULL); + + /** + * \brief Sets the function callback that will be called by mbed-client for + * fetching random number from application for ensuring strong entropy. + * \param random_callback A function pointer that will be called by mbed-client + * while performing secure handshake. + * Function signature should be uint32_t (*random_number_callback)(void); + */ + virtual void set_random_number_callback(random_number_cb callback); + + /** + * \brief Sets the function callback that will be called by mbed-client for + * providing entropy source from application for ensuring strong entropy. + * \param entropy_callback A function pointer that will be called by mbed-client + * while performing secure handshake. + * Function signature , if using mbed-client-mbedtls should be + * int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, + * size_t len, size_t *olen); + */ + virtual void set_entropy_callback(entropy_cb callback); + + +protected: // From M2MNsdlObserver + + virtual void coap_message_ready(uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr); + + virtual void client_registered(M2MServer *server_object); + + virtual void registration_updated(const M2MServer &server_object); + + virtual void registration_error(uint8_t error_code, bool retry = false); + + virtual void client_unregistered(); + + virtual void bootstrap_done(M2MSecurity *security_object); + + virtual void bootstrap_wait(M2MSecurity *security_object); + + virtual void bootstrap_error(); + + virtual void coap_data_processed(); + + virtual void value_updated(M2MBase *base); + +protected: // From M2MConnectionObserver + + virtual void data_available(uint8_t* data, + uint16_t data_size, + const M2MConnectionObserver::SocketAddress &address); + + virtual void socket_error(uint8_t error_code, bool retry = true); + + virtual void address_ready(const M2MConnectionObserver::SocketAddress &address, + M2MConnectionObserver::ServerType server_type, + const uint16_t server_port); + + virtual void data_sent(); + +protected: // from M2MTimerObserver + + virtual void timer_expired(M2MTimerObserver::Type type); + + +private: // state machine state functions + + /** + * When the state is Idle. + */ + void state_idle(EventData* data); + + /** + * When the client starts bootstrap. + */ + void state_bootstrap( EventData *data); + + /** + * When the bootstrap server address is resolved. + */ + void state_bootstrap_address_resolved( EventData *data); + + /** + * When the bootstrap resource is created. + */ + void state_bootstrap_resource_created( EventData *data); + + /** + * When the server has sent response and bootstrapping is done. + */ + void state_bootstrapped( EventData *data); + + /** + * When the client starts register. + */ + void state_register( EventData *data); + + /** + * When the server address for register is resolved. + */ + void state_register_address_resolved( EventData *data); + + /** + * When the client is registered. + */ + void state_registered( EventData *data); + + /** + * When the client is updating registration. + */ + void state_update_registration( EventData *data); + + /** + * When the client starts unregister. + */ + void state_unregister( EventData *data); + + /** + * When the client has been unregistered. + */ + void state_unregistered( EventData *data); + + /** + * When the coap data is been sent through socket. + */ + void state_sending_coap_data( EventData *data); + + /** + * When the coap data is sent successfully. + */ + void state_coap_data_sent( EventData *data); + + /** + * When the socket is receiving coap data. + */ + void state_receiving_coap_data( EventData *data); + + /** + * When the socket has received coap data. + */ + void state_coap_data_received( EventData *data); + + /** + * When the coap message is being processed. + */ + void state_processing_coap_data( EventData *data); + + /** + * When the coap message has been processed. + */ + void state_coap_data_processed( EventData *data); + + /** + * When the client is waiting to receive or send data. + */ + void state_waiting( EventData *data); + + /** + * Start registration update. + */ + void start_register_update(M2MUpdateRegisterData *data); + + /** + * State enumeration order must match the order of state + * method entries in the state map + */ + enum E_States { + STATE_IDLE = 0, + STATE_BOOTSTRAP, + STATE_BOOTSTRAP_ADDRESS_RESOLVED, + STATE_BOOTSTRAP_RESOURCE_CREATED, + STATE_BOOTSTRAP_WAIT, + STATE_BOOTSTRAPPED, //5 + STATE_REGISTER, + STATE_REGISTER_ADDRESS_RESOLVED, + STATE_REGISTERED, + STATE_UPDATE_REGISTRATION, + STATE_UNREGISTER, //10 + STATE_UNREGISTERED, + STATE_SENDING_COAP_DATA, + STATE_COAP_DATA_SENT, + STATE_COAP_DATA_RECEIVED, + STATE_PROCESSING_COAP_DATA, //15 + STATE_COAP_DATA_PROCESSED, + STATE_WAITING, + STATE_MAX_STATES + }; + + /** + * @brief Redirects the state machine to right function. + * @param current_state Current state to be set. + * @param data Data to be passed to the state function. + */ + void state_function( uint8_t current_state, EventData* data ); + + /** + * @brief State Engine maintaining state machine logic. + */ + void state_engine(void); + + /** + * External event which can trigger the state machine. + * @param New The state to which the state machine should go. + * @param data The data to be passed to the state machine. + */ + void external_event(uint8_t, EventData* = NULL); + + /** + * Internal event generated by state machine. + * @param New State which the state machine should go to. + * @param data The data to be passed to the state machine. + */ + void internal_event(uint8_t, EventData* = NULL); + + enum + { + EVENT_IGNORED = 0xFE, + CANNOT_HAPPEN + }; + + /** + * Helper method for extracting the IP address part and port from the + * given server address. + * @param server_address Source URL (without "coap" or "coaps" prefix). + * @param ip_address The extracted IP. + * @param port The extracted port. + */ + static void process_address(const String& server_address, String& ip_address, uint16_t& port); + +private: + + EventData *_event_data; + M2MTimer *_bootstrap_timer; + uint16_t _server_port; + uint16_t _listen_port; + String _endpoint_type; + String _domain; + int32_t _life_time; + String _context_address; + String _server_ip_address; + M2MSecurity *_register_server; //TODO: to be the list not owned + M2MTimer _queue_sleep_timer; + M2MTimer _retry_timer; + callback_handler _callback_handler; + const uint8_t _max_states; + bool _event_ignored; + bool _event_generated; + bool _reconnecting; + bool _retry_timer_expired; + bool _bootstrapped; + uint8_t _current_state; + uint8_t _retry_count; + BindingMode _binding_mode; + M2MInterfaceObserver &_observer; + M2MConnectionSecurity *_security_connection; // Doesn't own + M2MConnectionHandler _connection_handler; + M2MNsdlInterface _nsdl_interface; + M2MSecurity *_security; + + friend class Test_M2MInterfaceImpl; + +}; + +#define BEGIN_TRANSITION_MAP \ + static const uint8_t TRANSITIONS[] = {\ + +#define TRANSITION_MAP_ENTRY(entry)\ + entry, + +#define END_TRANSITION_MAP(data) \ + 0 };\ + external_event(TRANSITIONS[_current_state], data); + +#endif //M2M_INTERFACE_IMPL_H + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/m2mnsdlinterface.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2MNSDLINTERFACE_H +#define M2MNSDLINTERFACE_H + +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mconfig.h" +#include "mbed-client/m2minterface.h" +#include "mbed-client/m2mtimerobserver.h" +#include "mbed-client/m2mobservationhandler.h" +#include "mbed-client/m2mbase.h" +#include "mbed-client/m2mserver.h" +#include "include/nsdllinker.h" + +//FORWARD DECLARARTION +class M2MSecurity; +class M2MObject; +class M2MObjectInstance; +class M2MResource; +class M2MResourceInstance; +class M2MNsdlObserver; +class M2MServer; +class M2MTimer; + +typedef Vector<M2MObject *> M2MObjectList; + +/** + * @brief M2MNsdlInterface + * Class which interacts between mbed Client C++ Library and mbed-client-c library. + */ +class M2MNsdlInterface : public M2MTimerObserver, + public M2MObservationHandler +{ +private: + // Prevents the use of assignment operator by accident. + M2MNsdlInterface& operator=( const M2MNsdlInterface& /*other*/ ); + + // Prevents the use of copy constructor by accident + M2MNsdlInterface( const M2MNsdlInterface& /*other*/ ); + +public: + /** + * @brief Constructor + * @param observer, Observer to pass the event callbacks from nsdl library. + */ + M2MNsdlInterface(M2MNsdlObserver &observer); + + /** + * @brief Destructor + */ + virtual ~M2MNsdlInterface(); + + /** + * @brief Creates endpoint object for the nsdl stack. + * @param endpoint_name, Endpoint name of the client. + * @param endpoint_type, Endpoint type of the client. + * @param life_time, Life time of the client in seconds + * @param domain, Domain of the client. + * @param mode, Binding mode of the client, default is UDP + * @param context_address, Context address default is empty. + */ + void create_endpoint(const String &endpoint_name, + const String &endpoint_type, + const int32_t life_time, + const String &domain, + const uint8_t mode, + const String &context_address); + + /** + * @brief Deletes the endpoint. + */ + void delete_endpoint(); + + /** + * @brief Creates the NSDL structure for the registered objectlist. + * @param object_list, List of objects to be registered. + * @return true if structure created successfully else false. + */ + bool create_nsdl_list_structure(const M2MObjectList &object_list); + + /** + * @brief Removed the NSDL resource for the given resource. + * @param base, Resource to be removed. + * @return true if removed successfully else false. + */ + bool remove_nsdl_resource(M2MBase *base); + + /** + * @brief Creates the bootstrap object. + * @param address Bootstrap address. + * @return true if created and sent successfully else false. + */ + bool create_bootstrap_resource(sn_nsdl_addr_s *address, const String &bootstrap_endpoint_name); + + /** + * @brief Sends the register message to the server. + * @param address M2MServer address. + * @param address_length M2MServer address length. + * @param port M2MServer port. + * @param address_type IP Address type. + * @return true if register sent successfully else false. + */ + bool send_register_message(uint8_t* address, + uint8_t address_length, + const uint16_t port, + sn_nsdl_addr_type_e address_type); + + /** + * @brief Sends the update registration message to the server. + * @param lifetime, Updated lifetime value in seconds. + * @return true if sent successfully else false. + * + */ + bool send_update_registration(const uint32_t lifetime = 0); + + /** + * @brief Sends unregister message to the server. + * @return true if unregister sent successfully else false. + */ + bool send_unregister_message(); + + /** + * @brief Memory Allocation required for libCoap. + * @param size, Size of memory to be reserved. + */ + static void* memory_alloc(uint16_t size); + + /** + * @brief Memory free functions required for libCoap + * @param ptr, Object whose memory needs to be freed. + */ + static void memory_free(void *ptr); + + /** + * @brief Callback from nsdl library to inform the data is ready + * to be sent to server. + * @param nsdl_handle, Handler for the nsdl structure for this endpoint + * @param protocol, Protocol format of the data + * @param data, Data to be sent. + * @param data_len, Size of the data to be sent + * @param address, server address where data has to be sent. + * @return 1 if successful else 0. + */ + uint8_t send_to_server_callback(struct nsdl_s * nsdl_handle, + sn_nsdl_capab_e protocol, + uint8_t *data, + uint16_t data_len, + sn_nsdl_addr_s *address); + + /** + * @brief Callback from nsdl library to inform the data which is + * received from server for the client has been converted to coap message. + * @param nsdl_handle, Handler for the nsdl structure for this endpoint + * @param coap_header, Coap message formed from data. + * @param address, Server address from where the data is received. + * @return 1 if successful else 0. + */ + uint8_t received_from_server_callback(struct nsdl_s * nsdl_handle, + sn_coap_hdr_s *coap_header, + sn_nsdl_addr_s *address); + + /** + * @brief Callback from nsdl library to inform the data which is + * received from server for the resources has been converted to coap message. + * @param nsdl_handle, Handler for the nsdl resource structure for this endpoint.. + * @param coap_header, Coap message formed from data. + * @param address, Server address from where the data is received. + * @param nsdl_capab, Protocol for the message, currently only coap is supported. + * @return 1 if successful else 0. + */ + uint8_t resource_callback(struct nsdl_s *nsdl_handle, sn_coap_hdr_s *coap, + sn_nsdl_addr_s *address, + sn_nsdl_capab_e nsdl_capab); + + /** + * @brief Callback when there is data received from server and needs to be processed. + * @param data, data received from server. + * @param data_size, data size received from server. + * @param addres, address structure of the server. + * @return true if successfully processed else false. + */ + bool process_received_data(uint8_t *data, + uint16_t data_size, + sn_nsdl_addr_s *address); + + /** + * @brief Stops all the timers in case there is any errors. + */ + void stop_timers(); + + /** + * @brief Returns nsdl handle. + * @return ndsl handle + */ + nsdl_s* get_nsdl_handle(); + + /** + * @brief Get endpoint name + * @return endpoint name + */ + const String& endpoint_name() const; + +protected: // from M2MTimerObserver + + virtual void timer_expired(M2MTimerObserver::Type type); + +protected: // from M2MObservationHandler + + virtual void observation_to_be_sent(M2MBase *object, + uint16_t obs_number, + m2m::Vector<uint16_t> changed_instance_ids, + bool send_object = false); + + virtual void resource_to_be_deleted(M2MBase* base); + + virtual void value_updated(M2MBase *base, const String &object_name); + + virtual void remove_object(M2MBase *object); + + virtual void send_delayed_response(M2MBase *base); + +private: + + /** + * @brief Initializes all the nsdl library component to be usable. + * @return true if initialization is successful else false. + */ + bool initialize(); + + bool add_object_to_list(M2MObject *object); + + bool create_nsdl_object_structure(M2MObject *object); + + bool create_nsdl_object_instance_structure(M2MObjectInstance *object_instance); + + bool create_nsdl_resource_structure(M2MResource *resource, + bool multiple_instances = false); + + bool create_nsdl_resource(M2MBase *base); + + String coap_to_string(uint8_t *coap_data_ptr, + int coap_data_ptr_length); + + void execute_nsdl_process_loop(); + + uint64_t registration_time(); + + M2MBase* find_resource(const String &object, + uint8_t *token = NULL, + uint8_t token_len = 0); + + M2MBase* find_resource(const M2MObject *object, + const String &object_instance, + uint8_t *token = NULL, + uint8_t token_len = 0); + + M2MBase* find_resource(const M2MObjectInstance *object_instance, + const String &resource_instance, + uint8_t *token = NULL, + uint8_t token_len = 0); + + M2MBase* find_resource(const M2MResource *resource, + const String &object_name, + const String &resource_instance, + uint8_t *token = NULL, + uint8_t token_len = 0); + + bool object_present(M2MObject * object) const; + + M2MInterface::Error interface_error(sn_coap_hdr_s *coap_header); + + void send_object_observation(M2MObject *object, + uint16_t obs_number, + m2m::Vector<uint16_t> changed_instance_ids, + bool send_object); + + void send_object_instance_observation(M2MObjectInstance *object_instance, + uint16_t obs_number); + + void send_resource_observation(M2MResource *resource, uint16_t obs_number); + + void send_notification(uint8_t *token, + uint8_t token_length, + uint8_t *value, + uint32_t value_length, + uint16_t observation, + uint32_t max_age, + uint8_t coap_content_type); + + /** + * @brief Allocate (size + 1) amount of memory, copy size bytes into + * it and add zero termination. + * @param source Source string to copy, may not be NULL. + * @param size The size of memory to be reserved. + */ + static uint8_t* alloc_string_copy(const uint8_t* source, uint16_t size); + + /** + * @brief Utility method to convert given lifetime int to ascii + * and allocate a buffer for it and set it to _endpoint->lifetime_ptr. + * @param lifetime A new value for lifetime. + */ + void set_endpoint_lifetime_buffer(int lifetime); + + /** + * @brief Handle incoming bootstrap PUT message. + * @param coap_header, Received CoAP message + * @param address, Server address + */ + void handle_bootstrap_put_message(sn_coap_hdr_s *coap_header, sn_nsdl_addr_s *address); + + /** + * @brief Handle bootstrap finished message. + * @param coap_header, Received CoAP message + * @param address, Server address + */ + void handle_bootstrap_finished(sn_coap_hdr_s *coap_header,sn_nsdl_addr_s *address); + + /** + * @brief Handle bootstrap delete message. + * @param coap_header, Received CoAP message + * @param address, Server address + */ + void handle_bootstrap_delete(sn_coap_hdr_s *coap_header,sn_nsdl_addr_s *address); + + /** + * @brief Parse bootstrap TLV message. + * @param coap_header, Received CoAP message + * @return True if parsing was succesful else false + */ + bool parse_bootstrap_message(sn_coap_hdr_s *coap_header, bool is_security_object); + + /** + * @brief Parse bootstrap TLV message. + * @param coap_header, Received CoAP message + * @return True if parsing was succesful else false + */ + bool validate_security_object(); + + /** + * @brief Handle bootstrap errors. + */ + void handle_bootstrap_error(); + +private: + + M2MNsdlObserver &_observer; + M2MObjectList _object_list; + sn_nsdl_ep_parameters_s *_endpoint; + nsdl_s *_nsdl_handle; + M2MSecurity *_security; // Not owned + M2MServer _server; + M2MTimer *_nsdl_exceution_timer; + M2MTimer *_registration_timer; + sn_nsdl_addr_s _sn_nsdl_address; + String _endpoint_name; + uint32_t _counter_for_nsdl; + uint16_t _bootstrap_id; + bool _unregister_ongoing; + bool _identity_accepted; + +friend class Test_M2MNsdlInterface; + +}; + +#endif // M2MNSDLINTERFACE_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/m2mnsdlobserver.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_NSDL_OBSERVER_H +#define M2M_NSDL_OBSERVER_H + +#include "include/nsdllinker.h" + +//FORWARD DECLARATION +class M2MSecurity; +class M2MServer; + +/** + * @brief Observer class for informing NSDL callback to the state machine + */ + +class M2MNsdlObserver +{ + +public : + + /** + * @brief Informs that coap message is ready. + * @param data_ptr, Data object of coap message. + * @param data_len, Length of the data object. + * @param address_ptr, Address structure of the server. + */ + virtual void coap_message_ready(uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr) = 0; + + /** + * @brief Informs that client is registered successfully. + * @param server_object, Server object associated with + * registered server. + */ + virtual void client_registered(M2MServer *server_object) = 0; + + /** + * @brief Informs that client registration is updated successfully. + * @param server_object, Server object associated with + * registered server. + */ + virtual void registration_updated(const M2MServer &server_object) = 0; + + /** + * @brief Informs that some error occured during + * registration. + * @param error_code, Error code for registration error + * @param retry, Indicates state machine to re-establish connection + */ + virtual void registration_error(uint8_t error_code, bool retry = false) = 0; + + /** + * @brief Informs that client is unregistered successfully. + */ + virtual void client_unregistered() = 0; + + /** + * @brief Informs that client bootstrapping is done. + * @param security_object, M2MSecurity Object which contains information about + * LWM2M server fetched from bootstrap server. + */ + virtual void bootstrap_done(M2MSecurity *security_object) = 0; + + /** + * @brief Informs that client bootstrapping is waiting for message to be sent. + * @param security_object, M2MSecurity Object which contains information about + * LWM2M server fetched from bootstrap server. + */ + virtual void bootstrap_wait(M2MSecurity *security_object) = 0; + + /** + * @brief Informs that some error occured during + * bootstrapping. + */ + virtual void bootstrap_error() = 0; + + /** + * @brief Informs that received data has been processed. + */ + virtual void coap_data_processed() = 0; + + /** + * @brief Callback informing that the value of the resource object is updated by server. + * @param base Object whose value is updated. + */ + virtual void value_updated(M2MBase *base) = 0; +}; +#endif // M2M_NSDL_OBSERVER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/m2mreporthandler.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2MREPORTHANDLER_H +#define M2MREPORTHANDLER_H + +// Support for std args +#include <stdint.h> +#include "mbed-client/m2mconfig.h" +#include "mbed-client/m2mbase.h" +#include "mbed-client/m2mtimerobserver.h" +#include "mbed-client/m2mresourceinstance.h" +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mtimer.h" + +//FORWARD DECLARATION +class M2MReportObserver; +class M2MTimer; +class M2MResourceInstance; + +/** + * @brief M2MReportHandler. + * This class is handles all the observation related operations. + */ +class M2MReportHandler: public M2MTimerObserver +{ +private: + // Prevents the use of assignment operator by accident. + M2MReportHandler& operator=( const M2MReportHandler& /*other*/ ); + +public: + + M2MReportHandler(M2MReportObserver &observer); + +public: + + /** + * Enum defining which write attributes are set. + */ + enum { + Cancel = 1, + Pmin = 2, + Pmax = 4, + Lt = 8, + Gt = 16, + St = 32 + }; + + /** + * Destructor + */ + virtual ~M2MReportHandler(); + + /** + * @brief Sets that object is under observation. + * @param Value for the observation. + * @param handler, Handler object for sending + * observation callbacks. + */ + void set_under_observation(bool observed); + + /** + * @brief Sets the value of the given resource. + * @param value, Value of the observed resource. + */ + void set_value(float value); + + /** + * @brief Sets notification trigger. + * @param obj_instance_id, Object instance id that has changed + */ + void set_notification_trigger(uint16_t obj_instance_id = 0); + + /** + * @brief Parses the received query for notification + * attribute. + * @param query Query to be parsed for attributes. + * @param type Type of the Base Object. + * @param resource_type Type of the Resource. + * @return true if required attributes are present else false. + */ + bool parse_notification_attribute(const char *query, + M2MBase::BaseType type, + M2MResourceInstance::ResourceType resource_type = M2MResourceInstance::OPAQUE); + + /** + * @brief Set back to default values. + */ + void set_default_values(); + + /** + * @brief Return write attribute flags. + */ + uint8_t attribute_flags(); + +protected : // from M2MTimerObserver + + virtual void timer_expired(M2MTimerObserver::Type type = + M2MTimerObserver::Notdefined); + +private: + + + + bool set_notification_attribute(const char* option, + M2MBase::BaseType type, + M2MResourceInstance::ResourceType resource_type); + + /** + * @brief Schedule a report, if the pmin is exceeded + * then report immediately else store the state to be + * reported once the time fires. + */ + void schedule_report(); + + /** + * @brief Reports a sample that satisfies the reporting criteria. + */ + void report(); + + /** + * @brief Manage timers for pmin and pmax. + */ + void handle_timers(); + + /** + * @brief Check whether notification params can be accepted. + */ + bool check_attribute_validity(); + + /** + * @brief Stop pmin & pmax timers. + */ + void stop_timers(); + + /** + * @brief Check if current value match threshold values. + * @return True if notify can be send otherwise false. + */ + bool check_threshold_values(); + + /** + * @brief Check whether current value matches with GT & LT. + * @return True if current value match with GT or LT values. + */ + bool check_gt_lt_params(); + +private: + M2MReportObserver &_observer; + uint8_t _attribute_state; + bool _notify; + bool _pmin_exceeded; + bool _pmax_exceeded; + M2MTimer _pmin_timer; + M2MTimer _pmax_timer; + int32_t _pmax; + int32_t _pmin; + float _current_value; + float _gt; + float _lt; + float _st; + float _high_step; + float _low_step; + float _last_value; + m2m::Vector<uint16_t> _changed_instance_ids; + +friend class Test_M2MReportHandler; + +}; + +#endif // M2MREPORTHANDLER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/m2mtlvdeserializer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" + +/** + * @brief M2MTLVDeserializer + * TLV Deserialiser get the object instances and resources as binary data and + * builds the <code>lwm2m</code> representation from it. See OMA-LWM2M + * specification, chapter 6.1 for the resource model and chapter 6.3.3 for + * the OMA-TLV specification. + */ +class M2MTLVDeserializer { + +public : + + typedef enum { + None, + NotFound, + NotAllowed, + NotValid + } Error; + + typedef enum { + Put, + Post + } Operation; + + + /** + * Constructor. + */ + M2MTLVDeserializer(); + + /** + * Destructor. + */ + ~M2MTLVDeserializer(); + + /** + * This method checks whether the given binary encodes an object instance + * or something else. It returns <code>true</code> if bits 7-6 of the first + * byte is "00". + * @param tlv Binary to be checked as LWM2M object instance + * @return <code>true</code> or <code>false</code>. + */ + bool is_object_instance(uint8_t *tlv); + + + /** + * This method checks whether the given binary encodes a resource or + * something else. It returns <code>true</code> if bits 7-6 of the first + * byte is "11". + * @param tlv Binary to be checked as LWM2M resource. + * @return <code>true</code> or <code>false</code>. + */ + bool is_resource(uint8_t *tlv); + + /** + * This method checks whether the given binary encodes a multiple resource + * or something else. It returns <code>true</code> if bits 7-6 of the first + * byte is "10". + * @param tlv Binary to be checked as LWM2M multiple resource. + * @return <code>true</code> or <code>false</code>. + */ + bool is_multiple_resource(uint8_t *tlv); + + /** + * This method checks whether the given binary encodes a resource instance + * or something else. It returns <code>true</code> if bits 7-6 of the first + * byte is "01". + * @param tlv Binary to be checked as LWM2M resource instance. + * @return <code>true</code> or <code>false</code>. + */ + bool is_resource_instance(uint8_t *tlv); + + /** + * Deserialises the given binary that must encode object instances. Binary + * array can be checked before invoking this method with + */ + M2MTLVDeserializer::Error deserialise_object_instances(uint8_t* tlv, + uint32_t tlv_size, + M2MObject &object, + M2MTLVDeserializer::Operation operation); + + /** + * Deserialises the given binary that must encode resources. Binary array + * can be checked before invoking this method. + */ + M2MTLVDeserializer::Error deserialize_resources(uint8_t *tlv, + uint32_t tlv_size, + M2MObjectInstance &object_instance, + M2MTLVDeserializer::Operation operation); + + /** + * Deserialises the given binary that must encode resource instances. Binary array + * can be checked before invoking this method. + */ + M2MTLVDeserializer::Error deserialize_resource_instances(uint8_t *tlv, + uint32_t tlv_size, + M2MResource &resource, + M2MTLVDeserializer::Operation operation); + /** + * This method return object instance id or resource id. + * @param tlv Binary to be checked + * @return Object instance id or resource id. + */ + uint16_t instance_id(uint8_t *tlv); + +private: + + M2MTLVDeserializer::Error deserialize_object_instances(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MObject &object, + M2MTLVDeserializer::Operation operation, + bool update_value); + + M2MTLVDeserializer::Error deserialize_resources(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MObjectInstance &object_instance, + M2MTLVDeserializer::Operation operation, + bool update_value); + + M2MTLVDeserializer::Error deserialize_resource_instances(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MResource &resource, + M2MObjectInstance &object_instance, + M2MTLVDeserializer::Operation operation, + bool update_value); + + M2MTLVDeserializer::Error deserialize_resource_instances(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MResource &resource, + M2MTLVDeserializer::Operation operation, + bool update_value); + + bool is_object_instance(uint8_t *tlv, uint32_t offset); + + bool is_resource(uint8_t *tlv, uint32_t offset); + + bool is_multiple_resource(uint8_t *tlv, uint32_t offset); + + bool is_resource_instance(uint8_t *tlv, uint32_t offset); +}; + +class TypeIdLength { + +public: + + static TypeIdLength* createTypeIdLength(uint8_t *tlv, uint32_t offset); + + TypeIdLength* deserialize(); + + void deserialiseID (uint32_t idLength); + + void deserialiseLength (uint32_t lengthType); + + uint8_t *_tlv; + uint32_t _offset; + uint32_t _type; + uint16_t _id; + uint32_t _length; + + friend class Test_M2MTLVDeserializer; +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/m2mtlvserializer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mvector.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" + +/** + * @brief M2MTLVSerializer + * TLV Serialiser constructs the binary representation of object instances, + * resources and resource instances (see OMA-LWM2M specification, chapter 6.1 + * for resource model) as OMA-TLV according described in chapter 6.3.3. + * + */ +class M2MTLVSerializer { + +public: + + /** + * Constructor. + */ + M2MTLVSerializer(); + + /** + * Destructor. + */ + ~M2MTLVSerializer(); + + /** + * Serialises given objects instances that contain resources or multiple + * resources. Object instance IDs are also encoded. This method must be + * used when an operation targets an object with (potential) multiple + * instances like "GET /1". In that case the generated TLV will contain the + * following data: + * <ul> + * <li> ./0 + * <li> ./0/0 + * <li> ./0/1 + * <li> ... + * <li> ./1 + * <li> ./1/0 + * <li> ./1/1 + * <li> ... + * </ul> + * + * @param objects List of object instances. + * @return Object instances encoded binary as OMA-TLV + * @see #serializeObjectInstances(List) + */ + uint8_t* serialize(M2MObjectInstanceList object_instance_list, uint32_t &size); + + /** + * Serialises given resources with no information about the parent object + * instance. This method must be used when an operation targets an object + * instance like "GET /1/0" or a single-instance object like "GET /3//". + * Resources may have single or multiple instances. The generated TLV will + * contain the following data as response to "GET /3//": + * <ul> + * <li> ./0 + * <li> ./1 + * <li> ./2 + * <li> ./6/0 (1st instance of a multiple resource) + * <li> ./6/1 (2nd instance of a multiple resource) + * <li> ... + * </ul> + * @param resources Array of resources and resource instances. + * @return Resources encoded binary as OMA-TLV + * @see #serializeResources(List) + */ + uint8_t* serialize(M2MResourceList resource_list, uint32_t &size); + + uint8_t* serialize(M2MResource *resource, uint32_t &size); + +private : + + uint8_t* serialize_object_instances(M2MObjectInstanceList object_instance_list, uint32_t &size); + + uint8_t* serialize_resources(M2MResourceList resource_list, uint32_t &size, bool &valid); + + void serialize(uint16_t id, M2MObjectInstance *object_instance, uint8_t *&data, uint32_t &size); + + bool serialize (M2MResource *resource, uint8_t *&data, uint32_t &size); + + bool serialize_resource(M2MResource *resource, uint8_t *&data, uint32_t &size); + + bool serialize_multiple_resource(M2MResource *resource, uint8_t *&data, uint32_t &size); + + void serialize_resource_instance(uint16_t id, M2MResourceInstance *resource, uint8_t *&data, uint32_t &size); + + void serialize_TILV (uint8_t type, uint16_t id, uint8_t *value, uint32_t value_length, uint8_t *&data, uint32_t &size); + + uint8_t* serialize_id(uint16_t id, uint32_t &size); + + uint8_t* serialize_length(uint32_t length, uint32_t &size); +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/nsdlaccesshelper.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef NSDL_ACCESS_HELPER_H +#define NSDL_ACCESS_HELPER_H +#include "mbed-client/m2mconnectionhandler.h" +#include "include/m2mnsdlinterface.h" + +typedef Vector<M2MNsdlInterface *> M2MNsdlInterfaceList; +extern M2MNsdlInterfaceList __nsdl_interface_list; +extern M2MConnectionHandler *__connection_handler; + +#ifdef __cplusplus +extern "C" { +#endif + +uint8_t __nsdl_c_callback(struct nsdl_s * nsdl_handle, + sn_coap_hdr_s *received_coap_ptr, + sn_nsdl_addr_s *address, + sn_nsdl_capab_e nsdl_capab); +void *__nsdl_c_memory_alloc(uint16_t size); +void __nsdl_c_memory_free(void *ptr); +uint8_t __nsdl_c_send_to_server(struct nsdl_s * nsdl_handle, + sn_nsdl_capab_e protocol, + uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr); +uint8_t __nsdl_c_received_from_server(struct nsdl_s * nsdl_handle, + sn_coap_hdr_s *coap_header, + sn_nsdl_addr_s *address_ptr); + +void *__socket_malloc( void * context, size_t size); +void __socket_free(void * context, void * ptr); + +M2MNsdlInterface* get_interface(struct nsdl_s* nsdl_handle); + +void __mutex_claim(); +void __mutex_release(); + +#ifdef __cplusplus +} +#endif + +#endif // NSDL_ACCESS_HELPER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/nsdllinker.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef NSDL_LINKER_H +#define NSDL_LINKER_H + +#include <stdint.h> +#include "nsdl-c/sn_nsdl.h" // libCoap includes +#include "nsdl-c/sn_coap_header.h" +#include "nsdl-c/sn_coap_protocol.h" +#include "nsdl-c/sn_nsdl_lib.h" +#include "ns_list.h" + +#endif // NSDL_LINKER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/include/smartpointer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef SMART_POINTER_H +#define SMART_POINTER_H + +class ReferenceCount +{ +private: + + int _count; // Reference count + +public: + +void add_ref() +{ + // Increment the reference count + _count++; +} + +int release() +{ + // Decrement the reference count and + // return the reference count. + return --_count; +} +}; + +template < typename T > class SmartPointer +{ +private: + + T *_data; // Generic pointer to be stored + ReferenceCount *_reference; // Reference count + + +public: + +SmartPointer() +: _data(0), _reference(0) +{ + // Create a new reference + _reference = new ReferenceCount(); + // Increment the reference count + _reference->add_ref(); +} + +SmartPointer(T* value) +: _data(value), _reference(0) +{ + // Create a new reference + _reference = new ReferenceCount(); + // Increment the reference count + _reference->add_ref(); +} + +SmartPointer(const SmartPointer<T>& smart_pointer) +: _data(smart_pointer._data), reference(smart_pointer._reference) +{ + // Copy constructor + // Copy the data and reference pointer + // and increment the reference count + _reference->add_ref(); +} + +~SmartPointer() +{ + if(_reference->release() == 0) { + delete _data; + delete _reference; + } +} + +T& operator* () +{ + return *_data; +} + +T* operator-> () +{ + return _data; +} + +SmartPointer<T>& operator = (const SmartPointer<T>& smart_pointer) +{ + // Assignment operator + if (this != &SmartPointer) { // Avoid self assignment + // Decrement the old reference count + // if reference become zero delete the old data + if(_reference->release() == 0) { + delete _data; + delete _reference; + } + + // Copy the data and reference pointer + // and increment the reference count + _data = SmartPointer._data; + _reference = SmartPointer._reference; + _reference->add_ref(); + } + return *this; +} + +}; + +#endif // SMART_POINTER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mbase.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,766 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbed-client/m2mbase.h" +#include "mbed-client/m2mobservationhandler.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mtimer.h" + +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" + +#include "include/m2mreporthandler.h" +#include "include/nsdlaccesshelper.h" +#include "mbed-trace/mbed_trace.h" +#include <assert.h> +#include <ctype.h> +#include <string.h> +#include <stdlib.h> + +#define TRACE_GROUP "mClt" + +M2MBase::M2MBase(const String& resource_name, + M2MBase::Mode mode, + const String &resource_type, + char *path, + bool external_blockwise_store) +: + _sn_resource(NULL), + _report_handler(NULL), + _observation_handler(NULL), + _token(NULL), + _function_pointer(NULL), + _value_updated_callback(NULL), + _observation_number(0), + _token_length(0), + _observation_level(M2MBase::None), + _is_under_observation(false) +{ + // Checking the name length properly, i.e returning error is impossible from constructor without exceptions + assert(resource_name.length() <= MAX_ALLOWED_STRING_LENGTH); + + _sn_resource = (lwm2m_parameters_s*)memory_alloc(sizeof(lwm2m_parameters_s)); + if(_sn_resource) { + memset(_sn_resource, 0, sizeof(lwm2m_parameters_s)); + _sn_resource->free_on_delete = true; + _sn_resource->dynamic_resource_params = + (sn_nsdl_dynamic_resource_parameters_s*)memory_alloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + if(_sn_resource->dynamic_resource_params) { + memset(_sn_resource->dynamic_resource_params, + 0, sizeof(sn_nsdl_dynamic_resource_parameters_s)); + _sn_resource->dynamic_resource_params->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*)memory_alloc(sizeof(sn_nsdl_static_resource_parameters_s)); + + // Set callback function in case of dynamic resource + if (M2MBase::Dynamic == mode) { + _sn_resource->dynamic_resource_params->sn_grs_dyn_res_callback = __nsdl_c_callback; + } + + if(_sn_resource->dynamic_resource_params->static_resource_parameters) { + // Cast const away to able to compile using MEMORY_OPTIMIZED_API flag + sn_nsdl_static_resource_parameters_s *params = + const_cast<sn_nsdl_static_resource_parameters_s *>(_sn_resource->dynamic_resource_params->static_resource_parameters); + memset(params, 0, sizeof(sn_nsdl_static_resource_parameters_s)); + const size_t len = strlen(resource_type.c_str()); + if (len > 0) { + params->resource_type_ptr = (char*) + alloc_string_copy((uint8_t*) resource_type.c_str(), len); + } + params->path = (uint8_t*)path; + params->pathlen = strlen(path); + + + params->mode = (const uint8_t)mode; + params->free_on_delete = true; + params->external_memory_block = external_blockwise_store; + _sn_resource->dynamic_resource_params->static_resource_parameters = params; + } + } + + _sn_resource->name = stringdup((char*)resource_name.c_str()); + _sn_resource->dynamic_resource_params->publish_uri = true; + _sn_resource->dynamic_resource_params->free_on_delete = true; + + if(is_integer(resource_name) && resource_name.size() <= MAX_ALLOWED_STRING_LENGTH) { + _sn_resource->name_id = strtoul(resource_name.c_str(), NULL, 10); + if(_sn_resource->name_id > 65535){ + _sn_resource->name_id = -1; + } + } else { + _sn_resource->name_id = -1; + } + } +} + +M2MBase::M2MBase(const lwm2m_parameters_s *s): + _sn_resource((lwm2m_parameters_s*) s), + _report_handler(NULL), + _observation_handler(NULL), + _token(NULL), + _function_pointer(NULL), + _value_updated_callback(NULL), + _observation_number(0), + _token_length(0), + _observation_level(M2MBase::None), + _is_under_observation(false) +{ + // Set callback function in case of dynamic resource + if (M2MBase::Dynamic == _sn_resource->dynamic_resource_params->static_resource_parameters->mode) { + _sn_resource->dynamic_resource_params->sn_grs_dyn_res_callback = __nsdl_c_callback; + } +} + +M2MBase::~M2MBase() +{ + delete _report_handler; + free_resources(); + free(_token); + delete _function_pointer; + delete _value_updated_callback; +} + +char* M2MBase::create_path(const M2MObject &parent, uint16_t object_instance) +{ + StringBuffer<5> obj_inst_id; + obj_inst_id.append_int(object_instance); + + return create_path(parent, obj_inst_id.c_str()); +} + +char* M2MBase::create_path(const M2MObject &parent, const char *name) +{ + char * result = NULL; + StringBuffer<(MAX_NAME_SIZE * 2 + (2 + 1))> path; + + const char* obj_name = parent.name(); + + // XXX: ensure space + path.append(obj_name); + path.append('/'); + path.append(name); + + result = stringdup(path.c_str()); + return result; +} + +char* M2MBase::create_path(const M2MResource &parent, uint16_t resource_instance) +{ + StringBuffer<5> res_inst; + res_inst.append_int(resource_instance); + + return create_path(parent, res_inst.c_str()); +} + +char* M2MBase::create_path(const M2MResource &parent, const char *name) +{ + char * result = NULL; + StringBuffer<(MAX_NAME_SIZE * 4 + (3 + 1))> path; + M2MObjectInstance& parent_object_instance = parent.get_parent_object_instance(); + M2MObject& parent_object = parent_object_instance.get_parent_object(); + + const char* obj_name = parent_object.name(); + + // Note: the parent_object_instance.name() contains name of its parent object, not the name of instance, + // so we need to skip that here + const uint16_t obj_inst_id = parent_object_instance.instance_id(); + + const char* resource_name = parent.name(); + + // XXX: ensure space + path.append(obj_name); + path.append('/'); + path.append_int(obj_inst_id); + path.append('/'); + path.append(resource_name); + path.append('/'); + path.append(name); + + result = stringdup(path.c_str()); + return result; +} + +char* M2MBase::create_path(const M2MObjectInstance &parent, const char *name) +{ + char * result = NULL; + StringBuffer<(MAX_NAME_SIZE * 3 + (2 + 1))> path; + M2MObject& parent_object = parent.get_parent_object(); + + const char* obj_name = parent_object.name(); + // Note: the parent_object_instance.name() contains name of its parent object, not the name of instance, + // so we need to skip that here + const uint16_t obj_inst_id = parent.instance_id(); + + // XXX: ensure space + path.append(obj_name); + path.append('/'); + path.append_int(obj_inst_id); + path.append('/'); + path.append(name); + + result = stringdup(path.c_str()); + return result; +} + + +void M2MBase::set_operation(M2MBase::Operation opr) +{ + // If the mode is Static, there is only GET_ALLOWED supported. + if(M2MBase::Static == mode()) { + _sn_resource->dynamic_resource_params->access = M2MBase::GET_ALLOWED; + } else { + _sn_resource->dynamic_resource_params->access = opr; + } +} + +#ifndef MEMORY_OPTIMIZED_API +void M2MBase::set_interface_description(const char *desc) +{ + assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete); + free(_sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr); + _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr = NULL; + const size_t len = strlen(desc); + if (len > 0 ) { + _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr = + (char*)alloc_string_copy((uint8_t*) desc, len); + } +} + +void M2MBase::set_interface_description(const String &desc) +{ + assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete); + set_interface_description(desc.c_str()); +} + +void M2MBase::set_resource_type(const String &res_type) +{ + assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete); + set_resource_type(res_type.c_str()); +} + +void M2MBase::set_resource_type(const char *res_type) +{ + assert(_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete); + free(_sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr); + _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr = NULL; + const size_t len = strlen(res_type); + if (len > 0) { + _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr = (char*) + alloc_string_copy((uint8_t*) res_type, len); + } +} +#endif + +void M2MBase::set_coap_content_type(const uint8_t con_type) +{ + _sn_resource->dynamic_resource_params->coap_content_type = con_type; +} + +void M2MBase::set_observable(bool observable) +{ + _sn_resource->dynamic_resource_params->observable = observable; +} + +void M2MBase::add_observation_level(M2MBase::Observation obs_level) +{ + _observation_level = (M2MBase::Observation)(_observation_level | obs_level); +} + +void M2MBase::remove_observation_level(M2MBase::Observation obs_level) +{ + _observation_level = (M2MBase::Observation)(_observation_level & ~obs_level); +} + +void M2MBase::set_observation_handler(M2MObservationHandler *handler) +{ + tr_debug("M2MBase::set_observation_handler - handler: 0x%x", handler); + _observation_handler = handler; +} + + +void M2MBase::set_under_observation(bool observed, + M2MObservationHandler *handler) +{ + tr_debug("M2MBase::set_under_observation - observed: %d", observed); + tr_debug("M2MBase::set_under_observation - base_type: %d", base_type()); + _is_under_observation = observed; + _observation_handler = handler; + if (handler) { + if (base_type() != M2MBase::ResourceInstance) { + // Create report handler only if it does not exist and one wants observation + // This saves 76 bytes of memory on most usual case. + if (observed) { + if(!_report_handler) { + _report_handler = new M2MReportHandler(*this); + } + } + if (_report_handler) { + _report_handler->set_under_observation(observed); + } + } + } else { + delete _report_handler; + _report_handler = NULL; + } +} + +void M2MBase::set_observation_token(const uint8_t *token, const uint8_t length) +{ + free(_token); + _token = NULL; + _token_length = 0; + + if( token != NULL && length > 0 ) { + _token = alloc_string_copy((uint8_t *)token, length); + if(_token) { + _token_length = length; + } + } +} + +void M2MBase::set_instance_id(const uint16_t inst_id) +{ + _sn_resource->instance_id = inst_id; +} + +void M2MBase::set_observation_number(const uint16_t /*observation_number*/) +{ +} + +void M2MBase::set_max_age(const uint32_t max_age) +{ + _sn_resource->max_age = max_age; +} + +M2MBase::BaseType M2MBase::base_type() const +{ + return (M2MBase::BaseType)_sn_resource->base_type; +} + +M2MBase::Operation M2MBase::operation() const +{ + return (M2MBase::Operation)_sn_resource->dynamic_resource_params->access; +} + +const char* M2MBase::name() const +{ + return _sn_resource->name; +} + +int32_t M2MBase::name_id() const +{ + return _sn_resource->name_id; +} + +uint16_t M2MBase::instance_id() const +{ + return _sn_resource->instance_id; +} + +const char* M2MBase::interface_description() const +{ + return (reinterpret_cast<char*>( + _sn_resource->dynamic_resource_params->static_resource_parameters->interface_description_ptr)); +} + +const char* M2MBase::resource_type() const +{ + return (reinterpret_cast<char*>( + _sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr)); +} + +const char* M2MBase::uri_path() const +{ + return (reinterpret_cast<char*>( + _sn_resource->dynamic_resource_params->static_resource_parameters->path)); +} + +uint8_t M2MBase::coap_content_type() const +{ + return _sn_resource->dynamic_resource_params->coap_content_type; +} + +bool M2MBase::is_observable() const +{ + return _sn_resource->dynamic_resource_params->observable; +} + +M2MBase::Observation M2MBase::observation_level() const +{ + return _observation_level; +} + +void M2MBase::get_observation_token(uint8_t *&token, uint32_t &token_length) +{ + token_length = 0; + free(token); + if (_token) { + token = alloc_string_copy((uint8_t *)_token, _token_length); + if(token) { + token_length = _token_length; + } + } +} + +M2MBase::Mode M2MBase::mode() const +{ + return (M2MBase::Mode)_sn_resource->dynamic_resource_params->static_resource_parameters->mode; +} + +uint16_t M2MBase::observation_number() const +{ + return _observation_number; +} + +uint32_t M2MBase::max_age() const +{ + return _sn_resource->max_age; +} + +bool M2MBase::handle_observation_attribute(const char *query) +{ + tr_debug("M2MBase::handle_observation_attribute - under observation(%d)", is_under_observation()); + bool success = false; + // Create handler if not already exists. Client must able to parse write attributes even when + // observation is not yet set + if (!_report_handler) { + _report_handler = new M2MReportHandler(*this); + } + + success = _report_handler->parse_notification_attribute(query,base_type()); + if (success) { + if (is_under_observation()) { + _report_handler->set_under_observation(true); + } + } else { + _report_handler->set_default_values(); + } + return success; +} + +void M2MBase::observation_to_be_sent(m2m::Vector<uint16_t> changed_instance_ids, bool send_object) +{ + //TODO: Move this to M2MResourceInstance + if(_observation_handler) { + _observation_number++; + _observation_handler->observation_to_be_sent(this, + _observation_number, + changed_instance_ids, + send_object); + } +} + +void M2MBase::set_base_type(M2MBase::BaseType type) +{ + assert(_sn_resource->free_on_delete); + _sn_resource->base_type = type; +} + +sn_coap_hdr_s* M2MBase::handle_get_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_put_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_post_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &, + sn_nsdl_addr_s *) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +void *M2MBase::memory_alloc(uint32_t size) +{ + if(size) + return malloc(size); + else + return 0; +} + +void M2MBase::memory_free(void *ptr) +{ + free(ptr); +} + +char* M2MBase::alloc_string_copy(const char* source) +{ + assert(source != NULL); + + // Note: the armcc's libc does not have strdup, so we need to implement it here + const size_t len = strlen(source); + + return (char*)alloc_string_copy((uint8_t*)source, len); +} + +uint8_t* M2MBase::alloc_string_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size + 1); + if (result) { + memcpy(result, source, size); + result[size] = '\0'; + } + return result; +} + +uint8_t* M2MBase::alloc_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size); + if (result) { + memcpy(result, source, size); + } + return result; +} + +bool M2MBase::validate_string_length(const String &string, size_t min_length, size_t max_length) +{ + bool valid = false; + + const size_t len = string.length(); + if ((len >= min_length) && (len <= max_length)) { + valid = true; + } + + return valid; +} + +bool M2MBase::validate_string_length(const char* string, size_t min_length, size_t max_length) +{ + bool valid = false; + + if (string != NULL) { + const size_t len = strlen(string); + if ((len >= min_length) && (len <= max_length)) { + valid = true; + } + } + + return valid; +} + +M2MReportHandler* M2MBase::create_report_handler() +{ + if (!_report_handler) { + _report_handler = new M2MReportHandler(*this); + } + return _report_handler; +} + +M2MReportHandler* M2MBase::report_handler() +{ + return _report_handler; +} + +M2MObservationHandler* M2MBase::observation_handler() +{ + return _observation_handler; +} + +void M2MBase::set_register_uri(bool register_uri) +{ + _sn_resource->dynamic_resource_params->publish_uri = register_uri; +} + +bool M2MBase::register_uri() +{ + return _sn_resource->dynamic_resource_params->publish_uri; +} + +bool M2MBase::is_integer(const String &value) +{ + const char *s = value.c_str(); + if(value.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) { + return false; + } + char * p; + strtol(value.c_str(), &p, 10); + return (*p == 0); +} + +bool M2MBase::is_integer(const char *value) +{ + assert(value != NULL); + + if((strlen(value) < 1) || ((!isdigit(value[0])) && (value[0] != '-') && (value[0] != '+'))) { + return false; + } + char * p; + strtol(value, &p, 10); + return (*p == 0); +} + +bool M2MBase::is_under_observation() const +{ + return _is_under_observation; +} + +void M2MBase::set_value_updated_function(value_updated_callback callback) +{ + delete _value_updated_callback; + // XXX: create a copy of the copy of callback object. Perhaps it would better to + // give a reference as parameter and just store that, as it would save some memory. + _value_updated_callback = new value_updated_callback(callback); +} + +void M2MBase::set_value_updated_function(value_updated_callback2 callback) +{ + delete _function_pointer; + _function_pointer = new FP1<void, const char*>(callback); + set_value_updated_function(value_updated_callback(_function_pointer, + &FP1<void, const char*>::call)); +} + +bool M2MBase::is_value_updated_function_set() +{ + return (_value_updated_callback) ? true : false; +} + +void M2MBase::execute_value_updated(const String& name) +{ + if(_value_updated_callback) { + (*_value_updated_callback)(name.c_str()); + } +} + +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE> &buffer, const char *s1, uint16_t i1, const char *s2, uint16_t i2) +{ + + if(!buffer.ensure_space(strlen(s1) + strlen(s2) + (MAX_INSTANCE_SIZE * 2) + 3 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + buffer.append('/'); + buffer.append(s2); + buffer.append('/'); + buffer.append_int(i2); + + return true; + +} + +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_2> &buffer, const char *s1, uint16_t i1, const char *s2) +{ + if(!buffer.ensure_space(strlen(s1) + strlen(s2) + MAX_INSTANCE_SIZE + 2 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + buffer.append('/'); + buffer.append(s2); + + return true; +} + +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_3> &buffer, const char *s1, uint16_t i1, uint16_t i2) +{ + if(!buffer.ensure_space(strlen(s1) + (MAX_INSTANCE_SIZE * 2) + 2 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + buffer.append('/'); + buffer.append_int(i2); + + return true; +} + +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_4> &buffer, const char *s1, uint16_t i1) +{ + if(!buffer.ensure_space(strlen(s1) + MAX_INSTANCE_SIZE + 1 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + + return true; +} + +char* M2MBase::stringdup(const char* src) +{ + assert(src != NULL); + + const size_t len = strlen(src) + 1; + + char *dest = (char*)malloc(len); + + if (dest) { + memcpy(dest, src, len); + } + return dest; +} + +void M2MBase::free_resources() +{ + // remove the nsdl structures from the nsdlinterface's lists. + if (_observation_handler) { + _observation_handler->resource_to_be_deleted(this); + } + + if (_sn_resource->dynamic_resource_params->static_resource_parameters->free_on_delete) { + sn_nsdl_static_resource_parameters_s *params = + const_cast<sn_nsdl_static_resource_parameters_s *>(_sn_resource->dynamic_resource_params->static_resource_parameters); + + free(params->path); + free(params->resource); + free(params->resource_type_ptr); + free(params->interface_description_ptr); + free(params); + } + if (_sn_resource->dynamic_resource_params->free_on_delete) { + free(_sn_resource->dynamic_resource_params); + } + + if (_sn_resource->free_on_delete) { + free(_sn_resource->name); + free(_sn_resource); + } +} + +size_t M2MBase::resource_name_length() const +{ + return strlen(_sn_resource->name); +} + +sn_nsdl_dynamic_resource_parameters_s* M2MBase::get_nsdl_resource() +{ + return _sn_resource->dynamic_resource_params; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mblockmessage.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mblockmessage.h" +#include "mbed-client/m2mconfig.h" +#include <stdlib.h> +#include <string.h> + +M2MBlockMessage::M2MBlockMessage() : + _block_data_ptr(NULL), + _total_message_size(0), + _block_data_len(0), + _block_number(0), + _error_code(M2MBlockMessage::ErrorNone), + _is_last_block(false), + _is_block_message(false) +{ +} + +M2MBlockMessage::~M2MBlockMessage() +{ + free(_block_data_ptr); + _block_data_ptr = NULL; +} + +void M2MBlockMessage::set_message_info(sn_coap_hdr_s *coap_header) +{ + _is_block_message = (coap_header && + coap_header->options_list_ptr && + coap_header->options_list_ptr->block1 != -1) ? true : false; + + if (coap_header && coap_header->options_list_ptr) { + // Check total size + if (coap_header->options_list_ptr->use_size1) { + _total_message_size = coap_header->options_list_ptr->size1; + } + + // Default value in coap library is 65kb + uint32_t max_size = SN_COAP_MAX_INCOMING_MESSAGE_SIZE; + if (_total_message_size > max_size) { + _error_code = M2MBlockMessage::EntityTooLarge; + } else { + _error_code = M2MBlockMessage::ErrorNone; + } + if (M2MBlockMessage::ErrorNone == _error_code) { + // Is last block + if (coap_header->options_list_ptr->block1 != -1) { +// if (!(*(coap_header->options_list_ptr->block1_ptr + (coap_header->options_list_ptr->block1_len - 1)) & 0x08)) { + if (!((coap_header->options_list_ptr->block1) & 0x08)) { + _is_last_block = true; + } else { + _is_last_block = false; + } + } + + _block_number = coap_header->options_list_ptr->block1 >> 4; + // Block number +// if (coap_header->options_list_ptr->block1_len == 3) { +// _block_number = *(coap_header->options_list_ptr->block1_ptr) << 12; +// _block_number |= *(coap_header->options_list_ptr->block1_ptr + 1) << 4; +// _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 2)) >> 4; +// } + +// else if (coap_header->options_list_ptr->block1_len == 2) { +// _block_number = *(coap_header->options_list_ptr->block1_ptr) << 4; +// _block_number |= (*(coap_header->options_list_ptr->block1_ptr + 1)) >> 4; +// } +// else if (coap_header->options_list_ptr->block1_len == 1) { +// _block_number = (*coap_header->options_list_ptr->block1_ptr) >> 4; +// } +// else { +// _block_number = 0; +// } + + // Payload + free(_block_data_ptr); + _block_data_ptr = NULL; + _block_data_len = coap_header->payload_len; + if(_block_data_len > 0) { + _block_data_ptr = (uint8_t *)malloc(_block_data_len); + if (_block_data_ptr) { + memcpy(_block_data_ptr, coap_header->payload_ptr, _block_data_len); + } + } + } + } +} + +void M2MBlockMessage::clear_values() +{ + free(_block_data_ptr); + _block_data_ptr = NULL; + _block_data_len = 0; + _block_number = 0; + _total_message_size = 0; + _is_last_block = false; + _error_code = M2MBlockMessage::ErrorNone; +} + +bool M2MBlockMessage::is_block_message() const +{ + return _is_block_message; +} + +uint16_t M2MBlockMessage::block_number() const +{ + return _block_number; +} + +uint32_t M2MBlockMessage::total_message_size() const +{ + return _total_message_size; +} + +bool M2MBlockMessage::is_last_block() const +{ + return _is_last_block; +} + +uint8_t* M2MBlockMessage::block_data() const +{ + return _block_data_ptr; +} + +uint32_t M2MBlockMessage::block_data_len() const +{ + return _block_data_len; +} + +M2MBlockMessage::Error M2MBlockMessage::error_code() const +{ + return _error_code; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mdevice.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,568 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +#include "mbed-trace/mbed_trace.h" + +#define BUFFER_SIZE 21 +#define TRACE_GROUP "mClt" + +M2MDevice* M2MDevice::_instance = NULL; + +M2MDevice* M2MDevice::get_instance() +{ + if(_instance == NULL) { + // ownership of this path is transferred to M2MBase. + // Since this object is a singleton, we could use the C-structs to avoid heap + // allocation on a lot of M2MDevice -objects data. + char *path = stringdup(M2M_DEVICE_ID); + if (path) { + _instance = new M2MDevice(path); + } + } + return _instance; +} + +void M2MDevice::delete_instance() +{ + delete _instance; + _instance = NULL; +} + +M2MDevice::M2MDevice(char *path) +: M2MObject(M2M_DEVICE_ID, path) +{ + M2MBase::set_register_uri(false); + M2MBase::set_operation(M2MBase::GET_ALLOWED); + + _device_instance = M2MObject::create_object_instance(); + if(_device_instance) { + _device_instance->set_operation(M2MBase::GET_ALLOWED); + _device_instance->set_register_uri(true); + _device_instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + M2MResource* res = _device_instance->create_dynamic_resource(DEVICE_REBOOT, + OMA_RESOURCE_TYPE, + M2MResourceInstance::OPAQUE, + false); + if(res) { + res->set_operation(M2MBase::POST_ALLOWED); + res->set_register_uri(false); + } + + M2MResourceInstance* instance = _device_instance->create_dynamic_resource_instance(DEVICE_ERROR_CODE, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + true,0); + if(instance) { + M2MResource * dev_res = _device_instance->resource(DEVICE_ERROR_CODE); + if(dev_res) { + dev_res->set_register_uri(false); + } + instance->set_operation(M2MBase::GET_ALLOWED); + + instance->set_value(0); + + instance->set_register_uri(false); + } + res = _device_instance->create_dynamic_resource(DEVICE_SUPPORTED_BINDING_MODE, + OMA_RESOURCE_TYPE, + M2MResourceInstance::STRING, + true); + if(res) { + res->set_operation(M2MBase::GET_ALLOWED); + res->set_value((const uint8_t*)BINDING_MODE_UDP,sizeof(BINDING_MODE_UDP)-1); + res->set_register_uri(false); + } + } +} + +M2MDevice::~M2MDevice() +{ +} + +M2MResource* M2MDevice::create_resource(DeviceResource resource, const String &value) +{ + M2MResource* res = NULL; + const char* device_id_ptr = ""; + M2MBase::Operation operation = M2MBase::GET_ALLOWED; + if(!is_resource_present(resource) && value.size() <= MAX_ALLOWED_STRING_LENGTH) { + switch(resource) { + case Manufacturer: + device_id_ptr = DEVICE_MANUFACTURER; + break; + case DeviceType: + device_id_ptr = DEVICE_DEVICE_TYPE; + break; + case ModelNumber: + device_id_ptr = DEVICE_MODEL_NUMBER; + break; + case SerialNumber: + device_id_ptr = DEVICE_SERIAL_NUMBER; + break; + case HardwareVersion: + device_id_ptr = DEVICE_HARDWARE_VERSION; + break; + case FirmwareVersion: + device_id_ptr = DEVICE_FIRMWARE_VERSION; + break; + case SoftwareVersion: + device_id_ptr = DEVICE_SOFTWARE_VERSION; + break; + case UTCOffset: + device_id_ptr = DEVICE_UTC_OFFSET; + operation = M2MBase::GET_PUT_ALLOWED; + break; + case Timezone: + device_id_ptr = DEVICE_TIMEZONE; + operation = M2MBase::GET_PUT_ALLOWED; + break; + default: + break; + } + } + const String device_id(device_id_ptr); + + if(!device_id.empty()) { + if(_device_instance) { + res = _device_instance->create_dynamic_resource(device_id, + OMA_RESOURCE_TYPE, + M2MResourceInstance::STRING, + true); + + if(res ) { + res->set_operation(operation); + if (value.empty()) { + res->clear_value(); + } else { + res->set_value((const uint8_t*)value.c_str(), + (uint32_t)value.length()); + } + res->set_register_uri(false); + } + } + } + return res; +} + +M2MResource* M2MDevice::create_resource(DeviceResource resource, int64_t value) +{ + M2MResource* res = NULL; + const char* device_id_ptr = ""; + M2MBase::Operation operation = M2MBase::GET_ALLOWED; + if(!is_resource_present(resource)) { + switch(resource) { + case BatteryLevel: + if(check_value_range(resource, value)) { + device_id_ptr = DEVICE_BATTERY_LEVEL; + } + break; + case BatteryStatus: + if(check_value_range(resource, value)) { + device_id_ptr = DEVICE_BATTERY_STATUS; + } + break; + case MemoryFree: + device_id_ptr = DEVICE_MEMORY_FREE; + break; + case MemoryTotal: + device_id_ptr = DEVICE_MEMORY_TOTAL; + break; + case CurrentTime: + device_id_ptr = DEVICE_CURRENT_TIME; + operation = M2MBase::GET_PUT_ALLOWED; + break; + default: + break; + } + } + + const String device_id(device_id_ptr); + + if(!device_id.empty()) { + if(_device_instance) { + res = _device_instance->create_dynamic_resource(device_id, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + true); + + if(res) { + + + res->set_operation(operation); + res->set_value(value); + + res->set_register_uri(false); + } + } + } + return res; +} + +M2MResourceInstance* M2MDevice::create_resource_instance(DeviceResource resource, int64_t value, + uint16_t instance_id) +{ + M2MResourceInstance* res = NULL; + const char* device_id_ptr = ""; + // For these resources multiple instance can exist + if(AvailablePowerSources == resource) { + if(check_value_range(resource, value)) { + device_id_ptr = DEVICE_AVAILABLE_POWER_SOURCES; + } + } else if(PowerSourceVoltage == resource) { + device_id_ptr = DEVICE_POWER_SOURCE_VOLTAGE; + } else if(PowerSourceCurrent == resource) { + device_id_ptr = DEVICE_POWER_SOURCE_CURRENT; + } else if(ErrorCode == resource) { + if(check_value_range(resource, value)) { + device_id_ptr = DEVICE_ERROR_CODE; + } + } + + const String device_id(device_id_ptr); + + if(!device_id.empty()) { + if(_device_instance) { + res = _device_instance->create_dynamic_resource_instance(device_id,OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + true, instance_id); + + M2MResource *resource = _device_instance->resource(device_id); + if(resource) { + resource->set_register_uri(false); + } + if(res) { + res->set_value(value); + // Only read operation is allowed for above resources + res->set_operation(M2MBase::GET_ALLOWED); + + res->set_register_uri(false); + } + } + } + return res; +} +M2MResource* M2MDevice::create_resource(DeviceResource resource) +{ + M2MResource* res = NULL; + if(!is_resource_present(resource)) { + const char* device_Id_ptr = ""; + if(FactoryReset == resource) { + device_Id_ptr = DEVICE_FACTORY_RESET; + } else if(ResetErrorCode == resource) { + device_Id_ptr = DEVICE_RESET_ERROR_CODE; + } + const String device_Id(device_Id_ptr); + + if(_device_instance && !device_Id.empty()) { + res = _device_instance->create_dynamic_resource(device_Id, + OMA_RESOURCE_TYPE, + M2MResourceInstance::OPAQUE, + true); + M2MResource *resource = _device_instance->resource(device_Id); + if(resource) { + resource->set_register_uri(false); + } + if(res) { + res->set_operation(M2MBase::POST_ALLOWED); + res->set_register_uri(false); + } + } + } + return res; +} + +bool M2MDevice::delete_resource(DeviceResource resource) +{ + bool success = false; + if(M2MDevice::Reboot != resource && + M2MDevice::ErrorCode != resource && + M2MDevice::SupportedBindingMode != resource) { + if(_device_instance) { + success = _device_instance->remove_resource(resource_name(resource)); + } + } + return success; +} + +bool M2MDevice::delete_resource_instance(DeviceResource resource, + uint16_t instance_id) +{ + bool success = false; + if(M2MDevice::Reboot != resource && + M2MDevice::ErrorCode != resource && + M2MDevice::SupportedBindingMode != resource) { + if(_device_instance) { + success = _device_instance->remove_resource_instance(resource_name(resource),instance_id); + } + } + return success; +} + +bool M2MDevice::set_resource_value(DeviceResource resource, + const String &value, + uint16_t instance_id) +{ + bool success = false; + M2MResourceInstance* res = get_resource_instance(resource,instance_id); + if(res && value.size() <= MAX_ALLOWED_STRING_LENGTH) { + if(M2MDevice::Manufacturer == resource || + M2MDevice::ModelNumber == resource || + M2MDevice::DeviceType == resource || + M2MDevice::SerialNumber == resource || + M2MDevice::HardwareVersion == resource || + M2MDevice::FirmwareVersion == resource || + M2MDevice::SoftwareVersion == resource || + M2MDevice::UTCOffset == resource || + M2MDevice::Timezone == resource) { + if (value.empty()) { + res->clear_value(); + success = true; + } else { + success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length()); + } + } + } + return success; +} + +bool M2MDevice::set_resource_value(DeviceResource resource, + int64_t value, + uint16_t instance_id) +{ + bool success = false; + M2MResourceInstance* res = get_resource_instance(resource,instance_id); + if(res) { + if(M2MDevice::BatteryLevel == resource || + M2MDevice::BatteryStatus == resource || + M2MDevice::MemoryFree == resource || + M2MDevice::MemoryTotal == resource || + M2MDevice::ErrorCode == resource || + M2MDevice::CurrentTime == resource || + M2MDevice::AvailablePowerSources == resource || + M2MDevice::PowerSourceVoltage == resource || + M2MDevice::PowerSourceCurrent == resource) { + // If it is any of the above resource + // set the value of the resource. + if (check_value_range(resource, value)) { + + success = res->set_value(value); + } + } + } + return success; +} + +String M2MDevice::resource_value_string(DeviceResource resource, + uint16_t instance_id) const +{ + String value = ""; + M2MResourceInstance* res = get_resource_instance(resource,instance_id); + if(res) { + if(M2MDevice::Manufacturer == resource || + M2MDevice::ModelNumber == resource || + M2MDevice::DeviceType == resource || + M2MDevice::SerialNumber == resource || + M2MDevice::HardwareVersion == resource || + M2MDevice::FirmwareVersion == resource || + M2MDevice::SoftwareVersion == resource || + M2MDevice::UTCOffset == resource || + M2MDevice::Timezone == resource) { + + + value = res->get_value_string(); + } + } + return value; +} + +int64_t M2MDevice::resource_value_int(DeviceResource resource, + uint16_t instance_id) const +{ + int64_t value = -1; + M2MResourceInstance* res = get_resource_instance(resource,instance_id); + if(res) { + if(M2MDevice::BatteryLevel == resource || + M2MDevice::BatteryStatus == resource || + M2MDevice::MemoryFree == resource || + M2MDevice::MemoryTotal == resource || + M2MDevice::ErrorCode == resource || + M2MDevice::CurrentTime == resource || + M2MDevice::AvailablePowerSources == resource || + M2MDevice::PowerSourceVoltage == resource || + M2MDevice::PowerSourceCurrent == resource) { + + // note: the value may be 32bit int on 32b archs. + value = res->get_value_int(); + } + } + return value; +} + +bool M2MDevice::is_resource_present(DeviceResource resource) const +{ + bool success = false; + M2MResourceInstance* res = get_resource_instance(resource,0); + if(res) { + success = true; + } + return success; +} + +uint16_t M2MDevice::per_resource_count(DeviceResource res) const +{ + uint16_t count = 0; + if(_device_instance) { + count = _device_instance->resource_count(resource_name(res)); + } + return count; +} + +uint16_t M2MDevice::total_resource_count() const +{ + uint16_t count = 0; + if(_device_instance) { + count = _device_instance->resources().size(); + } + return count; +} + +M2MResourceInstance* M2MDevice::get_resource_instance(DeviceResource dev_res, + uint16_t instance_id) const +{ + M2MResource* res = NULL; + M2MResourceInstance* inst = NULL; + if(_device_instance) { + res = _device_instance->resource(resource_name(dev_res)); + if(res) { + if(res->supports_multiple_instances()) { + inst = res->resource_instance(instance_id); + } else { + inst = res; + } + } + } + return inst; +} + +const char* M2MDevice::resource_name(DeviceResource resource) +{ + const char* res_name = ""; + switch(resource) { + case Manufacturer: + res_name = DEVICE_MANUFACTURER; + break; + case DeviceType: + res_name = DEVICE_DEVICE_TYPE; + break; + case ModelNumber: + res_name = DEVICE_MODEL_NUMBER; + break; + case SerialNumber: + res_name = DEVICE_SERIAL_NUMBER; + break; + case HardwareVersion: + res_name = DEVICE_HARDWARE_VERSION; + break; + case FirmwareVersion: + res_name = DEVICE_FIRMWARE_VERSION; + break; + case SoftwareVersion: + res_name = DEVICE_SOFTWARE_VERSION; + break; + case Reboot: + res_name = DEVICE_REBOOT; + break; + case FactoryReset: + res_name = DEVICE_FACTORY_RESET; + break; + case AvailablePowerSources: + res_name = DEVICE_AVAILABLE_POWER_SOURCES; + break; + case PowerSourceVoltage: + res_name = DEVICE_POWER_SOURCE_VOLTAGE; + break; + case PowerSourceCurrent: + res_name = DEVICE_POWER_SOURCE_CURRENT; + break; + case BatteryLevel: + res_name = DEVICE_BATTERY_LEVEL; + break; + case BatteryStatus: + res_name = DEVICE_BATTERY_STATUS; + break; + case MemoryFree: + res_name = DEVICE_MEMORY_FREE; + break; + case MemoryTotal: + res_name = DEVICE_MEMORY_TOTAL; + break; + case ErrorCode: + res_name = DEVICE_ERROR_CODE; + break; + case ResetErrorCode: + res_name = DEVICE_RESET_ERROR_CODE; + break; + case CurrentTime: + res_name = DEVICE_CURRENT_TIME; + break; + case UTCOffset: + res_name = DEVICE_UTC_OFFSET; + break; + case Timezone: + res_name = DEVICE_TIMEZONE; + break; + case SupportedBindingMode: + res_name = DEVICE_SUPPORTED_BINDING_MODE; + break; + } + return res_name; +} + +bool M2MDevice::check_value_range(DeviceResource resource, int64_t value) const +{ + bool success = false; + switch (resource) { + case AvailablePowerSources: + if(value >= 0 && value <= 7) { + success = true; + } + break; + case BatteryLevel: + if (value >= 0 && value <= 100) { + success = true; + } + break; + case BatteryStatus: + if (value >= 0 && value <= 6) { + success = true; + } + break; + case ErrorCode: + if (value >= 0 && value <= 8) { + success = true; + } + break; + default: + success = true; + break; + } + return success; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mfirmware.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,604 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbed-client/m2mfirmware.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +#include "include/nsdlaccesshelper.h" + +#define BUFFER_SIZE 21 +#define TRACE_GROUP "mClt" + +M2MFirmware* M2MFirmware::_instance = NULL; + +M2MFirmware* M2MFirmware::get_instance() +{ + if(_instance == NULL) { + _instance = new M2MFirmware(); + } + return _instance; +} + +void M2MFirmware::delete_instance() +{ + delete _instance; + _instance = NULL; +} + +M2MFirmware::M2MFirmware() +: M2MObject(M2M_FIRMWARE_ID, stringdup(M2M_FIRMWARE_ID)) +{ + M2MBase::set_register_uri(false); + M2MBase::set_operation(M2MBase::GET_PUT_ALLOWED); + _firmware_instance = M2MObject::create_object_instance(); + if(_firmware_instance) { + _firmware_instance->set_operation(M2MBase::GET_PUT_ALLOWED); + create_mandatory_resources(); + } +} + +M2MFirmware::~M2MFirmware() +{ +} + +// Conditionally put the static part of parameter struct into flash. +// Unfortunately this can't be done yet by default as there is old API which +// may be used to modify the values in sn_nsdl_static_resource_parameters_s. +#ifdef MEMORY_OPTIMIZED_API +#define STATIC_PARAM_TYPE const +#else +#define STATIC_PARAM_TYPE +#endif + +#define PACKAGE_PATH FIRMWARE_PATH_PREFIX FIRMWARE_PACKAGE + +STATIC_PARAM_TYPE +static sn_nsdl_static_resource_parameters_s firmware_package_params_static = { + (char*)OMA_RESOURCE_TYPE, // resource_type_ptr + (char*)"", // interface_description_ptr + (uint8_t*)PACKAGE_PATH, // path + (uint8_t*)"", // resource + 5, // strlen("5/0/0") + 0, // resourcelen + false, // external_memory_block + SN_GRS_DYNAMIC, // mode + false // free_on_delete +}; + +#define PACKAGE_URI_PATH FIRMWARE_PATH_PREFIX FIRMWARE_PACKAGE_URI + +STATIC_PARAM_TYPE +static sn_nsdl_static_resource_parameters_s firmware_package_uri_params_static = { + (char*)OMA_RESOURCE_TYPE, // resource_type_ptr + (char*)"", // interface_description_ptr + (uint8_t*)PACKAGE_URI_PATH, // path + (uint8_t*)"", // resource + 5, // strlen("5/0/1") + 0, // resourcelen + false, // external_memory_block + SN_GRS_DYNAMIC, // mode + false // free_on_delete +}; + +#define UPDATE_PATH FIRMWARE_PATH_PREFIX FIRMWARE_UPDATE + +STATIC_PARAM_TYPE +static sn_nsdl_static_resource_parameters_s firmware_update_params_static = { + (char*)OMA_RESOURCE_TYPE, // resource_type_ptr + (char*)"", // interface_description_ptr + (uint8_t*)UPDATE_PATH, // path + (uint8_t*)"", // resource + 5, // strlen(5/0/2) + 0, // resourcelen + false, // external_memory_block + SN_GRS_DYNAMIC, // mode + false // free_on_delete +}; + +#define STATE_URI_PATH FIRMWARE_PATH_PREFIX FIRMWARE_STATE + +STATIC_PARAM_TYPE +static sn_nsdl_static_resource_parameters_s firmware_state_params_static = { + (char*)OMA_RESOURCE_TYPE, // resource_type_ptr + (char*)"", // interface_description_ptr + (uint8_t*)STATE_URI_PATH, // path + (uint8_t*)"0", // resource + 5, // strlen("5/0/3") + 1, // resourcelen + false, // external_memory_block + SN_GRS_DYNAMIC, // mode + false // free_on_delete +}; + +#define UPDATE_RESULT_PATH FIRMWARE_PATH_PREFIX FIRMWARE_UPDATE_RESULT + +STATIC_PARAM_TYPE +static sn_nsdl_static_resource_parameters_s firmware_update_result_params_static = { + (char*)OMA_RESOURCE_TYPE, // resource_type_ptr + (char*)"", // interface_description_ptr + (uint8_t*)UPDATE_RESULT_PATH, // path + (uint8_t*)"0", // resource + 5, // strlen(5/0/5) + 1, // resourcelen + false, // external_memory_block + SN_GRS_DYNAMIC, // mode + false // free_on_delete +}; + +static sn_nsdl_dynamic_resource_parameters_s firmware_package_params_dynamic = { + __nsdl_c_callback, + &firmware_package_params_static, + {NULL, NULL}, // link + COAP_CONTENT_OMA_PLAIN_TEXT_TYPE, // coap_content_type + M2MBase::PUT_ALLOWED, // access + 0, // registered + false, // publish_uri + false, // free_on_delete + true // observable +}; + +static sn_nsdl_dynamic_resource_parameters_s firmware_package_uri_params_dynamic = { + __nsdl_c_callback, + &firmware_package_uri_params_static, + {NULL, NULL}, // link + COAP_CONTENT_OMA_PLAIN_TEXT_TYPE, // coap_content_type + M2MBase::PUT_ALLOWED, // access + 0, // registered + false, // publish_uri + false, // free_on_delete + true // observable +}; + +static sn_nsdl_dynamic_resource_parameters_s firmware_update_params_dynamic = { + __nsdl_c_callback, + &firmware_update_params_static, + {NULL, NULL}, // link + COAP_CONTENT_OMA_PLAIN_TEXT_TYPE, // coap_content_type + M2MBase::NOT_ALLOWED, // access + 0, // registered + false, // publish_uri + false, // free_on_delete + true // observable +}; + +static sn_nsdl_dynamic_resource_parameters_s firmware_state_params_dynamic = { + __nsdl_c_callback, + &firmware_state_params_static, + {NULL, NULL}, // link + COAP_CONTENT_OMA_PLAIN_TEXT_TYPE, // coap_content_type + M2MBase::GET_ALLOWED, // access + 0, // registered + false, // publish_uri + false, // free_on_delete + true // observable +}; + +static sn_nsdl_dynamic_resource_parameters_s firmware_update_result_params_dynamic = { + __nsdl_c_callback, + &firmware_update_result_params_static, + {NULL, NULL}, // link + COAP_CONTENT_OMA_PLAIN_TEXT_TYPE, // coap_content_type + M2MBase::GET_ALLOWED, // access + 0, // registered + false, // publish_uri + false, // free_on_delete + true // observable +}; +const static M2MBase::lwm2m_parameters firmware_package_params = { + 0, // max_age + 0, // instance_id + 0, // name_id + (char*)FIRMWARE_PACKAGE, // name + &firmware_package_params_dynamic, + M2MBase::Resource, // base_type + false // free_on_delete +}; + +const static M2MBase::lwm2m_parameters firmware_package_uri_params = { + 0, // max_age + 0, // instance_id + 0, // name_id + (char*)FIRMWARE_PACKAGE_URI, // name + &firmware_package_uri_params_dynamic, + M2MBase::Resource, // base_type + false // free_on_delete +}; + +const static M2MBase::lwm2m_parameters firmware_update_params = { + 0, // max_age + 0, // instance_id + 0, // name_id + (char*)FIRMWARE_UPDATE, // name + &firmware_update_params_dynamic, + M2MBase::Resource, // base_type + false // free_on_delete +}; + +const static M2MBase::lwm2m_parameters firmware_state_params = { + 0, // max_age + 0, // instance_id + 0, // name_id + (char*)FIRMWARE_STATE, // name + &firmware_state_params_dynamic, + M2MBase::Resource, // base_type + false // free_on_delete +}; + +const static M2MBase::lwm2m_parameters firmware_update_result_params = { + 0, // max_age + 0, // instance_id + 0, // name_id + (char*)FIRMWARE_UPDATE_RESULT, // name + &firmware_update_result_params_dynamic, + M2MBase::Resource, // base_type + false // free_on_delete +}; + +void M2MFirmware::create_mandatory_resources() +{ + _firmware_instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + + M2MResource* res; + + // todo: + // perhaps we should have a API for batch creation of objects by using a array + // of lwm2m_parameters. + + res = _firmware_instance->create_dynamic_resource(&firmware_package_params, + M2MResourceInstance::OPAQUE, + false); + + res = _firmware_instance->create_dynamic_resource(&firmware_package_uri_params, + M2MResourceInstance::STRING, + false); + + res = _firmware_instance->create_dynamic_resource(&firmware_update_params, + M2MResourceInstance::OPAQUE, + false); + + res = _firmware_instance->create_dynamic_resource(&firmware_state_params, + M2MResourceInstance::INTEGER, + true); + + res = _firmware_instance->create_dynamic_resource(&firmware_update_result_params, + M2MResourceInstance::INTEGER, + true); +} + +M2MResource* M2MFirmware::create_resource(FirmwareResource resource, const String &value) +{ + M2MResource* res = NULL; + const char* firmware_id_ptr = ""; + M2MBase::Operation operation = M2MBase::GET_ALLOWED; + if(!is_resource_present(resource)) { + switch(resource) { + case PackageName: + firmware_id_ptr = FIRMWARE_PACKAGE_NAME; + break; + case PackageVersion: + firmware_id_ptr = FIRMWARE_PACKAGE_VERSION; + break; + default: + break; + } + } + String firmware_id(firmware_id_ptr); + + if(!firmware_id.empty() && value.size() < 256) { + if(_firmware_instance) { + res = _firmware_instance->create_dynamic_resource(firmware_id, + OMA_RESOURCE_TYPE, + M2MResourceInstance::STRING, + false); + + if(res) { + res->set_register_uri(false); + res->set_operation(operation); + if(value.empty()) { + res->clear_value(); + } else { + res->set_value((const uint8_t*)value.c_str(), + (uint32_t)value.length()); + } + } + } + } + return res; +} + +M2MResource* M2MFirmware::create_resource(FirmwareResource resource, int64_t value) +{ + M2MResource* res = NULL; + const char* firmware_id_ptr = ""; + M2MBase::Operation operation = M2MBase::GET_ALLOWED; + if(!is_resource_present(resource)) { + switch(resource) { + case UpdateSupportedObjects: + if(check_value_range(resource, value)) { + firmware_id_ptr = FIRMWARE_UPDATE_SUPPORTED_OBJECTS; + operation = M2MBase::GET_PUT_ALLOWED; + } + break; + default: + break; + } + } + + const String firmware_id(firmware_id_ptr); + + if(!firmware_id.empty()) { + if(_firmware_instance) { + res = _firmware_instance->create_dynamic_resource(firmware_id, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + false); + + if(res) { + res->set_register_uri(false); + + res->set_operation(operation); + res->set_value(value); + } + } + } + return res; +} + +bool M2MFirmware::set_resource_value(FirmwareResource resource, + const String &value) +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MFirmware::PackageUri == resource || + M2MFirmware::PackageName == resource || + M2MFirmware::PackageVersion == resource) { + if (value.size() < 256) { + if(value.empty()) { + res->clear_value(); + success = true; + } else { + success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length()); + } + } + } + } + return success; +} + +bool M2MFirmware::set_resource_value(FirmwareResource resource, + int64_t value) +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MFirmware::State == resource || + M2MFirmware::UpdateSupportedObjects == resource || + M2MFirmware::UpdateResult == resource) { + // If it is any of the above resource + // set the value of the resource. + if (check_value_range(resource, value)) { + + success = res->set_value(value); + } + } + } + return success; +} + +bool M2MFirmware::set_resource_value(FirmwareResource resource, + const uint8_t *value, + const uint32_t length) +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MFirmware::Package == resource) { + success = res->set_value(value,length); + } + } + return success; +} + +bool M2MFirmware::is_resource_present(FirmwareResource resource) const +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res) { + success = true; + } + return success; +} + +const char* M2MFirmware::resource_name(FirmwareResource resource) +{ + const char* res_name = ""; + switch(resource) { + case Package: + res_name = FIRMWARE_PACKAGE; + break; + case PackageUri: + res_name = FIRMWARE_PACKAGE_URI; + break; + case Update: + res_name = FIRMWARE_UPDATE; + break; + case State: + res_name = FIRMWARE_STATE; + break; + case UpdateSupportedObjects: + res_name = FIRMWARE_UPDATE_SUPPORTED_OBJECTS; + break; + case UpdateResult: + res_name = FIRMWARE_UPDATE_RESULT; + break; + case PackageName: + res_name = FIRMWARE_PACKAGE_NAME; + break; + case PackageVersion: + res_name = FIRMWARE_PACKAGE_VERSION; + break; + } + return res_name; +} + +uint16_t M2MFirmware::per_resource_count(FirmwareResource res) const +{ + uint16_t count = 0; + if(_firmware_instance) { + count = _firmware_instance->resource_count(resource_name(res)); + } + return count; +} + +uint16_t M2MFirmware::total_resource_count() const +{ + uint16_t count = 0; + if(_firmware_instance) { + count = _firmware_instance->resources().size(); + } + return count; +} + +uint32_t M2MFirmware::resource_value_buffer(FirmwareResource resource, + uint8_t *&data) const +{ + uint32_t size = 0; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MFirmware::Package == resource) { + res->get_value(data,size); + } + } + return size; +} + +M2MResource* M2MFirmware::get_resource(FirmwareResource res) const +{ + M2MResource* res_object = NULL; + if(_firmware_instance) { + const char* res_name_ptr = ""; + switch(res) { + case Package: + res_name_ptr = FIRMWARE_PACKAGE; + break; + case PackageUri: + res_name_ptr = FIRMWARE_PACKAGE_URI; + break; + case Update: + res_name_ptr = FIRMWARE_UPDATE; + break; + case State: + res_name_ptr = FIRMWARE_STATE; + break; + case UpdateSupportedObjects: + res_name_ptr = FIRMWARE_UPDATE_SUPPORTED_OBJECTS; + break; + case UpdateResult: + res_name_ptr = FIRMWARE_UPDATE_RESULT; + break; + case PackageName: + res_name_ptr = FIRMWARE_PACKAGE_NAME; + break; + case PackageVersion: + res_name_ptr = FIRMWARE_PACKAGE_VERSION; + break; + } + + res_object = _firmware_instance->resource(res_name_ptr); + } + return res_object; +} + +bool M2MFirmware::delete_resource(FirmwareResource resource) +{ + bool success = false; + if(M2MFirmware::UpdateSupportedObjects == resource || + M2MFirmware::PackageName == resource || + M2MFirmware::PackageVersion == resource) { + if(_firmware_instance) { + success = _firmware_instance->remove_resource(resource_name(resource)); + } + } + return success; +} + +int64_t M2MFirmware::resource_value_int(FirmwareResource resource) const +{ + int64_t value = -1; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MFirmware::State == resource || + M2MFirmware::UpdateSupportedObjects == resource || + M2MFirmware::UpdateResult == resource) { + + value = res->get_value_int(); + } + } + return value; +} + +String M2MFirmware::resource_value_string(FirmwareResource resource) const +{ + String value = ""; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MFirmware::PackageUri == resource || + M2MFirmware::PackageName == resource || + M2MFirmware::PackageVersion == resource) { + + value = res->get_value_string(); + } + } + return value; +} + +bool M2MFirmware::check_value_range(FirmwareResource resource, int64_t value) const +{ + bool success = false; + switch (resource) { + case UpdateSupportedObjects: + if(value == 0 || value == 1) { + success = true; + } + break; + case State: + if (value >= 0 && value <= 3) { + success = true; + M2MResource* updateRes = get_resource(M2MFirmware::Update); + if (updateRes){ + if (value == M2MFirmware::Downloaded) { + updateRes->set_operation(M2MBase::POST_ALLOWED); + } + else { + updateRes->set_operation(M2MBase::NOT_ALLOWED); + } + } + } + break; + case UpdateResult: + if (value >= 0 && value <= 7) { + success = true; + } + break; + default: + break; + } + return success; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2minterfacefactory.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +// Note: this macro is needed on armcc to get the the PRI*32 macros +// from inttypes.h in a C++ code. +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif + +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2mserver.h" +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2mfirmware.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mconfig.h" +#include "include/m2minterfaceimpl.h" +#include "mbed-trace/mbed_trace.h" + +#include <inttypes.h> + +#define TRACE_GROUP "mClt" + +M2MInterface* M2MInterfaceFactory::create_interface(M2MInterfaceObserver &observer, + const String &endpoint_name, + const String &endpoint_type, + const int32_t life_time, + const uint16_t listen_port, + const String &domain, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack, + const String &context_address) +{ + tr_debug("M2MInterfaceFactory::create_interface - IN"); + tr_debug("M2MInterfaceFactory::create_interface - parameters endpoint name : %s",endpoint_name.c_str()); + tr_debug("M2MInterfaceFactory::create_interface - parameters endpoint type : %s",endpoint_type.c_str()); + tr_debug("M2MInterfaceFactory::create_interface - parameters life time(in secs): %" PRId32,life_time); + tr_debug("M2MInterfaceFactory::create_interface - parameters Listen Port : %d",listen_port); + tr_debug("M2MInterfaceFactory::create_interface - parameters Binding Mode : %d",(int)mode); + tr_debug("M2MInterfaceFactory::create_interface - parameters NetworkStack : %d",(int)stack); + M2MInterfaceImpl *interface = NULL; + + + bool endpoint_type_valid = true; + if(!endpoint_type.empty()) { + if(endpoint_type.size() > MAX_ALLOWED_STRING_LENGTH){ + endpoint_type_valid = false; + } + } + + bool domain_valid = true; + if(!domain.empty()) { + if(domain.size() > MAX_ALLOWED_STRING_LENGTH){ + domain_valid = false; + } + } + + if(((life_time == -1) || (life_time >= MINIMUM_REGISTRATION_TIME)) && + !endpoint_name.empty() && (endpoint_name.size() <= MAX_ALLOWED_STRING_LENGTH) && + endpoint_type_valid && domain_valid) { + tr_debug("M2MInterfaceFactory::create_interface - Creating M2MInterfaceImpl"); + interface = new M2MInterfaceImpl(observer, endpoint_name, + endpoint_type, life_time, + listen_port, domain, mode, + stack, context_address); + + } + tr_debug("M2MInterfaceFactory::create_interface - OUT"); + return interface; +} + +M2MSecurity* M2MInterfaceFactory::create_security(M2MSecurity::ServerType server_type) +{ + tr_debug("M2MInterfaceFactory::create_security"); + M2MSecurity *security = new M2MSecurity(server_type); + return security; +} + +M2MServer* M2MInterfaceFactory::create_server() +{ + tr_debug("M2MInterfaceFactory::create_server"); + M2MServer *server = new M2MServer(); + return server; +} + +M2MDevice* M2MInterfaceFactory::create_device() +{ + tr_debug("M2MInterfaceFactory::create_device"); + M2MDevice* device = M2MDevice::get_instance(); + return device; +} + +M2MFirmware* M2MInterfaceFactory::create_firmware() +{ + tr_debug("M2MInterfaceFactory::create_firmware"); + M2MFirmware* firmware = M2MFirmware::get_instance(); + return firmware; +} + +M2MObject* M2MInterfaceFactory::create_object(const String &name) +{ + tr_debug("M2MInterfaceFactory::create_object : Name : %s", name.c_str()); + if(name.size() > MAX_ALLOWED_STRING_LENGTH || name.empty()){ + return NULL; + } + + M2MObject *object = NULL; + object = new M2MObject(name, M2MBase::stringdup(name.c_str())); + return object; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2minterfaceimpl.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1036 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <assert.h> +#include <stdlib.h> +#include "include/m2minterfaceimpl.h" +#include "include/eventdata.h" +#include "mbed-client/m2minterfaceobserver.h" +#include "mbed-client/m2mconnectionhandler.h" +#include "mbed-client/m2mconnectionsecurity.h" +#include "include/m2mnsdlinterface.h" +#include "include/nsdlaccesshelper.h" +#include "mbed-client/m2msecurity.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mtimer.h" +#include "mbed-trace/mbed_trace.h" + +#include <stdlib.h> + +#define TRACE_GROUP "mClt" + +#define RESOLVE_SEC_MODE(mode) ((mode == M2MInterface::TCP || mode == M2MInterface::TCP_QUEUE) ? M2MConnectionSecurity::TLS : M2MConnectionSecurity::DTLS) + +M2MInterfaceImpl::M2MInterfaceImpl(M2MInterfaceObserver& observer, + const String &ep_name, + const String &ep_type, + const int32_t l_time, + const uint16_t listen_port, + const String &dmn, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack, + const String &con_addr) +: _event_data(NULL), + _bootstrap_timer(NULL), + _server_port(0), + _listen_port(listen_port), + _endpoint_type(ep_type), + _domain( dmn), + _life_time(l_time), + _context_address(con_addr), + _register_server(NULL), + _queue_sleep_timer(*this), + _retry_timer(*this), + _callback_handler(NULL), + _max_states( STATE_MAX_STATES ), + _event_ignored(false), + _event_generated(false), + _reconnecting(false), + _retry_timer_expired(false), + _bootstrapped(true), // True as default to get it working with connector only configuration + _current_state(0), + _retry_count(0), + _binding_mode(mode), + _observer(observer), + _security_connection( new M2MConnectionSecurity( RESOLVE_SEC_MODE(mode) )), + _connection_handler(*this, _security_connection, mode, stack), + _nsdl_interface(*this), + _security(NULL) +{ + tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -IN"); + _nsdl_interface.create_endpoint(ep_name, + _endpoint_type, + _life_time, + _domain, + (uint8_t)_binding_mode & 0x07, // nsdl binding mode is only 3 least significant bits + _context_address); + + //Here we must use TCP still + __connection_handler = &_connection_handler; + _connection_handler.bind_connection(_listen_port); +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + _bootstrap_timer = new M2MTimer(*this); +#endif + tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -OUT"); +} + + +M2MInterfaceImpl::~M2MInterfaceImpl() +{ + tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - IN"); + _connection_handler.stop_listening(); + delete _bootstrap_timer; + _security_connection = NULL; + tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - OUT"); +} + +void M2MInterfaceImpl::bootstrap(M2MSecurity *security) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::bootstrap(M2MSecurity *security) - IN"); + if(!security) { + _observer.error(M2MInterface::InvalidParameters); + return; + } + // Transition to a new state based upon + // the current state of the state machine + M2MSecurityData* data = new M2MSecurityData(); + data->_object = security; + BEGIN_TRANSITION_MAP // - Current State - + TRANSITION_MAP_ENTRY (STATE_BOOTSTRAP) // state_idle + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_registered + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_waiting + END_TRANSITION_MAP(data) + if(_event_ignored) { + _event_ignored = false; + _observer.error(M2MInterface::NotAllowed); + } + tr_debug("M2MInterfaceImpl::bootstrap(M2MSecurity *security) - OUT"); +#else + _observer.error(M2MInterface::NotAllowed); +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::cancel_bootstrap() +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +//TODO: Do we need this ? +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::register_object(M2MSecurity *security, const M2MObjectList &object_list) +{ + tr_debug("M2MInterfaceImpl::register_object - IN"); + if(!security) { + _observer.error(M2MInterface::InvalidParameters); + return; + } + // Transition to a new state based upon + // the current state of the state machine + //TODO: manage register object in a list. + _register_server = security; + M2MRegisterData *data = new M2MRegisterData(); + data->_object = security; + data->_object_list = object_list; + BEGIN_TRANSITION_MAP // - Current State - + TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_idle + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait + TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_bootstrapped + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved + TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_registered + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed + TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_waiting + END_TRANSITION_MAP(data) + if(_event_ignored) { + _event_ignored = false; + _observer.error(M2MInterface::NotAllowed); + } + tr_debug("M2MInterfaceImpl::register_object - OUT"); +} + +void M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const uint32_t lifetime) +{ + tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const uint32_t lifetime)"); + M2MUpdateRegisterData *data = new M2MUpdateRegisterData(); + data->_object = security_object; + data->_lifetime = lifetime; + start_register_update(data); +} + +void M2MInterfaceImpl::update_registration(M2MSecurity *security_object, + const M2MObjectList &object_list, + const uint32_t lifetime) +{ + tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const M2MObjectList &object_list, const uint32_t lifetime)"); + M2MUpdateRegisterData *data = new M2MUpdateRegisterData(); + data->_object = security_object; + data->_lifetime = lifetime; + data->_object_list = object_list; + start_register_update(data); +} + +void M2MInterfaceImpl::unregister_object(M2MSecurity* /*security*/) +{ + tr_debug("M2MInterfaceImpl::unregister_object - IN"); + tr_debug("M2MInterfaceImpl::unregister_object - current state %d", _current_state); + // Transition to a new state based upon + // the current state of the state machine + BEGIN_TRANSITION_MAP // - Current State - + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_idle + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved + TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_registered + TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_update_registration + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed + TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_waiting + END_TRANSITION_MAP(NULL) + if(_event_ignored) { + _event_ignored = false; + _observer.error(M2MInterface::NotAllowed); + } + tr_debug("M2MInterfaceImpl::unregister_object - OUT"); +} + +void M2MInterfaceImpl::set_queue_sleep_handler(callback_handler handler) +{ + tr_debug("M2MInterfaceImpl::set_queue_sleep_handler()"); + _callback_handler = handler; +} + +void M2MInterfaceImpl::set_random_number_callback(random_number_cb callback) +{ + if(_security_connection) { + _security_connection->set_random_number_callback(callback); + } +} + +void M2MInterfaceImpl::set_entropy_callback(entropy_cb callback) +{ + if(_security_connection) { + _security_connection->set_entropy_callback(callback); + } +} + +void M2MInterfaceImpl::set_platform_network_handler(void *handler) +{ + tr_debug("M2MInterfaceImpl::set_platform_network_handler()"); + _connection_handler.set_platform_network_handler(handler); +} + +void M2MInterfaceImpl::coap_message_ready(uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr) +{ + tr_debug("M2MInterfaceImpl::coap_message_ready"); + if (_current_state != STATE_IDLE) { + internal_event(STATE_SENDING_COAP_DATA); + if(!_connection_handler.send_data(data_ptr,data_len,address_ptr)) { + internal_event( STATE_IDLE); + tr_error("M2MInterfaceImpl::coap_message_ready() - M2MInterface::NetworkError"); + if (!_reconnecting) { + _observer.error(M2MInterface::NetworkError); + } + } + } +} + +void M2MInterfaceImpl::client_registered(M2MServer *server_object) +{ + tr_debug("M2MInterfaceImpl::client_registered"); + _retry_count = 0; + internal_event(STATE_REGISTERED); + //Inform client is registered. + //TODO: manage register object in a list. + _observer.object_registered(_register_server,*server_object); +} + +void M2MInterfaceImpl::registration_updated(const M2MServer &server_object) +{ + tr_debug("M2MInterfaceImpl::registration_updated"); + internal_event(STATE_REGISTERED); + _observer.registration_updated(_register_server,server_object); +} + +void M2MInterfaceImpl::registration_error(uint8_t error_code, bool retry) +{ + tr_debug("M2MInterfaceImpl::registration_error code [%d]", error_code); + // Try to register again + if (retry) { + socket_error(M2MConnectionHandler::SOCKET_SEND_ERROR); + } else { + internal_event(STATE_IDLE); + _observer.error((M2MInterface::Error)error_code); + } +} + +void M2MInterfaceImpl::client_unregistered() +{ + tr_debug("M2MInterfaceImpl::client_unregistered()"); + internal_event(STATE_UNREGISTERED); + //TODO: manage register object in a list. + _observer.object_unregistered(_register_server); +} + +void M2MInterfaceImpl::bootstrap_done(M2MSecurity *security_object) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::bootstrap_done"); + _retry_count = 0; + _reconnecting = false; + _bootstrapped = true; + _bootstrap_timer->stop_timer(); + internal_event(STATE_BOOTSTRAPPED); + _observer.bootstrap_done(security_object); +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::bootstrap_wait(M2MSecurity *security_object) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::bootstrap_wait"); + _security = security_object; + internal_event(STATE_BOOTSTRAP_WAIT); +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::bootstrap_error() +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::bootstrap_error()"); + _bootstrapped = false; + _bootstrap_timer->stop_timer(); + internal_event(STATE_IDLE); + _observer.error(M2MInterface::BootstrapFailed); +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::coap_data_processed() +{ + tr_debug("M2MInterfaceImpl::coap_data_processed()"); + internal_event(STATE_COAP_DATA_PROCESSED); +} + +void M2MInterfaceImpl::value_updated(M2MBase *base) +{ + tr_debug("M2MInterfaceImpl::value_updated"); + if(base) { + M2MBase::BaseType type = base->base_type(); + _observer.value_updated(base, type); + } +} + +void M2MInterfaceImpl::data_available(uint8_t* data, + uint16_t data_size, + const M2MConnectionObserver::SocketAddress &address) +{ + tr_debug("M2MInterfaceImpl::data_available"); + ReceivedData *event = new ReceivedData(); + event->_data = data; + event->_size = data_size; + event->_address = &address; + internal_event(STATE_COAP_DATA_RECEIVED, event); +} + +void M2MInterfaceImpl::socket_error(uint8_t error_code, bool retry) +{ + tr_debug("M2MInterfaceImpl::socket_error: (%d), retry (%d), reconnecting (%d)", error_code, retry, _reconnecting); +#if MBED_CLIENT_RECONNECTION_LOOP < 1 + if (!_retry_timer_expired && _reconnecting) { + tr_debug("M2MInterfaceImpl::socket_error - retry timer running - return"); + return; + } +#endif + + M2MInterface::Error error = M2MInterface::ErrorNone; + switch (error_code) { + case M2MConnectionHandler::SSL_CONNECTION_ERROR: + error = M2MInterface::SecureConnectionFailed; + break; + case M2MConnectionHandler::DNS_RESOLVING_ERROR: + error = M2MInterface::DnsResolvingFailed; + break; + case M2MConnectionHandler::SOCKET_READ_ERROR: + error = M2MInterface::NetworkError; + break; + case M2MConnectionHandler::SOCKET_SEND_ERROR: + error = M2MInterface::NetworkError; + break; + case M2MConnectionHandler::SSL_HANDSHAKE_ERROR: + error = M2MInterface::SecureConnectionFailed; + break; + case M2MConnectionHandler::SOCKET_ABORT: + error = M2MInterface::NetworkError; + break; + default: + break; + } + + // Try to do reconnecting + if (retry) { + if (_retry_count < MBED_CLIENT_RECONNECTION_COUNT) { + _retry_count++; + } +#if MBED_CLIENT_RECONNECTION_LOOP > 0 + else { + tr_debug("M2MInterfaceImpl::socket_error - start again"); + _retry_count = 1; + _observer.error(error); + } +#else + else { + tr_debug("M2MInterfaceImpl::socket_error - no more retries"); + _connection_handler.stop_listening(); + _retry_timer.stop_timer(); + retry = false; + } +#endif + if (retry) { + internal_event(STATE_IDLE); + _reconnecting = true; + _connection_handler.stop_listening(); + int retry_time = MBED_CLIENT_RECONNECTION_INTERVAL * + MBED_CLIENT_RECONNECTION_COUNT * _retry_count * 1000; + _retry_timer_expired = false; + _retry_timer.start_timer(retry_time, + M2MTimerObserver::RetryTimer); + tr_debug("M2MInterfaceImpl::socket_error - reconnecting in %d(s), count %d/%d", retry_time / 1000, + _retry_count, MBED_CLIENT_RECONNECTION_COUNT); + } + } + // Inform application + if (!retry && M2MInterface::ErrorNone != error) { + tr_debug("M2MInterfaceImpl::socket_error - send error to application"); + _connection_handler.stop_listening(); + _retry_timer.stop_timer(); + _retry_count = 0; + _reconnecting = false; + _observer.error(error); + internal_event(STATE_IDLE); + } +} + +void M2MInterfaceImpl::address_ready(const M2MConnectionObserver::SocketAddress &address, + M2MConnectionObserver::ServerType server_type, + const uint16_t server_port) +{ + tr_debug("M2MInterfaceImpl::address_ready"); + ResolvedAddressData *data = new ResolvedAddressData(); + data->_address = &address; + data->_port = server_port; + if( M2MConnectionObserver::Bootstrap == server_type) { + tr_debug("M2MInterfaceImpl::address_ready() Server Type Bootstrap"); + internal_event(STATE_BOOTSTRAP_ADDRESS_RESOLVED, data); + } else { + tr_debug("M2MInterfaceImpl::address_ready() Server Type LWM2M"); + internal_event(STATE_REGISTER_ADDRESS_RESOLVED, data); + } +} + +void M2MInterfaceImpl::data_sent() +{ + tr_debug("M2MInterfaceImpl::data_sent()"); + if(_binding_mode == M2MInterface::UDP_QUEUE || + _binding_mode == M2MInterface::TCP_QUEUE || + _binding_mode == M2MInterface::SMS_QUEUE || + _binding_mode == M2MInterface::UDP_SMS_QUEUE) { + if(_callback_handler) { + _queue_sleep_timer.stop_timer(); + _queue_sleep_timer.start_timer(MBED_CLIENT_RECONNECTION_COUNT*MBED_CLIENT_RECONNECTION_INTERVAL*1000, + M2MTimerObserver::QueueSleep); + } + } + if (_current_state == STATE_BOOTSTRAP_WAIT) { + // For bootstrap we need to call bootstrap_done callback ONLY after we have + // sent the last ACK and ended in STATE_BOOTSTRAP_WAIT + M2MSecurity *sec = _security; + _security = NULL; + bootstrap_done(sec); + } + else { + internal_event(STATE_COAP_DATA_SENT); + } +} + +void M2MInterfaceImpl::timer_expired(M2MTimerObserver::Type type) +{ + tr_debug("M2MInterfaceImpl::timer_expired()"); + if(M2MTimerObserver::QueueSleep == type) { + if(_callback_handler) { + _callback_handler(); + } + } + else if (M2MTimerObserver::RetryTimer == type) { + _retry_timer_expired = true; + if (_bootstrapped) { + internal_event(STATE_REGISTER); + } else { + internal_event(STATE_BOOTSTRAP); + } + } + else if (M2MTimerObserver::BootstrapTimer == type) { + bootstrap_error(); + } +} + +// state machine sits here. +void M2MInterfaceImpl::state_idle(EventData* /*data*/) +{ + tr_debug("M2MInterfaceImpl::state_idle"); + _nsdl_interface.stop_timers(); +} + +void M2MInterfaceImpl::state_bootstrap(EventData *data) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::state_bootstrap"); + // Start with bootstrapping preparation + _bootstrapped = false; + M2MSecurityData *event = static_cast<M2MSecurityData *> (data); + if(!_security) { + M2MInterface::Error error = M2MInterface::InvalidParameters; + if (event) { + _security = event->_object; + if(_security) { + if(M2MSecurity::Bootstrap == _security->server_type()) { + tr_debug("M2MInterfaceImpl::state_bootstrap - server_type : M2MSecurity::Bootstrap"); + String server_address = _security->resource_value_string(M2MSecurity::M2MServerUri); + tr_debug("M2MInterfaceImpl::state_bootstrap - server_address %s", server_address.c_str()); + _bootstrap_timer->start_timer(MBED_CLIENT_RECONNECTION_COUNT * MBED_CLIENT_RECONNECTION_INTERVAL * 8 * 1000, + M2MTimerObserver::BootstrapTimer); + String coap; + if(server_address.compare(0,sizeof(COAP)-1,COAP) == 0) { + coap = COAP; + } + else if(server_address.compare(0,sizeof(COAPS)-1,COAPS) == 0) { + _security->resource_value_int(M2MSecurity::SecurityMode) != M2MSecurity::NoSecurity ? coap = COAPS: coap = ""; + } + if(!coap.empty()) { + server_address = server_address.substr(coap.size(), + server_address.size()-coap.size()); + + process_address(server_address, _server_ip_address, _server_port); + + tr_debug("M2MInterfaceImpl::state_bootstrap - IP address %s , Port %d", _server_ip_address.c_str(), _server_port); + // If bind and resolving server address succeed then proceed else + // return error to the application and go to Idle state. + if(!_server_ip_address.empty()) { + error = M2MInterface::ErrorNone; + _connection_handler.resolve_server_address(_server_ip_address, + _server_port, + M2MConnectionObserver::Bootstrap, + _security); + } + } + } + } + } + if (error != M2MInterface::ErrorNone) { + tr_error("M2MInterfaceImpl::state_bootstrap - set error as M2MInterface::InvalidParameters"); + internal_event(STATE_IDLE); + _observer.error(error); + } + } else { + _listen_port = rand() % 64511 + 1024; + _connection_handler.stop_listening(); + _connection_handler.bind_connection(_listen_port); + _connection_handler.resolve_server_address(_server_ip_address, + _server_port, + M2MConnectionObserver::Bootstrap, + _security); + } +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::state_bootstrap_address_resolved( EventData *data) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved"); + if (data) { + ResolvedAddressData *event = static_cast<ResolvedAddressData *> (data); + sn_nsdl_addr_s address; + + M2MInterface::NetworkStack stack = event->_address->_stack; + + if(M2MInterface::LwIP_IPv4 == stack) { + tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv4 address"); + address.type = SN_NSDL_ADDRESS_TYPE_IPV4; + } else if((M2MInterface::LwIP_IPv6 == stack) || + (M2MInterface::Nanostack_IPv6 == stack)) { + tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv6 address"); + address.type = SN_NSDL_ADDRESS_TYPE_IPV6; + } + address.port = event->_port; + address.addr_ptr = (uint8_t*)event->_address->_address; + address.addr_len = event->_address->_length; + _connection_handler.start_listening_for_data(); + + // Include domain id to be part of endpoint name + StringBuffer<M2MBase::MAX_PATH_SIZE> new_ep_name; + + if(!new_ep_name.ensure_space(_nsdl_interface.endpoint_name().size() + 1)) + { + tr_error("MM2MInterfaceImpl::state_bootstrap_address_resolved : name too long"); + _observer.error(M2MInterface::InvalidParameters); + return; + } + + new_ep_name.append(_nsdl_interface.endpoint_name().c_str()); + + if (!_domain.empty()) { + + if(!new_ep_name.ensure_space(_nsdl_interface.endpoint_name().size() + 1 + _domain.size() + 1)) + { + tr_error("MM2MInterfaceImpl::state_bootstrap_address_resolved : name + domain too long"); + _observer.error(M2MInterface::InvalidParameters); + return; + } + + new_ep_name.append('@'); + new_ep_name.append(_domain.c_str()); + + } + if(_nsdl_interface.create_bootstrap_resource(&address, new_ep_name.c_str())) { + tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : create_bootstrap_resource - success"); + internal_event(STATE_BOOTSTRAP_RESOURCE_CREATED); + } else{ + // If resource creation fails then inform error to application + tr_error("M2MInterfaceImpl::state_bootstrap_address_resolved : M2MInterface::InvalidParameters"); + internal_event(STATE_IDLE); + _observer.error(M2MInterface::InvalidParameters); + } + } +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::state_bootstrap_resource_created( EventData */*data*/) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::state_bootstrap_resource_created"); +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::state_bootstrapped( EventData */*data*/) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MInterfaceImpl::state_bootstrapped"); +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +void M2MInterfaceImpl::state_register(EventData *data) +{ + tr_debug("M2MInterfaceImpl::state_register"); + M2MRegisterData *event = static_cast<M2MRegisterData *> (data); + if (!_security) { + M2MInterface::Error error = M2MInterface::InvalidParameters; + // Start with registration preparation + if(event) { + _security = event->_object; + if(_security) { + if(M2MSecurity::M2MServer == _security->server_type()) { + tr_debug("M2MInterfaceImpl::state_register - server_type : M2MSecurity::M2MServer"); + if(_nsdl_interface.create_nsdl_list_structure(event->_object_list)) { + tr_debug("M2MInterfaceImpl::state_register - create_nsdl_list_structure - success"); + // If the nsdl resource structure is created successfully + String server_address = _security->resource_value_string(M2MSecurity::M2MServerUri); + tr_debug("M2MInterfaceImpl::state_register - server_address %s", server_address.c_str()); + String coap; + if(server_address.compare(0,sizeof(COAP)-1,COAP) == 0) { + coap = COAP; + } + else if(server_address.compare(0,sizeof(COAPS)-1,COAPS) == 0) { + _security->resource_value_int(M2MSecurity::SecurityMode) != M2MSecurity::NoSecurity ? coap = COAPS: coap = ""; + } + if(!coap.empty()) { + server_address = server_address.substr(coap.size(), + server_address.size() - coap.size()); + process_address(server_address, _server_ip_address, _server_port); + + tr_debug("M2MInterfaceImpl::state_register - IP address %s , Port %d", _server_ip_address.c_str(), _server_port); + if(!_server_ip_address.empty()) { + // Connection related errors are coming through callback + error = M2MInterface::ErrorNone; + _connection_handler.resolve_server_address(_server_ip_address,_server_port, + M2MConnectionObserver::LWM2MServer, + _security); + } + } + } + } + } + } + if (error != M2MInterface::ErrorNone) { + tr_error("M2MInterfaceImpl::state_register - set error as M2MInterface::InvalidParameters"); + internal_event(STATE_IDLE); + _observer.error(error); + } + } else { + _listen_port = rand() % 64511 + 1024; + _connection_handler.stop_listening(); + if (event) { + _nsdl_interface.create_nsdl_list_structure(event->_object_list); + } + _connection_handler.bind_connection(_listen_port); + _connection_handler.resolve_server_address(_server_ip_address,_server_port, + M2MConnectionObserver::LWM2MServer, + _security); + } +} + +void M2MInterfaceImpl::process_address(const String& server_address, String& ip_address, uint16_t& port) { + + int colonFound = server_address.find_last_of(':'); //10 + if(colonFound != -1) { + ip_address = server_address.substr(0,colonFound); + port = atoi(server_address.substr(colonFound+1, + server_address.size()-ip_address.size()).c_str()); + colonFound = ip_address.find_last_of(']'); + if(ip_address.compare(0,1,"[") == 0) { + if(colonFound == -1) { + ip_address.clear(); + } else { + ip_address = ip_address.substr(1,colonFound-1); + } + } else if(colonFound != -1) { + ip_address.clear(); + } + } +} + +void M2MInterfaceImpl::state_register_address_resolved( EventData *data) +{ + tr_debug("M2MInterfaceImpl::state_register_address_resolved"); + if(data) { + ResolvedAddressData *event = static_cast<ResolvedAddressData *> (data); + + sn_nsdl_addr_type_e address_type = SN_NSDL_ADDRESS_TYPE_IPV6; + + M2MInterface::NetworkStack stack = event->_address->_stack; + + if(M2MInterface::LwIP_IPv4 == stack) { + tr_debug("M2MInterfaceImpl::state_register_address_resolved : IPv4 address"); + address_type = SN_NSDL_ADDRESS_TYPE_IPV4; + } else if((M2MInterface::LwIP_IPv6 == stack) || + (M2MInterface::Nanostack_IPv6 == stack)) { + tr_debug("M2MInterfaceImpl::state_register_address_resolved : IPv6 address"); + address_type = SN_NSDL_ADDRESS_TYPE_IPV6; + } + _connection_handler.start_listening_for_data(); + if(!_nsdl_interface.send_register_message((uint8_t*)event->_address->_address,event->_address->_length, + event->_port, address_type)) { + // If resource creation fails then inform error to application + tr_error("M2MInterfaceImpl::state_register_address_resolved : M2MInterface::InvalidParameters"); + internal_event(STATE_IDLE); + _observer.error(M2MInterface::InvalidParameters); + } + } +} + +void M2MInterfaceImpl::state_registered( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_registered"); + _retry_count = 0; + _reconnecting = false; +} + +void M2MInterfaceImpl::state_update_registration(EventData *data) +{ + tr_debug("M2MInterfaceImpl::state_update_registration"); + if(data) { + M2MUpdateRegisterData *event = static_cast<M2MUpdateRegisterData *> (data); + // Create new resources if any + if (!event->_object_list.empty()) { + _nsdl_interface.create_nsdl_list_structure(event->_object_list); + } + _nsdl_interface.send_update_registration(event->_lifetime); + } +} + +void M2MInterfaceImpl::state_unregister( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_unregister"); + internal_event(STATE_SENDING_COAP_DATA); + if(!_nsdl_interface.send_unregister_message()) { + tr_error("M2MInterfaceImpl::state_unregister : M2MInterface::NotRegistered"); + internal_event(STATE_IDLE); + _observer.error(M2MInterface::NotRegistered); + } +} + +void M2MInterfaceImpl::state_unregistered( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_unregistered"); + internal_event(STATE_IDLE); +} + +void M2MInterfaceImpl::state_sending_coap_data( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_sending_coap_data"); + internal_event(STATE_WAITING); +} + +void M2MInterfaceImpl::state_coap_data_sent( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_coap_data_sent"); + internal_event(STATE_WAITING); +} + +void M2MInterfaceImpl::state_coap_data_received( EventData *data) +{ + tr_debug("M2MInterfaceImpl::state_coap_data_received"); + if(data) { + ReceivedData *event = static_cast<ReceivedData*> (data); + sn_nsdl_addr_s address; + + M2MInterface::NetworkStack stack = event->_address->_stack; + + if(M2MInterface::LwIP_IPv4 == stack) { + tr_debug("M2MInterfaceImpl::state_coap_data_received : IPv4 address"); + address.type = SN_NSDL_ADDRESS_TYPE_IPV4; + address.addr_len = 4; + } else if((M2MInterface::LwIP_IPv6 == stack) || + (M2MInterface::Nanostack_IPv6 == stack)) { + tr_debug("M2MInterfaceImpl::state_coap_data_received : IPv6 address"); + address.type = SN_NSDL_ADDRESS_TYPE_IPV6; + address.addr_len = 16; + } + address.port = event->_address->_port; + address.addr_ptr = (uint8_t*)event->_address->_address; + address.addr_len = event->_address->_length; + + // Process received data + internal_event(STATE_PROCESSING_COAP_DATA); + if(!_nsdl_interface.process_received_data(event->_data, + event->_size, + &address)) { + tr_error("M2MInterfaceImpl::state_coap_data_received : M2MInterface::ResponseParseFailed"); + _observer.error(M2MInterface::ResponseParseFailed); + } + } +} + +void M2MInterfaceImpl::state_processing_coap_data( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_processing_coap_data"); + internal_event(STATE_WAITING); +} + +void M2MInterfaceImpl::state_coap_data_processed( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_coap_data_processed"); + internal_event(STATE_WAITING); +} + +void M2MInterfaceImpl::state_waiting( EventData */*data*/) +{ + tr_debug("M2MInterfaceImpl::state_waiting"); +} + +// generates an external event. called once per external event +// to start the state machine executing +void M2MInterfaceImpl::external_event(uint8_t new_state, + EventData* p_data) +{ + tr_debug("M2MInterfaceImpl::external_event : new state %d", new_state); + // if we are supposed to ignore this event + if (new_state == EVENT_IGNORED) { + tr_debug("M2MInterfaceImpl::external_event : new state is EVENT_IGNORED"); + // just delete the event data, if any + if (p_data) { + delete p_data; + p_data = NULL; + } + _event_ignored = true; + } + else { + tr_debug("M2MInterfaceImpl::external_event : handle new state"); + // generate the event and execute the state engine + internal_event(new_state, p_data); + } +} + +// generates an internal event. called from within a state +// function to transition to a new state +void M2MInterfaceImpl::internal_event(uint8_t new_state, + EventData* p_data) +{ + tr_debug("M2MInterfaceImpl::internal_event : new state %d", new_state); + _event_data = p_data; + _event_generated = true; + _current_state = new_state; + state_engine(); +} + +// the state engine executes the state machine states +void M2MInterfaceImpl::state_engine (void) +{ + tr_debug("M2MInterfaceImpl::state_engine"); + EventData* p_data_temp = NULL; + + // while events are being generated keep executing states + while (_event_generated) { + p_data_temp = _event_data; // copy of event data pointer + _event_data = NULL; // event data used up, reset ptr + _event_generated = false; // event used up, reset flag + + assert(_current_state < _max_states); + + state_function( _current_state, p_data_temp ); + + // if event data was used, then delete it + if (p_data_temp) { + delete p_data_temp; + p_data_temp = NULL; + } + } +} + +void M2MInterfaceImpl::state_function( uint8_t current_state, EventData* data ) +{ + switch( current_state ) { + case STATE_IDLE: + M2MInterfaceImpl::state_idle(data); + break; + case STATE_BOOTSTRAP: + #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + M2MInterfaceImpl::state_bootstrap(data); + #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + break; + case STATE_BOOTSTRAP_ADDRESS_RESOLVED: + #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + M2MInterfaceImpl::state_bootstrap_address_resolved(data); + #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + break; + case STATE_BOOTSTRAP_RESOURCE_CREATED: + #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + M2MInterfaceImpl::state_bootstrap_resource_created(data); + #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + break; + case STATE_BOOTSTRAP_WAIT: + #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + // Do nothing, we're just waiting for data_sent callback + #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + break; + case STATE_BOOTSTRAPPED: + #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + M2MInterfaceImpl::state_bootstrapped(data); + #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + break; + case STATE_REGISTER: + M2MInterfaceImpl::state_register(data); + break; + case STATE_REGISTER_ADDRESS_RESOLVED: + M2MInterfaceImpl::state_register_address_resolved(data); + break; + case STATE_REGISTERED: + M2MInterfaceImpl::state_registered(data); + break; + case STATE_UPDATE_REGISTRATION: + M2MInterfaceImpl::state_update_registration(data); + break; + case STATE_UNREGISTER: + M2MInterfaceImpl::state_unregister(data); + break; + case STATE_UNREGISTERED: + M2MInterfaceImpl::state_unregistered(data); + break; + case STATE_SENDING_COAP_DATA: + M2MInterfaceImpl::state_sending_coap_data(data); + break; + case STATE_COAP_DATA_SENT: + M2MInterfaceImpl::state_coap_data_sent(data); + break; + case STATE_COAP_DATA_RECEIVED: + M2MInterfaceImpl::state_coap_data_received(data); + break; + case STATE_PROCESSING_COAP_DATA: + M2MInterfaceImpl::state_processing_coap_data(data); + break; + case STATE_COAP_DATA_PROCESSED: + M2MInterfaceImpl::state_coap_data_processed(data); + break; + case STATE_WAITING: + M2MInterfaceImpl::state_waiting(data); + break; + } +} + +void M2MInterfaceImpl::start_register_update(M2MUpdateRegisterData *data) { + tr_debug("M2MInterfaceImpl::start_register_update - IN"); + if(!data || (data->_lifetime != 0 && (data->_lifetime < MINIMUM_REGISTRATION_TIME))) { + _observer.error(M2MInterface::InvalidParameters); + } + BEGIN_TRANSITION_MAP // - Current State - + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_idle + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved + TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_registered + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data + TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed + TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_waiting + END_TRANSITION_MAP(data) + if(_event_ignored) { + _event_ignored = false; + if (!_reconnecting) + _observer.error(M2MInterface::NotAllowed); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mnsdlinterface.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1655 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +// Note: this macro is needed on armcc to get the the PRI*32 macros +// from inttypes.h in a C++ code. +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif + +// Note: this macro is needed on armcc to get the the limit macros like UINT16_MAX +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS +#endif + + +#include "include/nsdlaccesshelper.h" +#include "include/m2mnsdlobserver.h" +#include "include/m2mtlvdeserializer.h" +#include "include/m2mtlvserializer.h" +#include "include/m2mnsdlinterface.h" +#include "mbed-client/m2mstring.h" +#include "mbed-client/m2msecurity.h" +#include "mbed-client/m2mserver.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-trace/mbed_trace.h" +#include "mbed-client/m2mtimer.h" +#include "source/libNsdl/src/include/sn_grs.h" + +#include <assert.h> +#include <inttypes.h> +#include <stdlib.h> + +#define BUFFER_SIZE 21 +#define TRACE_GROUP "mClt" + +M2MNsdlInterface::M2MNsdlInterface(M2MNsdlObserver &observer) +: _observer(observer), + _endpoint(NULL), + _nsdl_handle(NULL), + _security(NULL), + _server(), + _nsdl_exceution_timer(new M2MTimer(*this)), + _registration_timer(new M2MTimer(*this)), + _counter_for_nsdl(0), + _bootstrap_id(0), + _unregister_ongoing(false), + _identity_accepted(false) +{ + tr_debug("M2MNsdlInterface::M2MNsdlInterface()"); + __nsdl_interface_list.push_back(this); + _sn_nsdl_address.addr_len = 0; + _sn_nsdl_address.addr_ptr = NULL; + _sn_nsdl_address.port = 0; + _sn_nsdl_address.type = SN_NSDL_ADDRESS_TYPE_NONE; + + // This initializes libCoap and libNsdl + // Parameters are function pointers to used memory allocation + // and free functions in structure and used functions for sending + // and receiving purposes. + _nsdl_handle = sn_nsdl_init(&(__nsdl_c_send_to_server), &(__nsdl_c_received_from_server), + &(__nsdl_c_memory_alloc), &(__nsdl_c_memory_free)); + + initialize(); +} + +M2MNsdlInterface::~M2MNsdlInterface() +{ + tr_debug("M2MNsdlInterface::~M2MNsdlInterface() - IN"); + if(_endpoint) { + memory_free(_endpoint->endpoint_name_ptr); + memory_free(_endpoint->lifetime_ptr); + memory_free(_endpoint->location_ptr); + memory_free(_endpoint); + } + delete _nsdl_exceution_timer; + delete _registration_timer; + _object_list.clear(); + _security = NULL; + + sn_nsdl_destroy(_nsdl_handle); + _nsdl_handle = NULL; + + M2MNsdlInterfaceList::const_iterator it; + it = __nsdl_interface_list.begin(); + int index = 0; + for (; it!=__nsdl_interface_list.end(); it++) { + if ((*it) == this) { + __nsdl_interface_list.erase(index); + break; + } + index++; + } + tr_debug("M2MNsdlInterface::~M2MNsdlInterface() - OUT"); +} + +bool M2MNsdlInterface::initialize() +{ + tr_debug("M2MNsdlInterface::initialize()"); + bool success = false; + + //Sets the packet retransmission attempts and time interval + sn_nsdl_set_retransmission_parameters(_nsdl_handle, + MBED_CLIENT_RECONNECTION_COUNT, + MBED_CLIENT_RECONNECTION_INTERVAL); + + //Allocate the memory for endpoint + _endpoint = (sn_nsdl_ep_parameters_s*)memory_alloc(sizeof(sn_nsdl_ep_parameters_s)); + if(_endpoint) { + memset(_endpoint, 0, sizeof(sn_nsdl_ep_parameters_s)); + success = true; + } + return success; +} + +void M2MNsdlInterface::create_endpoint(const String &name, + const String &type, + const int32_t life_time, + const String &domain, + const uint8_t mode, + const String &/*context_address*/) +{ + tr_debug("M2MNsdlInterface::create_endpoint( name %s type %s lifetime %" PRId32 ", domain %s, mode %d)", + name.c_str(), type.c_str(), life_time, domain.c_str(), mode); + _endpoint_name = name; + if(_endpoint){ + memset(_endpoint, 0, sizeof(sn_nsdl_ep_parameters_s)); + if(!_endpoint_name.empty()) { + memory_free(_endpoint->endpoint_name_ptr); + _endpoint->endpoint_name_ptr = alloc_string_copy((uint8_t*)_endpoint_name.c_str(), _endpoint_name.length()); + _endpoint->endpoint_name_len = _endpoint_name.length(); + } + if(!type.empty()) { + _endpoint->type_ptr = (uint8_t*)type.c_str(); + _endpoint->type_len = type.length(); + } + if(!domain.empty()) { + _endpoint->domain_name_ptr = (uint8_t*)domain.c_str(); + _endpoint->domain_name_len = domain.length(); + } + _endpoint->binding_and_mode = (sn_nsdl_oma_binding_and_mode_t)mode; + + // If lifetime is less than zero then leave the field empty + if( life_time > 0) { + set_endpoint_lifetime_buffer(life_time); + } + } +} + +void M2MNsdlInterface::set_endpoint_lifetime_buffer(int lifetime) +{ + // max len of "-9223372036854775808" plus zero termination + char buffer[20+1]; + + uint32_t size = m2m::itoa_c(lifetime, buffer); + + if (_endpoint && size <= sizeof(buffer)) { + _endpoint->lifetime_ptr = alloc_string_copy((uint8_t*)buffer, size); + if(_endpoint->lifetime_ptr) { + _endpoint->lifetime_len = size; + } else { + _endpoint->lifetime_len = 0; + } + } +} + + +void M2MNsdlInterface::delete_endpoint() +{ + tr_debug("M2MNsdlInterface::delete_endpoint()"); + if(_endpoint) { + free(_endpoint->lifetime_ptr); + + memory_free(_endpoint); + _endpoint = NULL; + } +} + +bool M2MNsdlInterface::create_nsdl_list_structure(const M2MObjectList &object_list) +{ + tr_debug("M2MNsdlInterface::create_nsdl_list_structure()"); + bool success = false; + if(!object_list.empty()) { + tr_debug("M2MNsdlInterface::create_nsdl_list_structure - Object count is %d", object_list.size()); + M2MObjectList::const_iterator it; + it = object_list.begin(); + for ( ; it != object_list.end(); it++ ) { + // Create NSDL structure for all Objects inside + success = create_nsdl_object_structure(*it); + add_object_to_list(*it); + } + } + return success; +} + +bool M2MNsdlInterface::remove_nsdl_resource(M2MBase *base) +{ + sn_nsdl_dynamic_resource_parameters_s* resource = base->get_nsdl_resource(); + return sn_nsdl_pop_resource(_nsdl_handle, resource); +} + +bool M2MNsdlInterface::create_bootstrap_resource(sn_nsdl_addr_s *address, const String &bootstrap_endpoint_name) +{ +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MNsdlInterface::create_bootstrap_resource()"); + _identity_accepted = false; + bool success = false; + sn_nsdl_bs_ep_info_t bootstrap_endpoint; + tr_debug("M2MNsdlInterface::create_bootstrap_resource() - endpoint name: %s", bootstrap_endpoint_name.c_str()); + if (_endpoint->endpoint_name_ptr) { + memory_free(_endpoint->endpoint_name_ptr); + } + + _endpoint->endpoint_name_ptr = alloc_string_copy((uint8_t*)bootstrap_endpoint_name.c_str(), bootstrap_endpoint_name.length()); + _endpoint->endpoint_name_len = bootstrap_endpoint_name.length(); + if(_bootstrap_id == 0) { + _bootstrap_id = sn_nsdl_oma_bootstrap(_nsdl_handle, + address, + _endpoint, + &bootstrap_endpoint); + tr_debug("M2MNsdlInterface::create_bootstrap_resource - _bootstrap_id %d", _bootstrap_id); + success = _bootstrap_id != 0; + } + return success; +#else + (void)address; + (void)bootstrap_endpoint_name; + return false; +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE +} + +bool M2MNsdlInterface::send_register_message(uint8_t* address, + uint8_t address_length, + const uint16_t port, + sn_nsdl_addr_type_e address_type) +{ + tr_debug("M2MNsdlInterface::send_register_message()"); + _nsdl_exceution_timer->stop_timer(); + _nsdl_exceution_timer->start_timer(ONE_SECOND_TIMER * 1000, + M2MTimerObserver::NsdlExecution, + false); + bool success = false; + if(set_NSP_address(_nsdl_handle, address, address_length, port, address_type) == 0) { + success = sn_nsdl_register_endpoint(_nsdl_handle,_endpoint) != 0; + } + return success; +} + +bool M2MNsdlInterface::send_update_registration(const uint32_t lifetime) +{ + tr_debug("M2MNsdlInterface::send_update_registration( lifetime %" PRIu32 ")", lifetime); + bool success = false; + create_nsdl_list_structure(_object_list); + + //If Lifetime value is 0, then don't change the existing lifetime value + if(lifetime != 0) { + if(_endpoint && _endpoint->lifetime_ptr) { + memory_free(_endpoint->lifetime_ptr); + _endpoint->lifetime_ptr = NULL; + _endpoint->lifetime_len = 0; + } + set_endpoint_lifetime_buffer(lifetime); + + _registration_timer->stop_timer(); + _registration_timer->start_timer(registration_time() * 1000, + M2MTimerObserver::Registration, + false); + if(_nsdl_handle && + _endpoint && _endpoint->lifetime_ptr) { + tr_debug("M2MNsdlInterface::send_update_registration - new lifetime value"); + success = sn_nsdl_update_registration(_nsdl_handle, + _endpoint->lifetime_ptr, + _endpoint->lifetime_len) != 0; + } + } else { + if(_nsdl_handle) { + tr_debug("M2MNsdlInterface::send_update_registration - regular update"); + success = sn_nsdl_update_registration(_nsdl_handle, NULL, 0) != 0; + } + } + return success; +} + +bool M2MNsdlInterface::send_unregister_message() +{ + tr_debug("M2MNsdlInterface::send_unregister_message"); + if (_unregister_ongoing) { + tr_debug("M2MNsdlInterface::send_unregister_message - unregistration already in progress"); + return true; + } + + bool success = false; + _unregister_ongoing = true; + success = sn_nsdl_unregister_endpoint(_nsdl_handle) != 0; + return success; +} + +// XXX: move these to common place, no need to copy these wrappers to multiple places: +void *M2MNsdlInterface::memory_alloc(uint16_t size) +{ + if(size) + return malloc(size); + else + return 0; +} + +void M2MNsdlInterface::memory_free(void *ptr) +{ + if(ptr) + free(ptr); +} + +uint8_t* M2MNsdlInterface::alloc_string_copy(const uint8_t* source, uint16_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size + 1); + if (result) { + memcpy(result, source, size); + result[size] = '\0'; + } + return result; +} + +uint8_t M2MNsdlInterface::send_to_server_callback(struct nsdl_s * /*nsdl_handle*/, + sn_nsdl_capab_e /*protocol*/, + uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address) +{ + tr_debug("M2MNsdlInterface::send_to_server_callback()"); + _observer.coap_message_ready(data_ptr,data_len,address); + return 1; +} + +uint8_t M2MNsdlInterface::received_from_server_callback(struct nsdl_s *nsdl_handle, + sn_coap_hdr_s *coap_header, + sn_nsdl_addr_s *address) +{ + _observer.coap_data_processed(); + uint8_t value = 0; + if(nsdl_handle && coap_header) { + tr_debug("M2MNsdlInterface::received_from_server_callback - incoming msg id:%" PRIu16, coap_header->msg_id); + tr_debug("M2MNsdlInterface::received_from_server_callback - registration id:%" PRIu16, nsdl_handle->register_msg_id); + tr_debug("M2MNsdlInterface::received_from_server_callback - unregistration id:%" PRIu16, nsdl_handle->unregister_msg_id); + tr_debug("M2MNsdlInterface::received_from_server_callback - update registration id:%" PRIu16, nsdl_handle->update_register_msg_id); + bool is_bootstrap_msg = address && (nsdl_handle->oma_bs_address_len == address->addr_len) && + (nsdl_handle->oma_bs_port == address->port) && + !memcmp(nsdl_handle->oma_bs_address_ptr, address->addr_ptr, nsdl_handle->oma_bs_address_len); + if(coap_header->msg_id == nsdl_handle->register_msg_id) { + if(coap_header->msg_code == COAP_MSG_CODE_RESPONSE_CREATED) { + tr_debug("M2MNsdlInterface::received_from_server_callback - registration callback"); + _observer.client_registered(&_server); + // If lifetime is less than zero then leave the field empty + if(coap_header->options_list_ptr) { + memory_free(_endpoint->lifetime_ptr); + _endpoint->lifetime_ptr = NULL; + _endpoint->lifetime_len = 0; + + uint32_t max_time = coap_header->options_list_ptr->max_age; + // If lifetime is less than zero then leave the field empty + if( max_time > 0) { + set_endpoint_lifetime_buffer(max_time); + } + if(coap_header->options_list_ptr->location_path_ptr) { + + memory_free(_endpoint->location_ptr); + + _endpoint->location_ptr = alloc_string_copy(coap_header->options_list_ptr->location_path_ptr, coap_header->options_list_ptr->location_path_len); + if (_endpoint->location_ptr != NULL) { + _endpoint->location_len = coap_header->options_list_ptr->location_path_len; + } + sn_nsdl_set_endpoint_location(_nsdl_handle,_endpoint->location_ptr,_endpoint->location_len); + } + } + if(_endpoint->lifetime_ptr) { + _registration_timer->stop_timer(); + _registration_timer->start_timer(registration_time() * 1000, + M2MTimerObserver::Registration, + false); + } + } else { + tr_error("M2MNsdlInterface::received_from_server_callback - registration error %d", coap_header->msg_code); + // Try to do clean register again + if(COAP_MSG_CODE_RESPONSE_BAD_REQUEST == coap_header->msg_code || + COAP_MSG_CODE_RESPONSE_FORBIDDEN == coap_header->msg_code) { + _observer.registration_error(M2MInterface::InvalidParameters, false); + } else { + _observer.registration_error(M2MInterface::NetworkError, true); + } + + } + } else if(coap_header->msg_id == nsdl_handle->unregister_msg_id) { + _unregister_ongoing = false; + tr_debug("M2MNsdlInterface::received_from_server_callback - unregistration callback"); + if(coap_header->msg_code == COAP_MSG_CODE_RESPONSE_DELETED) { + _registration_timer->stop_timer(); + _observer.client_unregistered(); + } else { + tr_error("M2MNsdlInterface::received_from_server_callback - unregistration error %d", coap_header->msg_code); + M2MInterface::Error error = interface_error(coap_header); + _observer.registration_error(error); + } + } else if(coap_header->msg_id == nsdl_handle->update_register_msg_id) { + if(coap_header->msg_code == COAP_MSG_CODE_RESPONSE_CHANGED) { + tr_debug("M2MNsdlInterface::received_from_server_callback - registration_updated successfully"); + _observer.registration_updated(_server); + } else { + tr_error("M2MNsdlInterface::received_from_server_callback - registration_updated failed %d", coap_header->msg_code); + _registration_timer->stop_timer(); + sn_nsdl_register_endpoint(_nsdl_handle,_endpoint); + } + } +#ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + else if(coap_header->msg_id == nsdl_handle->bootstrap_msg_id) { + tr_debug("M2MNsdlInterface::received_from_server_callback - bootstrap"); + _bootstrap_id = 0; + M2MInterface::Error error = interface_error(coap_header); + if(error != M2MInterface::ErrorNone) { + handle_bootstrap_error(); + } else { + _identity_accepted = true; + } + } +#endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE + else { + + sn_coap_hdr_s *coap_response = NULL; + bool execute_value_updated = false; + M2MObjectInstance *obj_instance = NULL; + String resource_name; + + if(COAP_MSG_CODE_REQUEST_PUT == coap_header->msg_code) { + if (is_bootstrap_msg) { + handle_bootstrap_put_message(coap_header, address); + } + else{ + tr_debug("M2MNsdlInterface::received_from_server_callback - Method not allowed (PUT)."); + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED); + } + } + else if(COAP_MSG_CODE_REQUEST_DELETE == coap_header->msg_code) { + if (is_bootstrap_msg) { + handle_bootstrap_delete(coap_header, address); + } + else{ + tr_debug("M2MNsdlInterface::received_from_server_callback - Method not allowed (DELETE)."); + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED); + } + } + else if(COAP_MSG_CODE_REQUEST_POST == coap_header->msg_code) { + if(is_bootstrap_msg) { + handle_bootstrap_finished(coap_header, address); + } + else if(coap_header->uri_path_ptr) { + + resource_name = coap_to_string(coap_header->uri_path_ptr, + coap_header->uri_path_len); + + String object_name; + int slash_found = resource_name.find_last_of('/'); + //The POST operation here is only allowed for non-existing object instances + if(slash_found != -1) { + object_name = resource_name.substr(0,slash_found); + if( object_name.find_last_of('/') != -1){ + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + COAP_MSG_CODE_RESPONSE_NOT_FOUND); + } else { + int32_t instance_id = atoi(resource_name.substr(slash_found+1, + resource_name.size()-object_name.size()).c_str()); + M2MBase* base = find_resource(object_name); + if(base && (instance_id >= 0) && (instance_id < UINT16_MAX)) { + if(coap_header->payload_ptr) { + M2MObject* object = static_cast<M2MObject*> (base); + obj_instance = object->create_object_instance(instance_id); + if(obj_instance) { + obj_instance->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + coap_response = obj_instance->handle_post_request(_nsdl_handle, + coap_header, + this, + execute_value_updated); + } + if(coap_response && coap_response->msg_code != COAP_MSG_CODE_RESPONSE_CREATED) { + //Invalid request so remove created ObjectInstance + object->remove_object_instance(instance_id); + } else { + tr_debug("M2MNsdlInterface::received_from_server_callback - Send Update registration for Create"); + send_update_registration(); + } + } else { + tr_debug("M2MNsdlInterface::received_from_server_callback - Missing Payload - Cannot create"); + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + COAP_MSG_CODE_RESPONSE_BAD_REQUEST); + } + } else { //if(base) + tr_debug("M2MNsdlInterface::received_from_server_callback - Missing BASE - Cannot create"); + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED); + } + } + } else{ // if(slash_found != -1) + tr_debug("M2MNsdlInterface::received_from_server_callback - slash_found - Cannot create"); + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + COAP_MSG_CODE_RESPONSE_NOT_FOUND); + } + + } + } + else if(COAP_MSG_CODE_EMPTY == coap_header->msg_code) { + if (COAP_MSG_TYPE_RESET == coap_header->msg_type) { + // Cancel ongoing observation + tr_error("M2MNsdlInterface::received_from_server_callback() - RESET message"); + M2MBase *base = find_resource("", coap_header->token_ptr, coap_header->token_len); + if (base) { + M2MBase::BaseType type = base->base_type(); + switch (type) { + case M2MBase::Object: + base->remove_observation_level(M2MBase::O_Attribute); + break; + case M2MBase::Resource: + base->remove_observation_level(M2MBase::R_Attribute); + break; + case M2MBase::ObjectInstance: + base->remove_observation_level(M2MBase::OI_Attribute); + break; + default: + break; + } + base->set_under_observation(false, this); + } + } else { + tr_debug("M2MNsdlInterface::received_from_server_callback - Empty ACK, msg id: %d", coap_header->msg_id); + M2MBase *base = find_resource("", coap_header->token_ptr, coap_header->token_len); + if (base) { + // Supported only in Resource level + if (M2MBase::Resource == base->base_type()) { + M2MResource *resource = static_cast<M2MResource *> (base); + resource->notification_sent(); + } + } + } + } + + if(coap_response) { + tr_debug("M2MNsdlInterface::received_from_server_callback - send CoAP response"); + (sn_nsdl_send_coap_message(_nsdl_handle, address, coap_response) == 0) ? value = 0 : value = 1; + sn_nsdl_release_allocated_coap_msg_mem(_nsdl_handle, coap_response); + } + + if (execute_value_updated) { + value_updated(obj_instance, resource_name); + } + + } + } + return value; +} + +uint8_t M2MNsdlInterface::resource_callback(struct nsdl_s */*nsdl_handle*/, + sn_coap_hdr_s *received_coap_header, + sn_nsdl_addr_s *address, + sn_nsdl_capab_e /*nsdl_capab*/) +{ + tr_debug("M2MNsdlInterface::resource_callback()"); + _observer.coap_data_processed(); + uint8_t result = 1; + sn_coap_hdr_s *coap_response = NULL; + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 4.00 + String resource_name = coap_to_string(received_coap_header->uri_path_ptr, + received_coap_header->uri_path_len); + tr_debug("M2MNsdlInterface::resource_callback() - resource_name %s", resource_name.c_str()); + bool execute_value_updated = false; + M2MBase* base = find_resource(resource_name); + if(base) { + if(COAP_MSG_CODE_REQUEST_GET == received_coap_header->msg_code) { + coap_response = base->handle_get_request(_nsdl_handle, received_coap_header,this); + } else if(COAP_MSG_CODE_REQUEST_PUT == received_coap_header->msg_code) { + coap_response = base->handle_put_request(_nsdl_handle, received_coap_header, this, execute_value_updated); + } else if(COAP_MSG_CODE_REQUEST_POST == received_coap_header->msg_code) { + if(base->base_type() == M2MBase::ResourceInstance) { + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + } else { + coap_response = base->handle_post_request(_nsdl_handle, + received_coap_header, + this, + execute_value_updated, + address); + } + } else if(COAP_MSG_CODE_REQUEST_DELETE == received_coap_header->msg_code) { + // Delete the object instance + tr_debug("M2MNsdlInterface::resource_callback() - DELETE the object instance"); + M2MBase::BaseType type = base->base_type(); + if(M2MBase::ObjectInstance == type) { + M2MBase* base_object = find_resource(base->name()); + if(base_object) { + M2MObject *object = static_cast<M2MObject*> (base_object); + int slash_found = resource_name.find_last_of('/'); + // Object instance validty checks done in upper level, no need for error handling + if(slash_found != -1) { + String object_name; + object_name = resource_name.substr(slash_found + 1, resource_name.length()); + if (object->remove_object_instance(strtoul( + object_name.c_str(), + NULL, + 10))) { + msg_code = COAP_MSG_CODE_RESPONSE_DELETED; + } + } + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00 + } + } + } else { + tr_debug("M2MNsdlInterface::resource_callback() - Resource NOT FOUND"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00 + } + if(!coap_response) { + coap_response = sn_nsdl_build_response(_nsdl_handle, + received_coap_header, + msg_code); + } + if(coap_response && + coap_response->coap_status != COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVING && + coap_response->msg_code != COAP_MSG_CODE_EMPTY) { + + tr_debug("M2MNsdlInterface::resource_callback() - send CoAP response"); + (sn_nsdl_send_coap_message(_nsdl_handle, address, coap_response) == 0) ? result = 0 : result = 1; + if(coap_response->payload_ptr) { + free(coap_response->payload_ptr); + coap_response->payload_ptr = NULL; + } + } + // If the external blockwise storing is enabled call value updated once all the blocks have been received + if (execute_value_updated && + coap_response && + coap_response->coap_status != COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVING) { + value_updated(base,resource_name); + } + + sn_nsdl_release_allocated_coap_msg_mem(_nsdl_handle, coap_response); + return result; +} + +bool M2MNsdlInterface::process_received_data(uint8_t *data, + uint16_t data_size, + sn_nsdl_addr_s *address) +{ + tr_debug("M2MNsdlInterface::process_received_data( data size %d)", data_size); + return (0 == sn_nsdl_process_coap(_nsdl_handle, + data, + data_size, + address)) ? true : false; +} + +void M2MNsdlInterface::stop_timers() +{ + tr_debug("M2MNsdlInterface::stop_timers()"); + if(_registration_timer) { + _registration_timer->stop_timer(); + } + if (_nsdl_exceution_timer) { + _nsdl_exceution_timer->stop_timer(); + } + _bootstrap_id = 0; + _unregister_ongoing = false; +} + +void M2MNsdlInterface::timer_expired(M2MTimerObserver::Type type) +{ + if(M2MTimerObserver::NsdlExecution == type) { + sn_nsdl_exec(_nsdl_handle, _counter_for_nsdl); + _counter_for_nsdl++; + } else if(M2MTimerObserver::Registration == type) { + tr_debug("M2MNsdlInterface::timer_expired - M2MTimerObserver::Registration - Send update registration"); + send_update_registration(); + } +} + +void M2MNsdlInterface::observation_to_be_sent(M2MBase *object, + uint16_t obs_number, + m2m::Vector<uint16_t> changed_instance_ids, + bool send_object) +{ + __mutex_claim(); + if(object) { + tr_debug("M2MNsdlInterface::observation_to_be_sent()"); + M2MBase::BaseType type = object->base_type(); + if(type == M2MBase::Object) { + send_object_observation(static_cast<M2MObject*> (object), + obs_number, + changed_instance_ids, + send_object); + } else if(type == M2MBase::ObjectInstance) { + send_object_instance_observation(static_cast<M2MObjectInstance*> (object), obs_number); + } else if(type == M2MBase::Resource) { + send_resource_observation(static_cast<M2MResource*> (object), obs_number); + } + } + __mutex_release(); +} + +void M2MNsdlInterface::send_delayed_response(M2MBase *base) +{ + __mutex_claim(); + tr_debug("M2MNsdlInterface::send_delayed_response()"); + M2MResource *resource = NULL; + if(base) { + if(M2MBase::Resource == base->base_type()) { + resource = static_cast<M2MResource *> (base); + } + if(resource) { + sn_coap_hdr_s * coap_response = static_cast<sn_coap_hdr_s *>(malloc(sizeof(sn_coap_hdr_s))); + if(coap_response) { + memset(coap_response,0,sizeof(sn_coap_hdr_s)); + + coap_response->msg_type = COAP_MSG_TYPE_CONFIRMABLE; + coap_response->msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + resource->get_delayed_token(coap_response->token_ptr,coap_response->token_len); + + uint32_t length = 0; + resource->get_value(coap_response->payload_ptr, length); + coap_response->payload_len = length; + + sn_nsdl_send_coap_message(_nsdl_handle, _nsdl_handle->nsp_address_ptr->omalw_address_ptr, coap_response); + + if(coap_response->payload_ptr) { + free(coap_response->payload_ptr); + coap_response->payload_ptr = NULL; + } + if(coap_response->token_ptr) { + free(coap_response->token_ptr); + coap_response->token_ptr = NULL; + } + free(coap_response); + } + } + } + __mutex_release(); +} + +void M2MNsdlInterface::resource_to_be_deleted(M2MBase *base) +{ + __mutex_claim(); + remove_nsdl_resource(base); + __mutex_release(); +} + +void M2MNsdlInterface::value_updated(M2MBase *base, + const String &object_name) +{ + tr_debug("M2MNsdlInterface::value_updated()"); + if(base) { + switch(base->base_type()) { + case M2MBase::Object: + create_nsdl_object_structure(static_cast<M2MObject*> (base)); + break; + case M2MBase::ObjectInstance: + create_nsdl_object_instance_structure(static_cast<M2MObjectInstance*> (base)); + break; + case M2MBase::Resource: { + M2MResource* resource = static_cast<M2MResource*> (base); + create_nsdl_resource_structure(resource, + resource->supports_multiple_instances()); + } + break; + case M2MBase::ResourceInstance: { + M2MResourceInstance* instance = static_cast<M2MResourceInstance*> (base); + create_nsdl_resource(instance); + } + break; + } + } + + if (base && base->is_value_updated_function_set()) { + base->execute_value_updated(base->name()); + } + else { + _observer.value_updated(base); + } +} + +void M2MNsdlInterface::remove_object(M2MBase *object) +{ + __mutex_claim(); + tr_debug("M2MNsdlInterface::remove_object()"); + M2MObject* rem_object = static_cast<M2MObject*> (object); + if(rem_object && !_object_list.empty()) { + M2MObjectList::const_iterator it; + it = _object_list.begin(); + int index = 0; + for ( ; it != _object_list.end(); it++, index++ ) { + if((*it) == rem_object) { + _object_list.erase(index); + break; + } + } + } + if(_object_list.empty()) { + _object_list.clear(); + } + __mutex_release(); +} + +bool M2MNsdlInterface::create_nsdl_object_structure(M2MObject *object) +{ + tr_debug("M2MNsdlInterface::create_nsdl_object_structure()"); + bool success = false; + if(object) { + M2MObjectInstanceList instance_list = object->instances(); + tr_debug("M2MNsdlInterface::create_nsdl_object_structure - Object Instance count %d", instance_list.size()); + if(!instance_list.empty()) { + M2MObjectInstanceList::const_iterator it; + it = instance_list.begin(); + for ( ; it != instance_list.end(); it++ ) { + // Create NSDL structure for all object instances inside + success = create_nsdl_object_instance_structure(*it); + } + } + } + if(object && object->operation() != M2MBase::NOT_ALLOWED) { + success = create_nsdl_resource(object); + } + return success; +} + +bool M2MNsdlInterface::create_nsdl_object_instance_structure(M2MObjectInstance *object_instance) +{ + tr_debug("M2MNsdlInterface::create_nsdl_object_instance_structure()"); + bool success = false; + if( object_instance) { + M2MResourceList res_list = object_instance->resources(); + tr_debug("M2MNsdlInterface::create_nsdl_object_instance_structure - ResourceBase count %d", res_list.size()); + if(!res_list.empty()) { + M2MResourceList::const_iterator it; + it = res_list.begin(); + for ( ; it != res_list.end(); it++ ) { + // Create NSDL structure for all resources inside + success = create_nsdl_resource_structure(*it, + (*it)->supports_multiple_instances()); + } + } + if(object_instance->operation() != M2MBase::NOT_ALLOWED) { + success = create_nsdl_resource(object_instance); + } + } + return success; +} + +bool M2MNsdlInterface::create_nsdl_resource_structure(M2MResource *res, + bool multiple_instances) +{ + tr_debug("M2MNsdlInterface::create_nsdl_resource_structure()"); + bool success = false; + if(res) { + // if there are multiple instances supported + if(multiple_instances) { + M2MResourceInstanceList res_list = res->resource_instances(); + tr_debug("M2MNsdlInterface::create_nsdl_resource_structure - ResourceInstance count %d", res_list.size()); + if(!res_list.empty()) { + M2MResourceInstanceList::const_iterator it; + it = res_list.begin(); + for ( ; it != res_list.end(); it++ ) { + success = create_nsdl_resource((*it)); + if(!success) { + tr_error("M2MNsdlInterface::create_nsdl_resource_structure - instance creation failed"); + return false; + } + } + // Register the main Resource as well along with ResourceInstances + success = create_nsdl_resource(res); + } + } else { + success = create_nsdl_resource(res); + } + } + return success; +} + +bool M2MNsdlInterface::create_nsdl_resource(M2MBase *base) +{ + __mutex_claim(); + tr_debug("M2MNsdlInterface::create_nsdl_resource"); + bool success = false; + if(base) { + int8_t result = 0; + sn_nsdl_dynamic_resource_parameters_s* orig_resource = base->get_nsdl_resource(); + tr_debug("M2MNsdlInterface::create_nsdl_resource - path (%.*s)", orig_resource->static_resource_parameters->pathlen, + orig_resource->static_resource_parameters->path); + + // needed on deletion + if (base->observation_handler() == NULL) { + base->set_observation_handler(this); + } + + result = sn_nsdl_put_resource(_nsdl_handle, orig_resource); + tr_debug("M2MNsdlInterface::create_nsdl_resource - Creating in NSDL-C result %d", result); + + // Either the resource is created or it already + // exists , then result is success. + if (result == 0 || + result == -2){ + success = true; + } + } + __mutex_release(); + return success; +} + +// convenience method to get the URI from its buffer field... +String M2MNsdlInterface::coap_to_string(uint8_t *coap_data,int coap_data_length) +{ + String value = ""; + if (coap_data != NULL && coap_data_length > 0) { + value.append_raw((char *)coap_data,coap_data_length); + } + return value; +} + +uint64_t M2MNsdlInterface::registration_time() +{ + uint64_t value = 0; + if(_endpoint && _endpoint->lifetime_ptr) { + value = atol((const char*)_endpoint->lifetime_ptr); + } + + if(value >= OPTIMUM_LIFETIME) { + value = value - REDUCE_LIFETIME; + } else { + value = REDUCTION_FACTOR * value; + } + tr_debug("M2MNsdlInterface::registration_time - value (in seconds) %ld", value); + return value; +} + +M2MBase* M2MNsdlInterface::find_resource(const String &object_name, + uint8_t *token, + uint8_t token_len) +{ + tr_debug("M2MNsdlInterface::find_resource(object level) - name (%s)", object_name.c_str()); + tr_debug("M2MNsdlInterface::find_resource - token (%.*s)", token_len, token); + M2MBase *object = NULL; + if(!_object_list.empty()) { + M2MObjectList::const_iterator it; + it = _object_list.begin(); + for ( ; it != _object_list.end(); it++ ) { + if (token_len == 0) { + tr_debug("M2MNsdlInterface::find_resource(object level) - path (%s)", + (char*)(*it)->uri_path()); + if (strcmp((char*)(*it)->uri_path(), object_name.c_str()) == 0) { + object = (*it); + tr_debug("M2MNsdlInterface::find_resource(%s) found", object_name.c_str()); + break; + } + } else { + uint8_t *stored_token = 0; + uint32_t stored_token_length = 0; + (*it)->get_observation_token(stored_token, stored_token_length); + tr_debug("M2MNsdlInterface::find_resource(object level) - stored token (%.*s)", stored_token_length, stored_token); + if (stored_token) { + if (stored_token_length == token_len && + memcmp(token, stored_token, token_len) == 0) { + object = (*it); + tr_debug("M2MNsdlInterface::find_resource - token found"); + free(stored_token); + break; + } else { + free(stored_token); + } + } + } + object = find_resource((*it), object_name, token, token_len); + if(object != NULL) { + break; + } + } + } + return object; +} + +M2MBase* M2MNsdlInterface::find_resource(const M2MObject *object, + const String &object_instance, + uint8_t *token, + uint8_t token_len) +{ + tr_debug("M2MNsdlInterface::find_resource(object instance level) - name (%s)", object_instance.c_str()); + M2MBase *instance = NULL; + if(object) { + M2MObjectInstanceList list = object->instances(); + if(!list.empty()) { + M2MObjectInstanceList::const_iterator it; + it = list.begin(); + for ( ; it != list.end(); it++ ) { + if (!token) { + tr_debug("M2MNsdlInterface::find_resource(object instance level) - path (%s)", + (char*)(*it)->uri_path()); + if(!strcmp((char*)(*it)->uri_path(), object_instance.c_str())){ + instance = (*it); + break; + } + } else { + uint8_t *stored_token = 0; + uint32_t stored_token_length = 0; + tr_debug("M2MNsdlInterface::find_resource(object instance level) - in token (%.*s)", token_len, token); + (*it)->get_observation_token(stored_token, stored_token_length); + tr_debug("M2MNsdlInterface::find_resource(object instance level) - stored token (%.*s)", stored_token_length, stored_token); + if (stored_token) { + if (stored_token_length == token_len && + memcmp(token, stored_token, token_len) == 0) { + instance = (*it); + free(stored_token); + break; + } else { + free(stored_token); + } + } + } + instance = find_resource((*it),object_instance, token, token_len); + if(instance != NULL){ + break; + } + } + } + } + return instance; +} + +M2MBase* M2MNsdlInterface::find_resource(const M2MObjectInstance *object_instance, + const String &resource_instance, + uint8_t *token, + uint8_t token_len) +{ + tr_debug("M2MNsdlInterface::find_resource(resource level) - name (%s)", resource_instance.c_str()); + M2MBase *instance = NULL; + if(object_instance) { + M2MResourceList list = object_instance->resources(); + if(!list.empty()) { + M2MResourceList::const_iterator it; + it = list.begin(); + for ( ; it != list.end(); it++ ) { + if (!token) { + if(!strcmp((char*)(*it)->uri_path(), resource_instance.c_str())) { + instance = *it; + break; + } + else if((*it)->supports_multiple_instances()) { + instance = find_resource((*it), (*it)->uri_path(), + resource_instance, token, token_len); + if(instance != NULL){ + break; + } + } + } else { + uint8_t *stored_token = 0; + uint32_t stored_token_length = 0; + tr_debug("M2MNsdlInterface::find_resource(resource level) - in token (%.*s)", token_len, token); + (*it)->get_observation_token(stored_token, stored_token_length); + tr_debug("M2MNsdlInterface::find_resource(resource level) - stored token (%.*s)", stored_token_length, stored_token); + if (stored_token) { + if (stored_token_length == token_len && + memcmp(token, stored_token, token_len) == 0) { + instance = *it; + free(stored_token); + break; + } else { + free(stored_token); + } + } + } + } + } + } + return instance; +} + +M2MBase* M2MNsdlInterface::find_resource(const M2MResource *resource, + const String &object_name, + const String &resource_instance, + uint8_t */*token*/, + uint8_t /*token_len*/) +{ + tr_debug("M2MNsdlInterface::find_resource(resource instance level)"); + M2MBase *res = NULL; + if(resource) { + if(resource->supports_multiple_instances()) { + M2MResourceInstanceList list = resource->resource_instances(); + if(!list.empty()) { + M2MResourceInstanceList::const_iterator it; + it = list.begin(); + for ( ; it != list.end(); it++ ) { + if(!strcmp((char*)(*it)->uri_path(), resource_instance.c_str())){ + res = (*it); + break; + } + } + } + } + } + return res; +} + +bool M2MNsdlInterface::object_present(M2MObject* object) const +{ + bool success = false; + if(object && !_object_list.empty()) { + M2MObjectList::const_iterator it; + it = _object_list.begin(); + for ( ; it != _object_list.end(); it++ ) { + if((*it) == object) { + success = true; + break; + } + } + } + return success; +} + +bool M2MNsdlInterface::add_object_to_list(M2MObject* object) +{ + bool success = false; + if(object && !object_present(object)) { + _object_list.push_back(object); + success = true; + } + return success; +} + +M2MInterface::Error M2MNsdlInterface::interface_error(sn_coap_hdr_s *coap_header) +{ + M2MInterface::Error error = M2MInterface::ErrorNone; + if(coap_header) { + switch(coap_header->msg_code) { + case COAP_MSG_CODE_RESPONSE_BAD_REQUEST: + case COAP_MSG_CODE_RESPONSE_BAD_OPTION: + case COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_INCOMPLETE: + case COAP_MSG_CODE_RESPONSE_PRECONDITION_FAILED: + case COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE: + case COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT: + error = M2MInterface::InvalidParameters; + break; + case COAP_MSG_CODE_RESPONSE_UNAUTHORIZED: + case COAP_MSG_CODE_RESPONSE_FORBIDDEN: + case COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE: + case COAP_MSG_CODE_RESPONSE_NOT_FOUND: + case COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED: + error = M2MInterface::NotAllowed; + break; + case COAP_MSG_CODE_RESPONSE_CREATED: + case COAP_MSG_CODE_RESPONSE_DELETED: + case COAP_MSG_CODE_RESPONSE_VALID: + case COAP_MSG_CODE_RESPONSE_CHANGED: + case COAP_MSG_CODE_RESPONSE_CONTENT: + error = M2MInterface::ErrorNone; + break; + default: + error = M2MInterface::UnknownError; + break; + } + if(coap_header->coap_status == COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED) { + error = M2MInterface::NetworkError; + } + } + return error; +} + +void M2MNsdlInterface::send_object_observation(M2MObject *object, + uint16_t obs_number, + m2m::Vector<uint16_t> changed_instance_ids, + bool send_object) +{ + tr_debug("M2MNsdlInterface::send_object_observation"); + if(object) { + uint8_t *value = 0; + uint32_t length = 0; + uint8_t *token = 0; + uint32_t token_length = 0; + + M2MTLVSerializer serializer; + // Send whole object structure + if (send_object) { + value = serializer.serialize(object->instances(), length); + } + // Send only changed object instances + else { + M2MObjectInstanceList list; + Vector<uint16_t>::const_iterator it; + it = changed_instance_ids.begin(); + for (; it != changed_instance_ids.end(); it++){ + M2MObjectInstance* obj_instance = object->object_instance(*it); + if (obj_instance){ + list.push_back(obj_instance); + } + } + if (!list.empty()) { + value = serializer.serialize(list, length); + list.clear(); + } + } + + object->get_observation_token(token,token_length); + + send_notification(token, + token_length, + value, + length, + obs_number, + object->max_age(), + object->coap_content_type()); + memory_free(value); + memory_free(token); + } +} + +void M2MNsdlInterface::send_object_instance_observation(M2MObjectInstance *object_instance, + uint16_t obs_number) +{ + tr_debug("M2MNsdlInterface::send_object_instance_observation"); + if(object_instance) { + uint8_t *value = 0; + uint32_t length = 0; + uint8_t *token = 0; + uint32_t token_length = 0; + + M2MTLVSerializer serializer; + value = serializer.serialize(object_instance->resources(), length); + + object_instance->get_observation_token(token,token_length); + + send_notification(token, + token_length, + value, + length, + obs_number, + object_instance->max_age(), + object_instance->coap_content_type()); + memory_free(value); + memory_free(token); + } +} + +void M2MNsdlInterface::send_resource_observation(M2MResource *resource, + uint16_t obs_number) +{ + tr_debug("M2MNsdlInterface::send_resource_observation"); + if(resource) { + uint8_t *value = 0; + uint32_t length = 0; + uint8_t *token = 0; + uint32_t token_length = 0; + + resource->get_observation_token(token,token_length); + uint8_t content_type = 0; + if(M2MResourceInstance::OPAQUE == resource->resource_instance_type()) { + content_type = COAP_CONTENT_OMA_OPAQUE_TYPE; + } + if (resource->resource_instance_count() > 0) { + content_type = COAP_CONTENT_OMA_TLV_TYPE; + M2MTLVSerializer serializer; + value = serializer.serialize(resource, length); + } else { + resource->get_value(value,length); + } + send_notification(token, + token_length, + value, + length, + obs_number, + resource->max_age(), + content_type); + + memory_free(value); + memory_free(token); + } +} + +void M2MNsdlInterface::send_notification(uint8_t *token, + uint8_t token_length, + uint8_t *value, + uint32_t value_length, + uint16_t observation, + uint32_t max_age, + uint8_t coap_content_type) + +{ + tr_debug("M2MNsdlInterface::send_notification"); + sn_coap_hdr_s *notification_message_ptr; + + /* Allocate and initialize memory for header struct */ + notification_message_ptr = static_cast<sn_coap_hdr_s *>(memory_alloc(sizeof(sn_coap_hdr_s))); + if (notification_message_ptr) { + memset(notification_message_ptr, 0, sizeof(sn_coap_hdr_s)); + + notification_message_ptr->options_list_ptr = sn_nsdl_alloc_options_list(_nsdl_handle, notification_message_ptr); + if (notification_message_ptr->options_list_ptr) { + /* Fill header */ + notification_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE; + notification_message_ptr->msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + + /* Fill token */ + notification_message_ptr->token_len = token_length; + notification_message_ptr->token_ptr = token; + + /* Fill payload */ + notification_message_ptr->payload_len = value_length; + notification_message_ptr->payload_ptr = value; + + /* Fill observe */ + notification_message_ptr->options_list_ptr->observe = observation; + + notification_message_ptr->options_list_ptr->max_age = max_age; + + notification_message_ptr->content_format = sn_coap_content_format_e(coap_content_type); + + /* Send message */ + sn_nsdl_send_coap_message(_nsdl_handle, + _nsdl_handle->nsp_address_ptr->omalw_address_ptr, + notification_message_ptr); + + /* Free memory */ + notification_message_ptr->payload_ptr = NULL; + notification_message_ptr->options_list_ptr->observe = -1; + notification_message_ptr->token_ptr = NULL; + } + sn_nsdl_release_allocated_coap_msg_mem(_nsdl_handle, notification_message_ptr); + } +} + +nsdl_s * M2MNsdlInterface::get_nsdl_handle() +{ + return _nsdl_handle; +} + +void M2MNsdlInterface::handle_bootstrap_put_message(sn_coap_hdr_s *coap_header, + sn_nsdl_addr_s *address) { +#ifndef M2M_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MNsdlInterface::handle_bootstrap_message"); + uint8_t response_code = COAP_MSG_CODE_RESPONSE_CHANGED; + sn_coap_hdr_s *coap_response = NULL; + bool success = false; + bool security_object = false; + uint16_t content_type = 0; + + if (!_security) { + _security = new M2MSecurity(M2MSecurity::M2MServer); + } + + String resource_name = coap_to_string(coap_header->uri_path_ptr, + coap_header->uri_path_len); + tr_debug("M2MNsdlInterface::handle_bootstrap_message - uri %s", resource_name.c_str()); + + // Check incoming object + if (resource_name.compare(0,1,"0") == 0) { + security_object = true; + if(_security) { + success = true; + // Not mandatory resource that's why it must be created first + _security->create_resource(M2MSecurity::ShortServerID, 1); + // Change operation mode + M2MResourceList list = _security->object_instance()->resources(); + if(!list.empty()) { + M2MResourceList::const_iterator it; + it = list.begin(); + for ( ; it != list.end(); it++ ) { + (*it)->set_operation(M2MBase::PUT_ALLOWED); + } + } + } + } + else if (resource_name.compare(0,1,"1") == 0) { + success = true; + } + + if (success) { + // Send delayed response if token is part of the message + if (coap_header->token_ptr) { + tr_debug("M2MNsdlInterface::handle_bootstrap_message - send delayed response"); + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + COAP_MSG_CODE_EMPTY); + if (coap_response) { + coap_response->msg_type = COAP_MSG_TYPE_ACKNOWLEDGEMENT; + sn_nsdl_send_coap_message(_nsdl_handle, address, coap_response); + sn_nsdl_release_allocated_coap_msg_mem(_nsdl_handle, coap_response); + } + } + + if(coap_header->content_format != COAP_CT_NONE) { + content_type = coap_header->content_format; + } + + tr_debug("M2MNsdlInterface::handle_bootstrap_message - content_type %d", content_type); + if (content_type != COAP_CONTENT_OMA_TLV_TYPE) { + success = false; + } + if (success) { + success = parse_bootstrap_message(coap_header, security_object); + // Set operation back to default ones + if (_security) { + M2MResourceList list = _security->object_instance()->resources(); + if(!list.empty()) { + M2MResourceList::const_iterator it; + it = list.begin(); + for ( ; it != list.end(); it++ ) { + (*it)->set_operation(M2MBase::NOT_ALLOWED); + } + } + } + } + } + + if (!success) { + response_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + handle_bootstrap_error(); + } + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + response_code); + if (coap_response) { + sn_nsdl_send_coap_message(_nsdl_handle, address, coap_response); + sn_nsdl_release_allocated_coap_msg_mem(_nsdl_handle, coap_response); + } +#else + (void) coap_header; + (void) address; +#endif +} + +bool M2MNsdlInterface::parse_bootstrap_message(sn_coap_hdr_s *coap_header, bool is_security_object) +{ +#ifndef M2M_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MNsdlInterface::parse_bootstrap_put_message"); + bool ret = false; + bool is_obj_instance = false; + uint16_t instance_id = 0; + if (_security) { + // Actually there are no member variables on the M2MTLVDeserializer so all the methods + // could be converted to static ones. + M2MTLVDeserializer deserializer; + + ret = is_obj_instance = deserializer.is_object_instance(coap_header->payload_ptr); + if (!is_obj_instance) { + ret = deserializer.is_resource(coap_header->payload_ptr); + } + + if (ret) { + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + if (is_obj_instance) { + if (is_security_object) { + error = deserializer.deserialise_object_instances(coap_header->payload_ptr, + coap_header->payload_len, + *_security, + M2MTLVDeserializer::Put); + } + else { + error = deserializer.deserialise_object_instances(coap_header->payload_ptr, + coap_header->payload_len, + _server, + M2MTLVDeserializer::Put); + } + } + else { + if (is_security_object) { + instance_id = deserializer.instance_id(coap_header->payload_ptr); + error = deserializer.deserialize_resources(coap_header->payload_ptr, + coap_header->payload_len, + *_security->object_instance(instance_id), + M2MTLVDeserializer::Put); + } + else { + instance_id = deserializer.instance_id(coap_header->payload_ptr); + error = deserializer.deserialize_resources(coap_header->payload_ptr, + coap_header->payload_len, + *(_server.object_instance(instance_id)), + M2MTLVDeserializer::Post); + } + } + + if (error != M2MTLVDeserializer::None) { + tr_error("M2MNsdlInterface::parse_bootstrap_put_message - error %d", error); + ret = false; + } + } + } + return ret; +#else + (void) coap_header; + (void) is_security_object; + return false; +#endif +} + +void M2MNsdlInterface::handle_bootstrap_finished(sn_coap_hdr_s *coap_header,sn_nsdl_addr_s *address) +{ +#ifndef M2M_CLIENT_DISABLE_BOOTSTRAP_FEATURE + String object_name = coap_to_string(coap_header->uri_path_ptr, + coap_header->uri_path_len); + tr_debug("M2MNsdlInterface::handle_bootstrap_finished - path: %s", object_name.c_str()); + sn_coap_hdr_s *coap_response = NULL; + uint8_t msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + + // Accept only '/bs' path and check that needed data is in security object + if (object_name.size() != 2 || + object_name.compare(0,2,BOOTSTRAP_URI) != 0 || + !validate_security_object()) { + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + } else { + // Add short server id to server object + _server.set_resource_value(M2MServer::ShortServerID, + _security->resource_value_int(M2MSecurity::ShortServerID)); + } + + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + msg_code); + if(coap_response) { + sn_nsdl_send_coap_message(_nsdl_handle, address, coap_response); + sn_nsdl_release_allocated_coap_msg_mem(_nsdl_handle, coap_response); + } + if (COAP_MSG_CODE_RESPONSE_CHANGED == msg_code) { + // Switch back to original ep name + if (_endpoint->endpoint_name_ptr) { + memory_free(_endpoint->endpoint_name_ptr); + } + _endpoint->endpoint_name_ptr = alloc_string_copy((uint8_t*)_endpoint_name.c_str(), _endpoint_name.length()); + _endpoint->endpoint_name_len = _endpoint_name.length(); + // Inform observer that bootstrap is finished but it should wait until nsdl has sent data. + // The final bootstrap_done callback is called in the observers data_sent callback. + _observer.bootstrap_wait(_security); + } else { + handle_bootstrap_error(); + } +#else + (void) coap_header; + (void) address; +#endif +} + +void M2MNsdlInterface::handle_bootstrap_delete(sn_coap_hdr_s *coap_header,sn_nsdl_addr_s *address) +{ +#ifndef M2M_CLIENT_DISABLE_BOOTSTRAP_FEATURE + sn_coap_hdr_s *coap_response = NULL; + uint8_t msg_code = COAP_MSG_CODE_RESPONSE_DELETED; + String object_name = coap_to_string(coap_header->uri_path_ptr, + coap_header->uri_path_len); + tr_debug("M2MNsdlInterface::handle_bootstrap_delete - obj %s", object_name.c_str()); + if(!_identity_accepted) { + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + } + // Only following paths are accepted, 0, 0/0 + else if (object_name.size() == 2 || object_name.size() > 3) { + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + } + else if ((object_name.size() == 1 && object_name.compare(0,1,"0") != 0) || + (object_name.size() == 3 && object_name.compare(0,3,"0/0") != 0)) { + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + } + + coap_response = sn_nsdl_build_response(_nsdl_handle, + coap_header, + msg_code); + + if(coap_response) { + sn_nsdl_send_coap_message(_nsdl_handle, address, coap_response); + sn_nsdl_release_allocated_coap_msg_mem(_nsdl_handle, coap_response); + if(_security) { + _security->clear_resources(); + } + } + if (!coap_response || COAP_MSG_CODE_RESPONSE_DELETED != msg_code) { + handle_bootstrap_error(); + } +#else + (void) coap_header; + (void) address; +#endif +} + +bool M2MNsdlInterface::validate_security_object() +{ +#ifndef M2M_CLIENT_DISABLE_BOOTSTRAP_FEATURE + tr_debug("M2MNsdlInterface::validate_security_object"); + if (_security) { + String address = _security->resource_value_string(M2MSecurity::M2MServerUri); + uint32_t sec_mode = _security->resource_value_int(M2MSecurity::SecurityMode); + bool is_bs_server = _security->resource_value_int(M2MSecurity::BootstrapServer); + uint32_t public_key_size = _security->get_resource(M2MSecurity::PublicKey)->value_length(); + uint32_t server_key_size = _security->get_resource(M2MSecurity::ServerPublicKey)->value_length(); + uint32_t pkey_size = _security->get_resource(M2MSecurity::Secretkey)->value_length(); + tr_debug("M2MNsdlInterface::validate_security_object - Server URI /0/0: %s", address.c_str()); + tr_debug("M2MNsdlInterface::validate_security_object - is bs server /0/1: %d", is_bs_server); + tr_debug("M2MNsdlInterface::validate_security_object - Security Mode /0/2: %" PRIu32, sec_mode); + tr_debug("M2MNsdlInterface::validate_security_object - Public key size /0/3: %" PRIu32, public_key_size); + tr_debug("M2MNsdlInterface::validate_security_object - Server Public key size /0/4: %" PRIu32, server_key_size); + tr_debug("M2MNsdlInterface::validate_security_object - Secret key size /0/5: %" PRIu32, pkey_size); + // Only NoSec and Certificate modes are supported + if (!address.empty() && !is_bs_server) { + if (M2MSecurity::Certificate == sec_mode) { + if (!public_key_size || !server_key_size || !pkey_size) { + return false; + } else { + return true; + } + } else if (M2MSecurity::NoSecurity == sec_mode){ + return true; + } else { + return false; + } + } else { + return false; + } + } + return false; +#else + return false; +#endif +} + +void M2MNsdlInterface::handle_bootstrap_error() +{ + tr_debug("M2MNsdlInterface::handle_bootstrap_error()"); + _identity_accepted = false; + if (_security) { + delete _security; + _security = NULL; + } + _observer.bootstrap_error(); +} + +const String& M2MNsdlInterface::endpoint_name() const +{ + return _endpoint_name; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mobject.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,491 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobservationhandler.h" +#include "mbed-client/m2mconstants.h" +#include "include/m2mtlvserializer.h" +#include "include/m2mtlvdeserializer.h" +#include "include/m2mreporthandler.h" +#include "mbed-trace/mbed_trace.h" +#include "mbed-client/m2mstringbuffer.h" + +#include <stdlib.h> + +#define BUFFER_SIZE 10 +#define TRACE_GROUP "mClt" + +M2MObject::M2MObject(const String &object_name, char *path, bool external_blockwise_store) +: M2MBase(object_name, + M2MBase::Dynamic, + "", + path, + external_blockwise_store), + _max_instance_count(MAX_UNINT_16_COUNT) +{ + M2MBase::set_base_type(M2MBase::Object); + if(M2MBase::name_id() != -1) { + M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + } +} + +M2MObject::M2MObject(const M2MBase::lwm2m_parameters_s* static_res) +: M2MBase(static_res), + _max_instance_count(MAX_UNINT_16_COUNT) +{ + if(static_res->name_id != -1) { + M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + } +} + +M2MObject::~M2MObject() +{ + if(!_instance_list.empty()) { + + M2MObjectInstanceList::const_iterator it; + it = _instance_list.begin(); + M2MObjectInstance* obj = NULL; + uint16_t index = 0; + for (; it!=_instance_list.end(); it++, index++ ) { + //Free allocated memory for object instances. + obj = *it; + delete obj; + } + + _instance_list.clear(); + } +} + +M2MObjectInstance* M2MObject::create_object_instance(uint16_t instance_id) +{ + tr_debug("M2MObject::create_object_instance - id: %d", instance_id); + M2MObjectInstance *instance = NULL; + if(!object_instance(instance_id)) { + char* path = create_path(*this, instance_id); + // Note: the object instance's name contains actually object's name. + instance = new M2MObjectInstance(*this, this->name(), "", path); + if(instance) { + instance->add_observation_level(observation_level()); + instance->set_instance_id(instance_id); + if(M2MBase::name_id() != -1) { + instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + } + _instance_list.push_back(instance); + } + } + return instance; +} + +// KS: is this needed for object instance?? TODO! +M2MObjectInstance* M2MObject::create_object_instance(const lwm2m_parameters_s* s) +{ + tr_debug("M2MObject::create_object_instance - id: %d", s->instance_id); + M2MObjectInstance *instance = NULL; + if(!object_instance(s->instance_id)) { + + instance = new M2MObjectInstance(*this, s); + if(instance) { + instance->add_observation_level(observation_level()); + //instance->set_instance_id(instance_id); + //if(M2MBase::name_id() != -1) { + // instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + //} + _instance_list.push_back(instance); + } + } + return instance; +} + +bool M2MObject::remove_object_instance(uint16_t inst_id) +{ + tr_debug("M2MObject::remove_object_instance(inst_id %d)", inst_id); + bool success = false; + if(!_instance_list.empty()) { + M2MObjectInstance* obj = NULL; + M2MObjectInstanceList::const_iterator it; + it = _instance_list.begin(); + int pos = 0; + for ( ; it != _instance_list.end(); it++, pos++ ) { + if((*it)->instance_id() == inst_id) { + // Instance found and deleted. + obj = *it; + + _instance_list.erase(pos); + delete obj; + success = true; + break; + } + } + } + return success; +} + +M2MObjectInstance* M2MObject::object_instance(uint16_t inst_id) const +{ + tr_debug("M2MObject::object_instance(inst_id %d)", inst_id); + M2MObjectInstance *obj = NULL; + if(!_instance_list.empty()) { + M2MObjectInstanceList::const_iterator it; + it = _instance_list.begin(); + for ( ; it != _instance_list.end(); it++ ) { + if((*it)->instance_id() == inst_id) { + // Instance found. + obj = *it; + break; + } + } + } + return obj; +} + +const M2MObjectInstanceList& M2MObject::instances() const +{ + return _instance_list; +} + +uint16_t M2MObject::instance_count() const +{ + return (uint16_t)_instance_list.size(); +} + +M2MBase::BaseType M2MObject::base_type() const +{ + return M2MBase::base_type(); +} + +void M2MObject::add_observation_level(M2MBase::Observation observation_level) +{ + M2MBase::add_observation_level(observation_level); + if(!_instance_list.empty()) { + M2MObjectInstanceList::const_iterator it; + it = _instance_list.begin(); + for ( ; it != _instance_list.end(); it++ ) { + (*it)->add_observation_level(observation_level); + } + } +} + +void M2MObject::remove_observation_level(M2MBase::Observation observation_level) +{ + M2MBase::remove_observation_level(observation_level); + if(!_instance_list.empty()) { + M2MObjectInstanceList::const_iterator it; + it = _instance_list.begin(); + for ( ; it != _instance_list.end(); it++ ) { + (*it)->remove_observation_level(observation_level); + } + } +} + +sn_coap_hdr_s* M2MObject::handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler) +{ + tr_debug("M2MObject::handle_get_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + uint8_t * data = NULL; + uint32_t data_length = 0; + if(received_coap_header) { + // process the GET if we have registered a callback for it + if ((operation() & SN_GRS_GET_ALLOWED) != 0) { + if(coap_response) { + uint16_t coap_content_type = 0; + bool content_type_present = false; + if(received_coap_header->content_format != COAP_CT_NONE) { + content_type_present = true; + coap_content_type = received_coap_header->content_format; + } + if(!content_type_present && + M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) { + coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; + } + + tr_debug("M2MObject::handle_get_request() - Request Content-Type %d", coap_content_type); + if (coap_response->content_format == COAP_CT_NONE) { + coap_response->content_format = sn_coap_content_format_e(coap_content_type); + + if (coap_response->content_format != COAP_CT_NONE) { + set_coap_content_type(coap_content_type); + } + } + // fill in the CoAP response payload + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + M2MTLVSerializer serializer; + data = serializer.serialize(_instance_list, data_length); + + } else { // TOD0: Implement JSON Format. + msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported + } + + coap_response->payload_len = data_length; + coap_response->payload_ptr = data; + + coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response); + + coap_response->options_list_ptr->max_age = max_age(); + + if(data){ + if(received_coap_header->options_list_ptr) { + if(received_coap_header->options_list_ptr->observe != -1) { + if (is_observable()) { + uint32_t number = 0; + uint8_t observe_option = 0; + observe_option = received_coap_header->options_list_ptr->observe; + + if(START_OBSERVATION == observe_option) { + tr_debug("M2MObject::handle_get_request - Starts Observation"); + // If the observe length is 0 means register for observation. + if(received_coap_header->options_list_ptr->observe != -1) { + number = received_coap_header->options_list_ptr->observe; + } + if(received_coap_header->token_ptr) { + tr_debug("M2MObject::handle_get_request - Sets Observation Token to resource"); + set_observation_token(received_coap_header->token_ptr, + received_coap_header->token_len); + } + + // If the observe value is 0 means register for observation. + if(number == 0) { + tr_debug("M2MObject::handle_get_request - Put Resource under Observation"); + set_under_observation(true,observation_handler); + add_observation_level(M2MBase::O_Attribute); + tr_debug("M2MObject::handle_get_request - Observation Number %d", observation_number()); + coap_response->options_list_ptr->observe = observation_number(); + } + } else if (STOP_OBSERVATION == observe_option) { + tr_debug("M2MObject::handle_get_request - Stops Observation"); + // If the observe options_list_ptr->observe value is 1 means de-register from observation. + set_under_observation(false,NULL); + remove_observation_level(M2MBase::O_Attribute); + } + msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + } + else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported + } + } + }else { + tr_error("M2MResource::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + // Operation is not allowed. + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + +sn_coap_hdr_s* M2MObject::handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler */*observation_handler*/, + bool &/*execute_value_updated*/) +{ + tr_debug("M2MObject::handle_put_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 + sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + if(received_coap_header) { + if(received_coap_header->options_list_ptr && + received_coap_header->options_list_ptr->uri_query_ptr) { + char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr, + received_coap_header->options_list_ptr->uri_query_len); + if (query){ + tr_debug("M2MObject::handle_put_request() - Query %s", query); + // if anything was updated, re-initialize the stored notification attributes + if (!handle_observation_attribute(query)){ + tr_debug("M2MObject::handle_put_request() - Invalid query"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00 + } + free(query); + } + } else { + tr_error("M2MObject::handle_put_request() - COAP_MSG_CODE_RESPONSE_BAD_REQUEST - Empty URI_QUERY"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + + +sn_coap_hdr_s* M2MObject::handle_post_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated, + sn_nsdl_addr_s *) +{ + tr_debug("M2MObject::handle_post_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 + // process the POST if we have registered a callback for it + sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + + if(received_coap_header) { + if ((operation() & SN_GRS_POST_ALLOWED) != 0) { + if(received_coap_header->payload_ptr) { + tr_debug("M2MObject::handle_post_request() - Update Object with new values"); + uint16_t coap_content_type = 0; + bool content_type_present = false; + if(received_coap_header->content_format != COAP_CT_NONE) { + content_type_present = true; + if(coap_response) { + coap_content_type = received_coap_header->content_format; + } + } // if(received_coap_header->content_format) + if(!content_type_present && + M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) { + coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; + } + + tr_debug("M2MObject::handle_post_request() - Request Content-Type %d", coap_content_type); + + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + uint16_t instance_id = 0; + // Check next free instance id + for(instance_id = 0; instance_id <= _max_instance_count; instance_id++) { + if(NULL == object_instance(instance_id)) { + break; + } + if(instance_id == _max_instance_count) { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + break; + } + } + if(COAP_MSG_CODE_RESPONSE_CHANGED == msg_code) { + M2MTLVDeserializer deserializer; + bool is_obj_instance = false; + bool obj_instance_exists = false; + is_obj_instance = deserializer.is_object_instance(received_coap_header->payload_ptr); + if (is_obj_instance) { + instance_id = deserializer.instance_id(received_coap_header->payload_ptr); + tr_debug("M2MObject::handle_post_request() - instance id in TLV: %d", instance_id); + // Check if instance id already exists + if (object_instance(instance_id)){ + obj_instance_exists = true; + } + } + if (!obj_instance_exists) { + M2MObjectInstance *obj_instance = create_object_instance(instance_id); + if(obj_instance) { + obj_instance->set_operation(M2MBase::GET_PUT_ALLOWED); + } + + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + if(is_obj_instance) { + tr_debug("M2MObject::handle_post_request() - TLV data contains ObjectInstance"); + error = deserializer.deserialise_object_instances(received_coap_header->payload_ptr, + received_coap_header->payload_len, + *this, + M2MTLVDeserializer::Post); + } else if(obj_instance && + (deserializer.is_resource(received_coap_header->payload_ptr) || + deserializer.is_multiple_resource(received_coap_header->payload_ptr))) { + tr_debug("M2MObject::handle_post_request() - TLV data contains Resources"); + error = deserializer.deserialize_resources(received_coap_header->payload_ptr, + received_coap_header->payload_len, + *obj_instance, + M2MTLVDeserializer::Post); + } else { + error = M2MTLVDeserializer::NotValid; + } + switch(error) { + case M2MTLVDeserializer::None: + if(observation_handler) { + execute_value_updated = true; + } + coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response); + + if (coap_response->options_list_ptr) { + + StringBuffer<MAX_OBJECT_PATH_NAME> obj_name; + + if (obj_name.ensure_space(M2MBase::resource_name_length() + (1 + 5 + 1))) { + obj_name.append(M2MBase::name()); + obj_name.append('/'); + obj_name.append_int(instance_id); + + coap_response->options_list_ptr->location_path_len = obj_name.get_size(); + coap_response->options_list_ptr->location_path_ptr = + alloc_copy((uint8_t*)obj_name.c_str(), obj_name.get_size()); + // todo: else return error + } + } + // todo: else return error + msg_code = COAP_MSG_CODE_RESPONSE_CREATED; + break; + case M2MTLVDeserializer::NotAllowed: + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + break; + case M2MTLVDeserializer::NotValid: + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + break; + case M2MTLVDeserializer::NotFound: + msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND; + break; + } + + } else { + tr_debug("M2MObject::handle_post_request() - COAP_MSG_CODE_RESPONSE_BAD_REQUEST"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + } + } + } else { + msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; + } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) + } else { + tr_error("M2MObject::handle_post_request - COAP_MSG_CODE_RESPONSE_BAD_REQUEST - Missing Payload"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // + } + } else { // if ((object->operation() & SN_GRS_POST_ALLOWED) != 0) + tr_error("M2MObject::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05 + } + } else { //if(received_coap_header) + tr_error("M2MObject::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05 + } + + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + +void M2MObject::notification_update(uint16_t obj_instance_id) +{ + tr_debug("M2MObject::notification_update - id: %d", obj_instance_id); + M2MReportHandler *report_handler = M2MBase::report_handler(); + if(report_handler && is_under_observation()) { + report_handler->set_notification_trigger(obj_instance_id); + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mobjectinstance.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,720 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mobservationhandler.h" +#include "mbed-client/m2mstring.h" +#include "mbed-client/m2mstringbuffer.h" +#include "include/m2mtlvserializer.h" +#include "include/m2mtlvdeserializer.h" +#include "include/nsdllinker.h" +#include "include/m2mreporthandler.h" +#include "mbed-trace/mbed_trace.h" + +#include <stdlib.h> + +#define BUFFER_SIZE 10 +#define TRACE_GROUP "mClt" + +M2MObjectInstance::M2MObjectInstance(M2MObject& parent, const String &object_name, + const String &resource_type, + char *path, + bool external_blockwise_store) +: M2MBase(object_name, + M2MBase::Dynamic, + resource_type, + path, + external_blockwise_store), + _parent(parent) +{ + M2MBase::set_base_type(M2MBase::ObjectInstance); + M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); +} + +M2MObjectInstance::M2MObjectInstance(M2MObject& parent, const lwm2m_parameters_s* static_res) +: M2MBase(static_res), _parent(parent) +{ + M2MBase::set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); +} + +M2MObjectInstance::~M2MObjectInstance() +{ + if(!_resource_list.empty()) { + M2MResource* res = NULL; + M2MResourceList::const_iterator it; + it = _resource_list.begin(); + for (; it!=_resource_list.end(); it++ ) { + //Free allocated memory for resources. + res = *it; + delete res; + } + _resource_list.clear(); + } +} + +// TBD, ResourceType to the base class struct?? TODO! +M2MResource* M2MObjectInstance::create_static_resource(const lwm2m_parameters_s* static_res, + M2MResourceInstance::ResourceType type) +{ + tr_debug("M2MObjectInstance::create_static_resource(lwm2m_parameters_s resource_name %s)", static_res->name); + M2MResource *res = NULL; + if (validate_string_length(static_res->name, 1, MAX_ALLOWED_STRING_LENGTH) == false) { + return res; + } + if(!resource(static_res->name)) { + res = new M2MResource(*this, static_res, type, (const uint16_t) M2MBase::instance_id()); + if(res) { + res->add_observation_level(observation_level()); + //if (multiple_instance) { + //res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + //} + _resource_list.push_back(res); + } + } + return res; +} + +M2MResource* M2MObjectInstance::create_static_resource(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + bool multiple_instance, + bool external_blockwise_store) +{ + tr_debug("M2MObjectInstance::create_static_resource(resource_name %s)",resource_name.c_str()); + M2MResource *res = NULL; + if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) { + return res; + } + if(!resource(resource_name)) { + char *path = create_path(*this, resource_name.c_str()); + + if (path) { + res = new M2MResource(*this, resource_name, resource_type, type, + value, value_length, path, M2MBase::instance_id(), + multiple_instance, external_blockwise_store); + if(res) { + res->add_observation_level(observation_level()); + if (multiple_instance) { + res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + } + _resource_list.push_back(res); + } + } + } + return res; +} + +M2MResource* M2MObjectInstance::create_dynamic_resource(const lwm2m_parameters_s* static_res, + M2MResourceInstance::ResourceType type, + bool observable) +{ + tr_debug("M2MObjectInstance::create_dynamic_resource(resource_name %s)", static_res->name); + M2MResource *res = NULL; + + if (validate_string_length(static_res->name, 1, MAX_ALLOWED_STRING_LENGTH) == false) { + return res; + } + if(!resource(static_res->name)) { + res = new M2MResource(*this, static_res, type, M2MBase::instance_id()); + if(res) { + //if (multiple_instance) { // TODO! + // res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + //} + res->add_observation_level(observation_level()); + _resource_list.push_back(res); + } + } + return res; +} + +M2MResource* M2MObjectInstance::create_dynamic_resource(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + bool multiple_instance, + bool external_blockwise_store) +{ + tr_debug("M2MObjectInstance::create_dynamic_resource(resource_name %s)",resource_name.c_str()); + M2MResource *res = NULL; + if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) { + return res; + } + if(!resource(resource_name)) { + char *path = create_path(*this, resource_name.c_str()); + if (path) { + res = new M2MResource(*this, resource_name, resource_type, type, + observable, path, M2MBase::instance_id(), + multiple_instance, external_blockwise_store); + if(res) { + if (multiple_instance) { + res->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); + } + res->add_observation_level(observation_level()); + _resource_list.push_back(res); + } + } + } + return res; +} + +M2MResourceInstance* M2MObjectInstance::create_static_resource_instance(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + uint16_t instance_id, + bool external_blockwise_store) +{ + tr_debug("M2MObjectInstance::create_static_resource_instance(resource_name %s)",resource_name.c_str()); + M2MResourceInstance *instance = NULL; + if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) { + + return instance; + } + M2MResource *res = resource(resource_name); + if(!res) { + char *path = create_path(*this, resource_name.c_str()); + if (path) { + res = new M2MResource(*this, resource_name, resource_type, type, + value, value_length, path, M2MBase::instance_id(), + true, external_blockwise_store); + _resource_list.push_back(res); + res->set_operation(M2MBase::GET_ALLOWED); + res->set_observable(false); + res->set_register_uri(false); + } + } + if(res && res->supports_multiple_instances()&& (res->resource_instance(instance_id) == NULL)) { + char *path = M2MBase::create_path(*res, instance_id); + if (path) { + instance = new M2MResourceInstance(*res, resource_name, resource_type, type, + value, value_length, + M2MBase::instance_id(), + path, external_blockwise_store); + if(instance) { + instance->set_operation(M2MBase::GET_ALLOWED); + instance->set_instance_id(instance_id); + res->add_resource_instance(instance); + } + } + } + return instance; +} + +M2MResourceInstance* M2MObjectInstance::create_dynamic_resource_instance(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + uint16_t instance_id, + bool external_blockwise_store) +{ + tr_debug("M2MObjectInstance::create_dynamic_resource_instance(resource_name %s)",resource_name.c_str()); + M2MResourceInstance *instance = NULL; + if (validate_string_length(resource_name, 1, MAX_ALLOWED_STRING_LENGTH) == false) { + return instance; + } + M2MResource *res = resource(resource_name); + if(!res) { + char *path = create_path(*this, resource_name.c_str()); + if (path) { + res = new M2MResource(*this, resource_name, resource_type, type, + false, path, M2MBase::instance_id(), true); + _resource_list.push_back(res); + res->set_register_uri(false); + res->set_operation(M2MBase::GET_ALLOWED); + } + } + if (res && res->supports_multiple_instances() && (res->resource_instance(instance_id) == NULL)) { + char *path = create_path(*res, instance_id); + if (path) { + instance = new M2MResourceInstance(*res, resource_name, resource_type, type, + M2MBase::instance_id(), + path, external_blockwise_store); + if(instance) { + instance->set_operation(M2MBase::GET_ALLOWED); + instance->set_observable(observable); + instance->set_instance_id(instance_id); + res->add_resource_instance(instance); + } + } + } + return instance; +} + +bool M2MObjectInstance::remove_resource(const String &resource_name) +{ + return remove_resource(resource_name.c_str()); +} + +bool M2MObjectInstance::remove_resource(const char *resource_name) +{ + tr_debug("M2MObjectInstance::remove_resource(resource_name %s)", resource_name); + + bool success = false; + if(!_resource_list.empty()) { + M2MResource* res = NULL; + M2MResourceList::const_iterator it; + it = _resource_list.begin(); + int pos = 0; + for ( ; it != _resource_list.end(); it++, pos++ ) { + if(strcmp((*it)->name(), resource_name) == 0) { + // Resource found and deleted. + res = *it; + delete res; + res = NULL; + _resource_list.erase(pos); + success = true; + break; + } + } + } + return success; +} + +bool M2MObjectInstance::remove_resource_instance(const String &resource_name, + uint16_t inst_id) +{ + tr_debug("M2MObjectInstance::remove_resource_instance(resource_name %s inst_id %d)", + resource_name.c_str(), inst_id); + bool success = false; + M2MResource *res = resource(resource_name); + if(res) { + M2MResourceInstanceList list = res->resource_instances(); + M2MResourceInstanceList::const_iterator it; + it = list.begin(); + for ( ; it != list.end(); it++) { + if((*it)->instance_id() == inst_id) { + success = res->remove_resource_instance(inst_id); + if(res->resource_instance_count() == 0) { + M2MResourceList::const_iterator itr; + itr = _resource_list.begin(); + int pos = 0; + for ( ; itr != _resource_list.end(); itr++, pos++ ) { + if(strcmp((*itr)->name(),resource_name.c_str()) == 0) { + delete res; + res = NULL; + _resource_list.erase(pos); + break; + } + } + } + break; + } + } + } + return success; +} + +M2MResource* M2MObjectInstance::resource(const String &resource_name) const +{ + return resource(resource_name.c_str()); +} + +M2MResource* M2MObjectInstance::resource(const char *resource_name) const +{ + M2MResource *res = NULL; + if(!_resource_list.empty()) { + M2MResourceList::const_iterator it; + it = _resource_list.begin(); + for (; it!=_resource_list.end(); it++ ) { + if(strcmp((*it)->name(), resource_name) == 0) { + res = *it; + break; + } + } + } + return res; +} + +const M2MResourceList& M2MObjectInstance::resources() const +{ + return _resource_list; +} + +uint16_t M2MObjectInstance::resource_count() const +{ + uint16_t count = 0; + if(!_resource_list.empty()) { + M2MResourceList::const_iterator it; + it = _resource_list.begin(); + for ( ; it != _resource_list.end(); it++ ) { + if((*it)->supports_multiple_instances()) { + count += (*it)->resource_instance_count(); + } else { + count++; + } + } + } + return count; +} + +uint16_t M2MObjectInstance::resource_count(const String& resource) const +{ + + return resource_count(resource.c_str()); +} + +uint16_t M2MObjectInstance::resource_count(const char *resource) const +{ + uint16_t count = 0; + if(!_resource_list.empty()) { + M2MResourceList::const_iterator it; + it = _resource_list.begin(); + for ( ; it != _resource_list.end(); it++ ) { + if(strcmp((*it)->name(), resource) == 0) { + if((*it)->supports_multiple_instances()) { + count += (*it)->resource_instance_count(); + } else { + count++; + } + } + } + } + return count; +} + +M2MBase::BaseType M2MObjectInstance::base_type() const +{ + return M2MBase::base_type(); +} + +void M2MObjectInstance::add_observation_level(M2MBase::Observation observation_level) +{ + M2MBase::add_observation_level(observation_level); + if(!_resource_list.empty()) { + M2MResourceList::const_iterator it; + it = _resource_list.begin(); + for ( ; it != _resource_list.end(); it++ ) { + (*it)->add_observation_level(observation_level); + } + } +} + +void M2MObjectInstance::remove_observation_level(M2MBase::Observation observation_level) +{ + M2MBase::remove_observation_level(observation_level); + if(!_resource_list.empty()) { + M2MResourceList::const_iterator it; + it = _resource_list.begin(); + for ( ; it != _resource_list.end(); it++ ) { + (*it)->remove_observation_level(observation_level); + } + } +} + +sn_coap_hdr_s* M2MObjectInstance::handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler) +{ + tr_debug("M2MObjectInstance::handle_get_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + uint8_t * data = NULL; + uint32_t data_length = 0; + if(received_coap_header) { + // process the GET if we have registered a callback for it + if ((operation() & SN_GRS_GET_ALLOWED) != 0) { + if(coap_response) { + uint16_t coap_content_type = 0; + bool content_type_present = false; + + if(received_coap_header->content_format != COAP_CT_NONE) { + content_type_present = true; + coap_content_type = received_coap_header->content_format; + } + if(!content_type_present && + M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) { + coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; + } + + tr_debug("M2MObjectInstance::handle_get_request() - Request Content-Type %d", coap_content_type); + if (coap_response->content_format == COAP_CT_NONE) { + coap_response->content_format = sn_coap_content_format_e(coap_content_type); + + if (coap_response->content_format != COAP_CT_NONE) { + set_coap_content_type(coap_content_type); + } + } + // fill in the CoAP response payload + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + M2MTLVSerializer serializer; + data = serializer.serialize(_resource_list, data_length); + } else { + msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported + } + + coap_response->payload_len = data_length; + coap_response->payload_ptr = data; + + if(data) { + coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response); + + coap_response->options_list_ptr->max_age = max_age(); + + if(received_coap_header->options_list_ptr) { + if(received_coap_header->options_list_ptr->observe != -1) { + if (is_observable()) { + uint32_t number = 0; + uint8_t observe_option = 0; + observe_option = received_coap_header->options_list_ptr->observe; + if(START_OBSERVATION == observe_option) { + tr_debug("M2MObjectInstance::handle_get_request - Starts Observation"); + // If the observe length is 0 means register for observation. + if(received_coap_header->options_list_ptr->observe != -1) { + number = received_coap_header->options_list_ptr->observe; + } + if(received_coap_header->token_ptr) { + tr_debug("M2MObjectInstance::handle_get_request - Sets Observation Token to resource"); + set_observation_token(received_coap_header->token_ptr, + received_coap_header->token_len); + } + + // If the observe value is 0 means register for observation. + if(number == 0) { + tr_debug("M2MObjectInstance::handle_get_request - Put Resource under Observation"); + set_under_observation(true,observation_handler); + add_observation_level(M2MBase::OI_Attribute); + coap_response->options_list_ptr->observe = observation_number(); + } + } else if (STOP_OBSERVATION == observe_option) { + tr_debug("M2MObjectInstance::handle_get_request - Stops Observation"); + set_under_observation(false,NULL); + remove_observation_level(M2MBase::OI_Attribute); + + } + msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + } + else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported + } + } + }else { + tr_error("M2MObjectInstance::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + // Operation is not allowed. + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + +sn_coap_hdr_s* M2MObjectInstance::handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &/*execute_value_updated*/) +{ + tr_debug("M2MObjectInstance::handle_put_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 + sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code);; + if(received_coap_header) { + uint16_t coap_content_type = 0; + bool content_type_present = false; + if(received_coap_header->content_format != COAP_CT_NONE) { + content_type_present = true; + if(coap_response) { + coap_content_type = received_coap_header->content_format; + } + } + if(received_coap_header->options_list_ptr && + received_coap_header->options_list_ptr->uri_query_ptr) { + char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr, + received_coap_header->options_list_ptr->uri_query_len); + if (query){ + tr_debug("M2MObjectInstance::handle_put_request() - Query %s", query); + // if anything was updated, re-initialize the stored notification attributes + if (!handle_observation_attribute(query)){ + tr_debug("M2MObjectInstance::handle_put_request() - Invalid query"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00 + } else { + msg_code =COAP_MSG_CODE_RESPONSE_CHANGED; + } + free(query); + } + } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) { + if(!content_type_present && + M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) { + coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; + } + + tr_debug("M2MObjectInstance::handle_put_request() - Request Content-Type %d", coap_content_type); + + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + M2MTLVDeserializer deserializer; + if(received_coap_header->payload_ptr) { + error = deserializer.deserialize_resources(received_coap_header->payload_ptr, + received_coap_header->payload_len, + *this, + M2MTLVDeserializer::Put); + switch(error) { + case M2MTLVDeserializer::None: + if(observation_handler) { + observation_handler->value_updated(this); + } + msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + break; + case M2MTLVDeserializer::NotFound: + msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND; + break; + case M2MTLVDeserializer::NotAllowed: + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + break; + case M2MTLVDeserializer::NotValid: + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + break; + } + } + } else { + msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; + } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) + } else { + // Operation is not allowed. + tr_error("M2MObjectInstance::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + + + + +sn_coap_hdr_s* M2MObjectInstance::handle_post_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated, + sn_nsdl_addr_s *) +{ + tr_debug("M2MObjectInstance::handle_post_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 + sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + if(received_coap_header) { + if ((operation() & SN_GRS_POST_ALLOWED) != 0) { + uint16_t coap_content_type = 0; + bool content_type_present = false; + if(received_coap_header->content_format != COAP_CT_NONE) { + content_type_present = true; + if(coap_response) { + coap_content_type = received_coap_header->content_format; + } + } + if(!content_type_present && + M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) { + coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; + } + + tr_debug("M2MObjectInstance::handle_post_request() - Request Content-Type %d", coap_content_type); + + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + M2MTLVDeserializer deserializer; + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + error = deserializer.deserialize_resources(received_coap_header->payload_ptr, + received_coap_header->payload_len, + *this, + M2MTLVDeserializer::Post); + + uint16_t instance_id = deserializer.instance_id(received_coap_header->payload_ptr); + switch(error) { + case M2MTLVDeserializer::None: + if(observation_handler) { + execute_value_updated = true; + } + coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response); + + if (coap_response->options_list_ptr) { + + StringBuffer<MAX_PATH_SIZE_3> obj_name; + if(!build_path(obj_name, M2MBase::name(), M2MBase::instance_id(), instance_id)) + { + msg_code = COAP_MSG_CODE_RESPONSE_INTERNAL_SERVER_ERROR; + break; + } + + coap_response->options_list_ptr->location_path_len = obj_name.get_size(); + coap_response->options_list_ptr->location_path_ptr = + alloc_string_copy((uint8_t*)obj_name.c_str(), + coap_response->options_list_ptr->location_path_len); + // todo: handle allocation error + } + msg_code = COAP_MSG_CODE_RESPONSE_CREATED; + break; + case M2MTLVDeserializer::NotAllowed: + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + break; + case M2MTLVDeserializer::NotValid: + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + break; + default: + break; + } + } else { + msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; + } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) + } else { + // Operation is not allowed. + tr_error("M2MObjectInstance::handle_post_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + +void M2MObjectInstance::notification_update(M2MBase::Observation observation_level) +{ + tr_debug("M2MObjectInstance::notification_update() - level(%d)", observation_level); + if((M2MBase::O_Attribute & observation_level) == M2MBase::O_Attribute) { + tr_debug("M2MObjectInstance::notification_update() - object callback"); + _parent.notification_update(instance_id()); + } + if((M2MBase::OI_Attribute & observation_level) == M2MBase::OI_Attribute) { + tr_debug("M2MObjectInstance::notification_update() - object instance callback"); + M2MReportHandler *report_handler = M2MBase::report_handler(); + if(report_handler && is_under_observation()) { + report_handler->set_notification_trigger(); + } + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mreporthandler.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,468 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mreportobserver.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mtimer.h" +#include "include/m2mreporthandler.h" +#include "mbed-trace/mbed_trace.h" +#include <string.h> +#include <stdlib.h> + +#define TRACE_GROUP "mClt" + +M2MReportHandler::M2MReportHandler(M2MReportObserver &observer) +: _observer(observer), + _attribute_state(0), + _notify(false), + _pmin_exceeded(false), + _pmax_exceeded(false), + _pmin_timer(*this), + _pmax_timer(*this), + _pmax(-1.0f), + _pmin(1.0f), + _current_value(0.0f), + _gt(0.0f), + _lt(0.0f), + _st(0.0f), + _high_step(0.0f), + _low_step(0.0f), + _last_value(-1.0f) +{ + tr_debug("M2MReportHandler::M2MReportHandler()"); +} + +M2MReportHandler::~M2MReportHandler() +{ + tr_debug("M2MReportHandler::~M2MReportHandler()"); +} + +void M2MReportHandler::set_under_observation(bool observed) +{ + tr_debug("M2MReportHandler::set_under_observation(observed %d)", (int)observed); + stop_timers(); + if(observed) { + handle_timers(); + } + else { + set_default_values(); + } +} + +void M2MReportHandler::set_value(float value) +{ + tr_debug("M2MReportHandler::set_value() - current %f, last %f", value, _last_value); + _current_value = value; + if(_current_value != _last_value) { + tr_debug("M2MReportHandler::set_value() - UNDER OBSERVATION"); + if (check_threshold_values()) { + schedule_report(); + } + else { + tr_debug("M2MReportHandler::set_value - value not in range"); + _notify = false; + _last_value = _current_value; + if ((_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt || + (_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt || + (_attribute_state & M2MReportHandler::St) == M2MReportHandler::St) { + tr_debug("M2MReportHandler::set_value - stop pmin timer"); + _pmin_timer.stop_timer(); + _pmin_exceeded = true; + } + } + _high_step = _current_value + _st; + _low_step = _current_value - _st; + } +} + +void M2MReportHandler::set_notification_trigger(uint16_t obj_instance_id) +{ + tr_debug("M2MReportHandler::set_notification_trigger(): %d", obj_instance_id); + // Add to array if not there yet + m2m::Vector<uint16_t>::const_iterator it; + it = _changed_instance_ids.begin(); + bool found = false; + for ( ; it != _changed_instance_ids.end(); it++) { + if ((*it) == obj_instance_id) { + found = true; + break; + } + } + if (!found) { + _changed_instance_ids.push_back(obj_instance_id); + } + + _current_value = 0.0f; + _last_value = 1.0f; + schedule_report(); +} + +bool M2MReportHandler::parse_notification_attribute(const char *query, + M2MBase::BaseType type, + M2MResourceInstance::ResourceType resource_type) +{ + tr_debug("M2MReportHandler::parse_notification_attribute(Query %s, Base type %d)", query, (int)type); + bool success = false; + const char* sep_pos = strchr(query, '&'); + const char* rest = query; + if( sep_pos != NULL ){ + char query_options[5][20]; + float pmin = _pmin; + float pmax = _pmax; + float lt = _lt; + float gt = _gt; + float st = _st; + float high = _high_step; + float low = _low_step; + uint8_t attr = _attribute_state; + + memset(query_options, 0, sizeof(query_options[0][0]) * 5 * 20); + uint8_t num_options = 0; + while( sep_pos != NULL && num_options < 5){ + size_t len = (size_t)(sep_pos-rest); + if( len > 19 ){ + len = 19; + } + memcpy(query_options[num_options], rest, len); + sep_pos++; + rest = sep_pos; + sep_pos = strchr(rest, '&'); + num_options++; + } + if( num_options < 5 && strlen(rest) > 0){ + size_t len = (size_t)strlen(rest); + if( len > 19 ){ + len = 19; + } + memcpy(query_options[num_options++], rest, len); + } + + for (int option = 0; option < num_options; option++) { + success = set_notification_attribute(query_options[option],type, resource_type); + if (!success) { + tr_debug("M2MReportHandler::parse_notification_attribute - break"); + break; + } + } + + if(success) { + success = check_attribute_validity(); + } + else { + tr_debug("M2MReportHandler::parse_notification_attribute - not valid query"); + _pmin = pmin; + _pmax = pmax; + _st = st; + _lt = lt; + _gt = gt; + _high_step = high; + _low_step = low; + _attribute_state = attr; + } + } + else { + if(set_notification_attribute(query, type, resource_type)) { + success = check_attribute_validity(); + } + } + + return success; +} + +void M2MReportHandler::timer_expired(M2MTimerObserver::Type type) +{ + switch(type) { + case M2MTimerObserver::PMinTimer: { + tr_debug("M2MReportHandler::timer_expired - PMIN"); + if (_notify || + (_pmin > 0 && + (_attribute_state & M2MReportHandler::Pmax) != M2MReportHandler::Pmax)){ + report(); + } + else{ + _pmin_exceeded = true; + } + } + break; + case M2MTimerObserver::PMaxTimer: { + tr_debug("M2MReportHandler::timer_expired - PMAX"); + _pmax_exceeded = true; + if (_pmin_exceeded || + (_attribute_state & M2MReportHandler::Pmin) != M2MReportHandler::Pmin ) { + report(); + } + } + break; + default: + break; + } +} + +bool M2MReportHandler::set_notification_attribute(const char* option, + M2MBase::BaseType type, + M2MResourceInstance::ResourceType resource_type) +{ + tr_debug("M2MReportHandler::set_notification_attribute()"); + bool success = false; + char attribute[20]; + char value[20]; + memset(&attribute, 0, 20); + memset(&value, 0, 20); + + const char* pos = strstr(option, EQUAL); + if( pos != NULL ){ + memcpy(attribute, option, (size_t)(pos-option)); + pos++; + memcpy(value, pos, strlen(pos)); + }else{ + memcpy(attribute, option, (size_t)strlen(option) + 1); + } + + if (strlen(value)) { + if (strcmp(attribute, PMIN) == 0) { + _pmin = atoi(value); + success = true; + _attribute_state |= M2MReportHandler::Pmin; + tr_debug("M2MReportHandler::set_notification_attribute %s to %d", attribute, _pmin); + } + else if(strcmp(attribute, PMAX) == 0) { + _pmax = atoi(value); + success = true; + _attribute_state |= M2MReportHandler::Pmax; + tr_debug("M2MReportHandler::set_notification_attribute %s to %d", attribute, _pmax); + } + else if(strcmp(attribute, GT) == 0 && + (M2MBase::Resource == type)){ + _gt = atof(value); + success = true; + _attribute_state |= M2MReportHandler::Gt; + tr_debug("M2MReportHandler::set_notification_attribute %s to %f", attribute, _gt); + } + else if(strcmp(attribute, LT) == 0 && + (M2MBase::Resource == type)){ + _lt = atof(value); + success = true; + _attribute_state |= M2MReportHandler::Lt; + tr_debug("M2MReportHandler::set_notification_attribute %s to %f", attribute, _lt); + } + else if((strcmp(attribute, ST_SIZE) == 0 || (strcmp(attribute, STP) == 0)) + && (M2MBase::Resource == type)){ + _st = atof(value); + success = true; + _high_step = _current_value + _st; + _low_step = _current_value - _st; + _attribute_state |= M2MReportHandler::St; + tr_debug("M2MReportHandler::set_notification_attribute %s to %f", attribute, _st); + } + // Return false if try to set gt,lt or st when the resource type is something else than numerical + if ((resource_type != M2MResourceInstance::INTEGER && + resource_type != M2MResourceInstance::FLOAT) && + ((_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt || + (_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt || + (_attribute_state & M2MReportHandler::St) == M2MReportHandler::St)) { + tr_debug("M2MReportHandler::set_notification_attribute - not numerical resource"); + success = false; + } + } + return success; +} + +void M2MReportHandler::schedule_report() +{ + tr_debug("M2MReportHandler::schedule_report()"); + _notify = true; + if ((_attribute_state & M2MReportHandler::Pmin) != M2MReportHandler::Pmin || + _pmin_exceeded) { + report(); + } +} + +void M2MReportHandler::report() +{ + tr_debug("M2MReportHandler::report()"); + if(_current_value != _last_value && _notify) { + tr_debug("M2MReportHandler::report()- send with PMIN"); + _pmin_exceeded = false; + _pmax_exceeded = false; + _notify = false; + _observer.observation_to_be_sent(_changed_instance_ids); + _changed_instance_ids.clear(); + _pmax_timer.stop_timer(); + } + else { + if (_pmax_exceeded) { + tr_debug("M2MReportHandler::report()- send with PMAX"); + _observer.observation_to_be_sent(_changed_instance_ids, true); + _changed_instance_ids.clear(); + } + else { + tr_debug("M2MReportHandler::report()- no need to send"); + } + } + handle_timers(); + _last_value = _current_value; +} + +void M2MReportHandler::handle_timers() +{ + tr_debug("M2MReportHandler::handle_timers()"); + uint64_t time_interval = 0; + if ((_attribute_state & M2MReportHandler::Pmin) == M2MReportHandler::Pmin) { + if (_pmin == _pmax) { + _pmin_exceeded = true; + } else { + _pmin_exceeded = false; + time_interval = (uint64_t) ((uint64_t)_pmin * 1000); + tr_debug("M2MReportHandler::handle_timers() - Start PMIN interval: %d", (int)time_interval); + _pmin_timer.start_timer(time_interval, + M2MTimerObserver::PMinTimer, + true); + } + } + if ((_attribute_state & M2MReportHandler::Pmax) == M2MReportHandler::Pmax) { + if (_pmax > 0) { + time_interval = (uint64_t) ((uint64_t)_pmax * 1000); + tr_debug("M2MReportHandler::handle_timers() - Start PMAX interval: %d", (int)time_interval); + _pmax_timer.start_timer(time_interval, + M2MTimerObserver::PMaxTimer, + true); + } + } +} + +bool M2MReportHandler::check_attribute_validity() +{ + bool success = true; + if ((_attribute_state & M2MReportHandler::Pmax) == M2MReportHandler::Pmax && + ((_pmax >= -1.0) && (_pmin > _pmax))) { + success = false; + } + float low = _lt + 2 * _st; + if ((_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt && + (low >= _gt)) { + success = false; + } + return success; +} + +void M2MReportHandler::stop_timers() +{ + tr_debug("M2MReportHandler::stop_timers()"); + + _pmin_exceeded = false; + _pmin_timer.stop_timer(); + + _pmax_exceeded = false; + _pmax_timer.stop_timer(); + + tr_debug("M2MReportHandler::stop_timers() - out"); +} + +void M2MReportHandler::set_default_values() +{ + tr_debug("M2MReportHandler::set_default_values"); + _pmax = -1.0; + _pmin = 1.0; + _gt = 0.0f; + _lt = 0.0f; + _st = 0.0f; + _high_step = 0.0f; + _low_step = 0.0f; + _pmin_exceeded = false; + _pmax_exceeded = false; + _last_value = -1.0f; + _attribute_state = 0; + _changed_instance_ids.clear(); +} + +bool M2MReportHandler::check_threshold_values() +{ + tr_debug("M2MReportHandler::check_threshold_values"); + tr_debug("Current value: %f", _current_value); + tr_debug("High step: %f", _high_step); + tr_debug("Low step: %f", _low_step); + tr_debug("Less than: %f", _lt); + tr_debug("Greater than: %f", _gt); + tr_debug("Step: %f", _st); + bool can_send = false; + // Check step condition + if ((_attribute_state & M2MReportHandler::St) == M2MReportHandler::St) { + if ((_current_value >= _high_step || + _current_value <= _low_step)) { + can_send = true; + } + else { + if ((_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt || + (_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt ) { + can_send = check_gt_lt_params(); + } + else { + can_send = false; + } + } + } + else { + can_send = check_gt_lt_params(); + } + tr_debug("M2MReportHandler::check_threshold_values - value in range = %d", (int)can_send); + return can_send; +} + +bool M2MReportHandler::check_gt_lt_params() +{ + tr_debug("M2MReportHandler::check_gt_lt_params"); + bool can_send = false; + // GT & LT set. + if ((_attribute_state & (M2MReportHandler::Lt | M2MReportHandler::Gt)) + == (M2MReportHandler::Lt | M2MReportHandler::Gt)) { + if (_current_value > _gt || _current_value < _lt) { + can_send = true; + } + else { + can_send = false; + } + } + // Only LT + else if ((_attribute_state & M2MReportHandler::Lt) == M2MReportHandler::Lt && + (_attribute_state & M2MReportHandler::Gt) == 0 ) { + if (_current_value < _lt) { + can_send = true; + } + else { + can_send = false; + } + } + // Only GT + else if ((_attribute_state & M2MReportHandler::Gt) == M2MReportHandler::Gt && + (_attribute_state & M2MReportHandler::Lt) == 0 ) { + if (_current_value > _gt) { + can_send = true; + } + else { + can_send = false; + } + } + // GT & LT not set. + else { + can_send = true; + } + tr_debug("M2MReportHandler::check_gt_lt_params - value in range = %d", (int)can_send); + return can_send; +} + +uint8_t M2MReportHandler::attribute_flags() +{ + return _attribute_state; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mresource.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,619 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mobservationhandler.h" +#include "include/m2mreporthandler.h" +#include "include/m2mtlvserializer.h" +#include "include/m2mtlvdeserializer.h" +#include "mbed-trace/mbed_trace.h" + +#include <stdlib.h> + +#define TRACE_GROUP "mClt" + +M2MResource::M2MResource(M2MObjectInstance &parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + char *path, + const uint16_t object_instance_id, + bool multiple_instance, + bool external_blockwise_store) +: M2MResourceInstance(*this, resource_name, resource_type, type, value, value_length, + object_instance_id, + path, external_blockwise_store), + _parent(parent), + _delayed_token(NULL), + _delayed_token_len(0), + _has_multiple_instances(multiple_instance), + _delayed_response(false) +{ + M2MBase::set_base_type(M2MBase::Resource); + M2MBase::set_operation(M2MBase::GET_ALLOWED); + M2MBase::set_observable(false); + +} + +M2MResource::M2MResource(M2MObjectInstance &parent, + const lwm2m_parameters_s* s, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id) +: M2MResourceInstance(*this, s, type, object_instance_id), + _parent(parent), + _delayed_token(NULL), + _delayed_token_len(0), + _has_multiple_instances(false), + _delayed_response(false) +{ + // tbd: _has_multiple_instances could be in flash, but no real benefit, because of current alignment. +} + +M2MResource::M2MResource(M2MObjectInstance &parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + char *path, + const uint16_t object_instance_id, + bool multiple_instance, + bool external_blockwise_store) +: M2MResourceInstance(*this, resource_name, resource_type, type, + object_instance_id, + path, + external_blockwise_store), + _parent(parent), + _delayed_token(NULL), + _delayed_token_len(0), + _has_multiple_instances(multiple_instance), + _delayed_response(false) +{ + M2MBase::set_base_type(M2MBase::Resource); + M2MBase::set_operation(M2MBase::GET_PUT_ALLOWED); + M2MBase::set_observable(observable); +} + + +M2MResource::~M2MResource() +{ + if(!_resource_instance_list.empty()) { + M2MResourceInstance* res = NULL; + M2MResourceInstanceList::const_iterator it; + it = _resource_instance_list.begin(); + for (; it!=_resource_instance_list.end(); it++ ) { + //Free allocated memory for resources. + res = *it; + delete res; + } + _resource_instance_list.clear(); + } + free(_delayed_token); +} + +bool M2MResource::supports_multiple_instances() const +{ + return _has_multiple_instances; +} + +void M2MResource::set_delayed_response(bool delayed_response) +{ + _delayed_response = delayed_response; +} + +bool M2MResource::send_delayed_post_response() +{ + bool success = false; + if(_delayed_response) { + success = true; + observation_handler()->send_delayed_response(this); + } + return success; +} + +void M2MResource::get_delayed_token(uint8_t *&token, uint8_t &token_length) +{ + token_length = 0; + if(token) { + free(token); + token = NULL; + } + if(_delayed_token && _delayed_token_len > 0) { + token = alloc_copy(_delayed_token, _delayed_token_len); + if(token) { + token_length = _delayed_token_len; + } + } +} + +bool M2MResource::remove_resource_instance(uint16_t inst_id) +{ + tr_debug("M2MResource::remove_resource(inst_id %d)", inst_id); + bool success = false; + if(!_resource_instance_list.empty()) { + M2MResourceInstance* res = NULL; + M2MResourceInstanceList::const_iterator it; + it = _resource_instance_list.begin(); + int pos = 0; + for ( ; it != _resource_instance_list.end(); it++, pos++ ) { + if(((*it)->instance_id() == inst_id)) { + // Resource found and deleted. + res = *it; + delete res; + _resource_instance_list.erase(pos); + success = true; + break; + } + } + } + return success; +} + +M2MResourceInstance* M2MResource::resource_instance(uint16_t inst_id) const +{ + tr_debug("M2MResource::resource(resource_name inst_id %d)", inst_id); + M2MResourceInstance *res = NULL; + if(!_resource_instance_list.empty()) { + M2MResourceInstanceList::const_iterator it; + it = _resource_instance_list.begin(); + for ( ; it != _resource_instance_list.end(); it++ ) { + if(((*it)->instance_id() == inst_id)) { + // Resource found. + res = *it; + break; + } + } + } + return res; +} + +const M2MResourceInstanceList& M2MResource::resource_instances() const +{ + return _resource_instance_list; +} + +uint16_t M2MResource::resource_instance_count() const +{ + return (uint16_t)_resource_instance_list.size(); +} + +bool M2MResource::delayed_response() const +{ + return _delayed_response; +} + +bool M2MResource::handle_observation_attribute(const char *query) +{ + tr_debug("M2MResource::handle_observation_attribute - is_under_observation(%d)", is_under_observation()); + bool success = false; + M2MReportHandler *handler = M2MBase::report_handler(); + if (!handler) { + handler = M2MBase::create_report_handler(); + } + + if (handler) { + success = handler->parse_notification_attribute(query, + M2MBase::base_type(), _resource_type); + if (success) { + if (is_under_observation()) { + handler->set_under_observation(true); + } + } + else { + handler->set_default_values(); + } + + if (success) { + if(!_resource_instance_list.empty()) { + M2MResourceInstanceList::const_iterator it; + it = _resource_instance_list.begin(); + for ( ; it != _resource_instance_list.end(); it++ ) { + M2MReportHandler *report_handler = (*it)->report_handler(); + if(report_handler && is_under_observation()) { + report_handler->set_notification_trigger(); + } + } + } + } + } + return success; +} + +void M2MResource::add_observation_level(M2MBase::Observation observation_level) +{ + M2MBase::add_observation_level(observation_level); + if(!_resource_instance_list.empty()) { + M2MResourceInstanceList::const_iterator inst; + inst = _resource_instance_list.begin(); + for ( ; inst != _resource_instance_list.end(); inst++ ) { + (*inst)->add_observation_level(observation_level); + } + } +} + +void M2MResource::remove_observation_level(M2MBase::Observation observation_level) +{ + M2MBase::remove_observation_level(observation_level); + if(!_resource_instance_list.empty()) { + M2MResourceInstanceList::const_iterator inst; + inst = _resource_instance_list.begin(); + for ( ; inst != _resource_instance_list.end(); inst++ ) { + (*inst)->remove_observation_level(observation_level); + } + } +} + +void M2MResource::add_resource_instance(M2MResourceInstance *res) +{ + tr_debug("M2MResource::add_resource_instance()"); + if(res) { + _resource_instance_list.push_back(res); + } +} + +sn_coap_hdr_s* M2MResource::handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler) +{ + tr_debug("M2MResource::handle_get_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + sn_coap_hdr_s * coap_response = NULL; + if(_has_multiple_instances) { + coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + if(received_coap_header) { + // process the GET if we have registered a callback for it + if ((operation() & SN_GRS_GET_ALLOWED) != 0) { + if(coap_response) { + uint16_t coap_content_type = 0; + bool content_type_present = false; + if(received_coap_header->content_format != COAP_CT_NONE){ + content_type_present = true; + coap_content_type = received_coap_header->content_format; + } + + if(!content_type_present && + M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) { + coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; + } + + tr_debug("M2MResource::handle_get_request() - Request Content-Type %d", coap_content_type); + if (coap_response->content_format == COAP_CT_NONE) { + coap_response->content_format = sn_coap_content_format_e(coap_content_type); + if (coap_response->content_format != COAP_CT_NONE) { + set_coap_content_type(coap_content_type); + } + } + uint8_t *data = NULL; + uint32_t data_length = 0; + // fill in the CoAP response payload + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + M2MTLVSerializer serializer; + data = serializer.serialize(this, data_length); + } else { + msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; // Content format not supported + } + + coap_response->payload_len = data_length; + coap_response->payload_ptr = data; + + coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response); + + coap_response->options_list_ptr->max_age = max_age(); + + if(received_coap_header->options_list_ptr) { + if(received_coap_header->options_list_ptr->observe != -1) { + if (is_observable()) { + uint32_t number = 0; + uint8_t observe_option = 0; + observe_option = received_coap_header->options_list_ptr->observe; + if(START_OBSERVATION == observe_option) { + tr_debug("M2MResource::handle_get_request - Starts Observation"); + // If the observe length is 0 means register for observation. + if(received_coap_header->options_list_ptr->observe != -1) { + number = received_coap_header->options_list_ptr->observe; + } + if(received_coap_header->token_ptr) { + tr_debug("M2MResource::handle_get_request - Sets Observation Token to resource"); + set_observation_token(received_coap_header->token_ptr, + received_coap_header->token_len); + } + + // If the observe value is 0 means register for observation. + if(number == 0) { + tr_debug("M2MResource::handle_get_request - Put Resource under Observation"); + M2MResourceInstanceList::const_iterator it; + it = _resource_instance_list.begin(); + for (; it!=_resource_instance_list.end(); it++ ) { + tr_debug("M2MResource::handle_get_request - set_resource_observer"); + (*it)->set_resource_observer(this); + (*it)->add_observation_level(M2MBase::R_Attribute); + } + set_under_observation(true,observation_handler); + M2MBase::add_observation_level(M2MBase::R_Attribute); + coap_response->options_list_ptr->observe = observation_number(); + } + } else if (STOP_OBSERVATION == observe_option) { + tr_debug("M2MResource::handle_get_request - Stops Observation"); + set_under_observation(false,NULL); + M2MBase::remove_observation_level(M2MBase::R_Attribute); + M2MResourceInstanceList::const_iterator it; + it = _resource_instance_list.begin(); + for (; it!=_resource_instance_list.end(); it++ ) { + (*it)->set_resource_observer(NULL); + } + } + msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + } + else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } + } + } + } else { + tr_error("M2MResource::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + // Operation is not allowed. + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + } else { + coap_response = M2MResourceInstance::handle_get_request(nsdl, + received_coap_header, + observation_handler); + } + return coap_response; +} + +sn_coap_hdr_s* M2MResource::handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated) +{ + tr_debug("M2MResource::handle_put_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 + sn_coap_hdr_s * coap_response = NULL; + if(_has_multiple_instances) { + coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + // process the PUT if we have registered a callback for it + if(received_coap_header) { + uint16_t coap_content_type = 0; + bool content_type_present = false; + if(received_coap_header->content_format != COAP_CT_NONE && coap_response) { + content_type_present = true; + coap_content_type = received_coap_header->content_format; + } + if(received_coap_header->options_list_ptr && + received_coap_header->options_list_ptr->uri_query_ptr) { + char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr, + received_coap_header->options_list_ptr->uri_query_len); + if (query){ + msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + tr_debug("M2MResource::handle_put_request() - Query %s", query); + // if anything was updated, re-initialize the stored notification attributes + if (!handle_observation_attribute(query)){ + tr_debug("M2MResource::handle_put_request() - Invalid query"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00 + } + free(query); + } + } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) { + if(!content_type_present && + M2MBase::coap_content_type() == COAP_CONTENT_OMA_TLV_TYPE) { + coap_content_type = COAP_CONTENT_OMA_TLV_TYPE; + } + + tr_debug("M2MResource::handle_put_request() - Request Content-Type %d", coap_content_type); + + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + M2MTLVDeserializer deserializer; + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + error = deserializer.deserialize_resource_instances(received_coap_header->payload_ptr, + received_coap_header->payload_len, + *this, + M2MTLVDeserializer::Put); + switch(error) { + case M2MTLVDeserializer::None: + if(observation_handler) { + String value = ""; + if (received_coap_header->uri_path_ptr != NULL && + received_coap_header->uri_path_len > 0) { + + value.append_raw((char*)received_coap_header->uri_path_ptr,received_coap_header->uri_path_len); + } + execute_value_updated = true; + } + msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + break; + case M2MTLVDeserializer::NotFound: + msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND; + break; + case M2MTLVDeserializer::NotAllowed: + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + break; + case M2MTLVDeserializer::NotValid: + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + break; + } + } else { + msg_code =COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; + } // if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) + } else { + // Operation is not allowed. + tr_error("M2MResource::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + } else { + coap_response = M2MResourceInstance::handle_put_request(nsdl, + received_coap_header, + observation_handler, + execute_value_updated); + } + return coap_response; +} + +sn_coap_hdr_s* M2MResource::handle_post_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler */*observation_handler*/, + bool &/*execute_value_updated*/, + sn_nsdl_addr_s *address) +{ + tr_debug("M2MResource::handle_post_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 + sn_coap_hdr_s * coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + // process the POST if we have registered a callback for it + if(received_coap_header) { + if ((operation() & SN_GRS_POST_ALLOWED) != 0) { + M2MResource::M2MExecuteParameter *exec_params = new M2MResource::M2MExecuteParameter(); + if (exec_params) { + exec_params->_object_name = object_name(); + exec_params->_resource_name = name(); + exec_params->_object_instance_id = object_instance_id(); + } + uint16_t coap_content_type = 0; + if(received_coap_header->payload_ptr) { + if(received_coap_header->content_format != COAP_CT_NONE) { + coap_content_type = received_coap_header->content_format; + } + if(coap_content_type == 0) { + if (exec_params){ + exec_params->_value = alloc_string_copy(received_coap_header->payload_ptr, + received_coap_header->payload_len); + if (exec_params->_value) { + exec_params->_value_length = received_coap_header->payload_len; + } + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; + } + } + if(COAP_MSG_CODE_RESPONSE_CHANGED == msg_code) { + tr_debug("M2MResource::handle_post_request - Execute resource function"); + if(_delayed_response) { + msg_code = COAP_MSG_CODE_EMPTY; + coap_response->msg_type = COAP_MSG_TYPE_ACKNOWLEDGEMENT; + coap_response->msg_code = msg_code; + coap_response->msg_id = received_coap_header->msg_id; + if(received_coap_header->token_len) { + free(_delayed_token); + _delayed_token = NULL; + _delayed_token_len = 0; + _delayed_token = alloc_copy(received_coap_header->token_ptr, received_coap_header->token_len); + if(_delayed_token) { + _delayed_token_len = received_coap_header->token_len; + } + sn_nsdl_send_coap_message(nsdl, address, coap_response); + } + } else { + uint32_t length = 0; + get_value(coap_response->payload_ptr, length); + coap_response->payload_len = length; + } + execute(exec_params); + } + delete exec_params; + } else { // if ((object->operation() & SN_GRS_POST_ALLOWED) != 0) + tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.05 + } + } else { //if(object && received_coap_header) + tr_error("M2MResource::handle_post_request - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; // 4.01 + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + +void M2MResource::notification_update() +{ + tr_debug("M2MResource::notification_update()"); + M2MReportHandler *report_handler = M2MBase::report_handler(); + if(report_handler && is_observable()) { + report_handler->set_notification_trigger(); + } +} + +M2MObjectInstance& M2MResource::get_parent_object_instance() const +{ + return _parent; +} + +const char* M2MResource::object_name() const +{ + const M2MObjectInstance& parent_object_instance = _parent; + const M2MObject& parent_object = parent_object_instance.get_parent_object(); + + return parent_object.name(); +} + + +M2MResource::M2MExecuteParameter::M2MExecuteParameter() +{ + _value = NULL; + _value_length = 0; + _object_name = ""; + _resource_name = ""; + _object_instance_id = 0; +} + +M2MResource::M2MExecuteParameter::~M2MExecuteParameter() +{ + free(_value); +} + +uint8_t *M2MResource::M2MExecuteParameter::get_argument_value() const +{ + return _value; +} + +uint16_t M2MResource::M2MExecuteParameter::get_argument_value_length() const +{ + return _value_length; +} + +const String& M2MResource::M2MExecuteParameter::get_argument_object_name() const +{ + return _object_name; +} + +const String& M2MResource::M2MExecuteParameter::get_argument_resource_name() const +{ + return _resource_name; +} + +uint16_t M2MResource::M2MExecuteParameter::get_argument_object_instance_id() const +{ + return _object_instance_id; +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mresourceinstance.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,621 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <stdlib.h> +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mobservationhandler.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "include/m2mreporthandler.h" +#include "include/nsdllinker.h" +#include "mbed-client/m2mblockmessage.h" +#include "mbed-trace/mbed_trace.h" + +#define TRACE_GROUP "mClt" + +M2MResourceInstance::M2MResourceInstance(M2MResource &parent, + const String &res_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id, + char* path, + bool external_blockwise_store) +: M2MBase(res_name, + M2MBase::Dynamic, + resource_type, + path, + external_blockwise_store), + _parent_resource(parent), + _value(NULL), + _value_length(0), + _block_message_data(NULL), + _execute_callback(NULL), + _resource_callback(NULL), + _execute_function_pointer(NULL), + _notification_sent_function_pointer(NULL), + _incoming_block_message_cb(NULL), + _outgoing_block_message_cb(NULL), + _notification_sent_callback(NULL), + _object_instance_id(object_instance_id), + _resource_type(type) +{ + M2MBase::set_base_type(M2MBase::ResourceInstance); +} + +M2MResourceInstance::M2MResourceInstance(M2MResource &parent, + const String &res_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + const uint16_t object_instance_id, + char* path, + bool external_blockwise_store) +: M2MBase(res_name, + M2MBase::Static, + resource_type, + path, + external_blockwise_store), + _parent_resource(parent), + _value(NULL), + _value_length(0), + _block_message_data(NULL), + _execute_callback(NULL), + _resource_callback(NULL), + _execute_function_pointer(NULL), + _notification_sent_function_pointer(NULL), + _incoming_block_message_cb(NULL), + _outgoing_block_message_cb(NULL), + _notification_sent_callback(NULL), + _object_instance_id(object_instance_id), + _resource_type(type) +{ + M2MBase::set_base_type(M2MBase::Resource); + if (mode() == M2MBase::Dynamic) { + if( value != NULL && value_length > 0 ) { + _value = alloc_string_copy(value, value_length); + if(_value) { + _value_length = value_length; + } + } + } + // Copy resource value to struct since static resources are handled in mbed-client-c + else if (mode() == M2MBase::Static) { + sn_nsdl_dynamic_resource_parameters_s* res = get_nsdl_resource(); + sn_nsdl_static_resource_parameters_s* params = (sn_nsdl_static_resource_parameters_s*)res->static_resource_parameters; + params->resource = alloc_string_copy(value, value_length); + params->resourcelen = value_length; + } + else { + // Directory, not supported + } +} + +M2MResourceInstance::M2MResourceInstance(M2MResource &parent, + const lwm2m_parameters_s* s, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id) +: M2MBase(s), + _parent_resource(parent), + _value(NULL), + _value_length(0), + _block_message_data(NULL), + _execute_callback(NULL), + _resource_callback(NULL), + _execute_function_pointer(NULL), + _notification_sent_function_pointer(NULL), + _incoming_block_message_cb(NULL), + _outgoing_block_message_cb(NULL), + _notification_sent_callback(NULL), + _object_instance_id(object_instance_id), + _resource_type(type) +{ + //TBD: put to flash, or parse from the uri_path!!!! + //same for the _object_instance_id. + // TBD: we dont need _value here, because in c-struct there is resource field!!!! + if( s->dynamic_resource_params->static_resource_parameters->resource != NULL && + s->dynamic_resource_params->static_resource_parameters->resourcelen > 0 ) { + _value = alloc_string_copy(s->dynamic_resource_params->static_resource_parameters->resource, + s->dynamic_resource_params->static_resource_parameters->resourcelen); + if(_value) { + _value_length = s->dynamic_resource_params->static_resource_parameters->resourcelen; + } + } + //M2MBase::set_base_type(M2MBase::ResourceInstance); +} + +M2MResourceInstance::~M2MResourceInstance() +{ + free(_value); + delete _execute_function_pointer; + delete _execute_callback; + delete _notification_sent_function_pointer; + delete _incoming_block_message_cb; + delete _outgoing_block_message_cb; + delete _notification_sent_callback; + delete _block_message_data; +} + +M2MBase::BaseType M2MResourceInstance::base_type() const +{ + return M2MBase::base_type(); +} + +M2MResourceInstance::ResourceType M2MResourceInstance::resource_instance_type() const +{ + return _resource_type; +} + +bool M2MResourceInstance::handle_observation_attribute(const char *query) +{ + tr_debug("M2MResourceInstance::handle_observation_attribute - is_under_observation(%d)", is_under_observation()); + bool success = false; + + M2MReportHandler *handler = M2MBase::report_handler(); + if (!handler) { + handler = M2MBase::create_report_handler(); + } + + if (handler) { + success = handler->parse_notification_attribute(query, + M2MBase::base_type(), _resource_type); + if(success) { + if (is_under_observation()) { + handler->set_under_observation(true); + } + } else { + handler->set_default_values(); + } + } + return success; +} + +void M2MResourceInstance::set_execute_function(execute_callback callback) +{ + delete _execute_callback; + _execute_callback = new execute_callback(callback); +} + +void M2MResourceInstance::set_execute_function(execute_callback_2 callback) +{ + delete _execute_function_pointer; + + _execute_function_pointer = new FP1<void, void*>(callback); + set_execute_function(execute_callback(_execute_function_pointer, &FP1<void, void*>::call)); +} + +void M2MResourceInstance::clear_value() +{ + tr_debug("M2MResourceInstance::clear_value"); + + free(_value); + _value = NULL; + _value_length = 0; + + report(); +} + +bool M2MResourceInstance::set_value(int64_t value) +{ + bool success; + // max len of "-9223372036854775808" plus zero termination + char buffer[20+1]; + uint32_t size = m2m::itoa_c(value, buffer); + + success = set_value((const uint8_t*)buffer, size); + + return success; +} + +bool M2MResourceInstance::set_value(const uint8_t *value, + const uint32_t value_length) +{ + tr_debug("M2MResourceInstance::set_value()"); + bool success = false; + bool value_changed = false; + if(is_value_changed(value,value_length)) { + value_changed = true; + } + if( value != NULL && value_length > 0 ) { + success = true; + + free(_value); + _value_length = 0; + + _value = alloc_string_copy(value, value_length); + if(_value) { + _value_length = value_length; + if( value_changed ) { // + if (_resource_type == M2MResourceInstance::STRING) { + M2MReportHandler *report_handler = M2MBase::report_handler(); + if(report_handler && is_under_observation()) { + report_handler->set_notification_trigger(); + } + } + else { + report(); + } + } + } + } + return success; +} + +void M2MResourceInstance::report() +{ + tr_debug("M2MResourceInstance::report()"); + M2MBase::Observation observation_level = M2MBase::observation_level(); + tr_debug("M2MResourceInstance::report() - level %d", observation_level); + if((M2MBase::O_Attribute & observation_level) == M2MBase::O_Attribute || + (M2MBase::OI_Attribute & observation_level) == M2MBase::OI_Attribute) { + tr_debug("M2MResourceInstance::report() -- object/instance level"); + M2MObjectInstance& object_instance = get_parent_resource().get_parent_object_instance(); + object_instance.notification_update(observation_level); + } + + if(M2MBase::Dynamic == mode() && + (M2MBase::R_Attribute & observation_level) == M2MBase::R_Attribute) { + tr_debug("M2MResourceInstance::report() - resource level"); + if(!_resource_callback && _resource_type != M2MResourceInstance::STRING) { + M2MReportHandler *report_handler = M2MBase::report_handler(); + if (report_handler && is_observable()) { + if(_value) { + report_handler->set_value(atof((const char*)_value)); + } else { + report_handler->set_value(0); + } + } + } + else { + if (_resource_callback && base_type() == M2MBase::ResourceInstance) { + _resource_callback->notification_update(); + } + } + } else if(M2MBase::Static == mode()) { + M2MObservationHandler *observation_handler = M2MBase::observation_handler(); + if(observation_handler) { + observation_handler->value_updated(this); + } + } else { + tr_debug("M2MResourceInstance::report() - mode = %d, is_observable = %d", mode(), is_observable()); + } +} + +bool M2MResourceInstance::is_value_changed(const uint8_t* value, const uint32_t value_len) +{ + bool changed = false; + if(value_len != _value_length) { + changed = true; + } else if(value && !_value) { + changed = true; + } else if(_value && !value) { + changed = true; + } else { + if (_value) { + if (strcmp((char*)value, (char*)_value) != 0) { + changed = true; + } + } + } + tr_debug("M2MResourceInstance::is_value_changed() -- %s", changed ? "true" : "false"); + return changed; +} + +void M2MResourceInstance::execute(void *arguments) +{ + tr_debug("M2MResourceInstance::execute"); + if(_execute_callback) { + (*_execute_callback)(arguments); + } +} + +void M2MResourceInstance::get_value(uint8_t *&value, uint32_t &value_length) +{ + value_length = 0; + if(value) { + free(value); + value = NULL; + } + if(_value && _value_length > 0) { + value = alloc_string_copy(_value, _value_length); + if(value) { + value_length = _value_length; + } + } +} + +int M2MResourceInstance::get_value_int() +{ + int value_int = 0; + // Get the value and convert it into integer. This is not the most + // efficient way, as it takes pointless heap copy to get the zero termination. + uint8_t* buffer = NULL; + uint32_t length; + get_value(buffer,length); + if(buffer) { + value_int = atoi((const char*)buffer); + free(buffer); + } + return value_int; +} + +String M2MResourceInstance::get_value_string() const +{ + // XXX: do a better constructor to avoid pointless malloc + String value; + if (_value) { + value.append_raw((char*)_value, _value_length); + } + + return value; +} + +uint8_t* M2MResourceInstance::value() const +{ + return _value; +} + +uint32_t M2MResourceInstance::value_length() const +{ + return _value_length; +} + +sn_coap_hdr_s* M2MResourceInstance::handle_get_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler) +{ + tr_debug("M2MResourceInstance::handle_get_request()"); + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; + sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + if(received_coap_header) { + // process the GET if we have registered a callback for it + if ((operation() & SN_GRS_GET_ALLOWED) != 0) { + if(coap_response) { + if(_resource_type == M2MResourceInstance::OPAQUE) { + coap_response->content_format = sn_coap_content_format_e(COAP_CONTENT_OMA_OPAQUE_TYPE); + } else { + coap_response->content_format = sn_coap_content_format_e(0); + } + // fill in the CoAP response payload + coap_response->payload_ptr = NULL; + uint32_t payload_len = 0; + + //If handler exists it means that resource value is stored in application side + if (block_message() && block_message()->is_block_message()) { + if(_outgoing_block_message_cb) { + String name = ""; + if (received_coap_header->uri_path_ptr != NULL && + received_coap_header->uri_path_len > 0) { + name.append_raw((char *)received_coap_header->uri_path_ptr, + received_coap_header->uri_path_len); + } + (*_outgoing_block_message_cb)(name, coap_response->payload_ptr, payload_len); + } + } else { + get_value(coap_response->payload_ptr,payload_len); + } + + coap_response->payload_len = payload_len; + coap_response->options_list_ptr = sn_nsdl_alloc_options_list(nsdl, coap_response); + + coap_response->options_list_ptr->max_age = max_age(); + + if(received_coap_header->options_list_ptr) { + if(received_coap_header->options_list_ptr->observe != -1) { + if (is_observable()) { + uint32_t number = 0; + uint8_t observe_option = 0; + observe_option = received_coap_header->options_list_ptr->observe; + + if(START_OBSERVATION == observe_option) { + tr_debug("M2MResourceInstance::handle_get_request - Starts Observation"); + // If the observe length is 0 means register for observation. + if(received_coap_header->options_list_ptr->observe != -1) { + number = received_coap_header->options_list_ptr->observe; + } + if(received_coap_header->token_ptr) { + tr_debug("M2MResourceInstance::handle_get_request - Sets Observation Token to resource"); + set_observation_token(received_coap_header->token_ptr, + received_coap_header->token_len); + } + // If the observe value is 0 means register for observation. + if(number == 0) { + tr_debug("M2MResourceInstance::handle_get_request - Put Resource under Observation"); + set_under_observation(true,observation_handler); + M2MBase::add_observation_level(M2MBase::R_Attribute); + coap_response->options_list_ptr->observe = observation_number(); + } + } else if (STOP_OBSERVATION == observe_option) { + tr_debug("M2MResourceInstance::handle_get_request - Stops Observation"); + set_under_observation(false,NULL); + M2MBase::remove_observation_level(M2MBase::R_Attribute); + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } + } + } + }else { + tr_error("M2MResourceInstance::handle_get_request - Return COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + // Operation is not allowed. + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + return coap_response; +} + +sn_coap_hdr_s* M2MResourceInstance::handle_put_request(nsdl_s *nsdl, + sn_coap_hdr_s *received_coap_header, + M2MObservationHandler *observation_handler, + bool &execute_value_updated) +{ + tr_debug("M2MResourceInstance::handle_put_request()"); + + + sn_coap_msg_code_e msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; // 2.04 + sn_coap_hdr_s *coap_response = sn_nsdl_build_response(nsdl, + received_coap_header, + msg_code); + // process the PUT if we have registered a callback for it + if(received_coap_header && coap_response) { + uint16_t coap_content_type = 0; + if(received_coap_header->content_format != COAP_CT_NONE) { + coap_content_type = received_coap_header->content_format; + } + if(received_coap_header->options_list_ptr && + received_coap_header->options_list_ptr->uri_query_ptr) { + char *query = (char*)alloc_string_copy(received_coap_header->options_list_ptr->uri_query_ptr, + received_coap_header->options_list_ptr->uri_query_len); + if (query){ + tr_debug("M2MResourceInstance::handle_put_request() - Query %s", query); + + // if anything was updated, re-initialize the stored notification attributes + if (!handle_observation_attribute(query)){ + tr_debug("M2MResourceInstance::handle_put_request() - Invalid query"); + msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; // 4.00 + } + free(query); + } + } else if ((operation() & SN_GRS_PUT_ALLOWED) != 0) { + tr_debug("M2MResourceInstance::handle_put_request() - Request Content-Type %d", coap_content_type); + + if(COAP_CONTENT_OMA_TLV_TYPE == coap_content_type) { + msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; + } else { + bool external_block_store = false; + if (block_message()) { + block_message()->set_message_info(received_coap_header); + if (block_message()->is_block_message()) { + external_block_store = true; + if(_incoming_block_message_cb) { + (*_incoming_block_message_cb)(_block_message_data); + } + if (block_message()->is_last_block()) { + block_message()->clear_values(); + coap_response->coap_status = COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED; + } else { + coap_response->coap_status = COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVING; + } + if (block_message()->error_code() != M2MBlockMessage::ErrorNone) { + block_message()->clear_values(); + } + } + } + if (!external_block_store) { + set_value(received_coap_header->payload_ptr, received_coap_header->payload_len); + } + if(received_coap_header->payload_ptr) { + tr_debug("M2MResourceInstance::handle_put_request() - Update Resource with new values"); + if(observation_handler) { + String value = ""; + if (received_coap_header->uri_path_ptr != NULL && + received_coap_header->uri_path_len > 0) { + value.append_raw((char*)received_coap_header->uri_path_ptr, received_coap_header->uri_path_len); + } + execute_value_updated = true; + } + } + } + } else { + // Operation is not allowed. + tr_error("M2MResourceInstance::handle_put_request() - COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED"); + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + } else { + msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + } + if(coap_response) { + coap_response->msg_code = msg_code; + } + + return coap_response; +} + +void M2MResourceInstance::set_resource_observer(M2MResourceCallback *resource) +{ + _resource_callback = resource; +} + +uint16_t M2MResourceInstance::object_instance_id() const +{ + return _object_instance_id; +} + +M2MBlockMessage* M2MResourceInstance::block_message() const +{ + return _block_message_data; +} + +void M2MResourceInstance::set_incoming_block_message_callback(incoming_block_message_callback callback) +{ + // copy the callback object. This will change on next version to be a direct pointer to a interface class, + // this FPn<> is just too heavy for this usage. + delete _incoming_block_message_cb; + _incoming_block_message_cb = new incoming_block_message_callback(callback); + + delete _block_message_data; + _block_message_data = NULL; + _block_message_data = new M2MBlockMessage(); +} + +void M2MResourceInstance::set_outgoing_block_message_callback(outgoing_block_message_callback callback) +{ + delete _outgoing_block_message_cb; + _outgoing_block_message_cb = new outgoing_block_message_callback(callback); +} + +void M2MResourceInstance::set_notification_sent_callback(notification_sent_callback callback) +{ + delete _notification_sent_callback; + _notification_sent_callback = new notification_sent_callback(callback); +} + +void M2MResourceInstance::set_notification_sent_callback(notification_sent_callback_2 callback) +{ + delete _notification_sent_function_pointer; + + _notification_sent_function_pointer = new FP0<void>(callback); + set_notification_sent_callback( + notification_sent_callback(_notification_sent_function_pointer, &FP0<void>::call)); +} + +void M2MResourceInstance::notification_sent() +{ + if (_notification_sent_callback) { + (*_notification_sent_callback)(); + } +} + +M2MResource& M2MResourceInstance::get_parent_resource() const +{ + return _parent_resource; +} + +const char* M2MResourceInstance::object_name() const +{ + const M2MObjectInstance& parent_object_instance = _parent_resource.get_parent_object_instance(); + const M2MObject& parent_object = parent_object_instance.get_parent_object(); + + return parent_object.name(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2msecurity.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2msecurity.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mstring.h" +#include "mbed-trace/mbed_trace.h" + +#include <stdlib.h> + +#define TRACE_GROUP "mClt" + +#define BUFFER_SIZE 21 + +M2MSecurity::M2MSecurity(ServerType ser_type) +: M2MObject(M2M_SECURITY_ID, stringdup(M2M_SECURITY_ID)), + _server_instance(NULL), + _server_type(ser_type) +{ + _server_instance = M2MObject::create_object_instance(); + + if(_server_instance) { + M2MResource* res = _server_instance->create_dynamic_resource(SECURITY_M2M_SERVER_URI, + OMA_RESOURCE_TYPE, + M2MResourceInstance::STRING, + false); + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SECURITY_BOOTSTRAP_SERVER, + OMA_RESOURCE_TYPE, + M2MResourceInstance::BOOLEAN, + false); + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SECURITY_SECURITY_MODE, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + false); + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SECURITY_PUBLIC_KEY, + OMA_RESOURCE_TYPE, + M2MResourceInstance::OPAQUE, + false); + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SECURITY_SERVER_PUBLIC_KEY, + OMA_RESOURCE_TYPE, + M2MResourceInstance::OPAQUE, + false); + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SECURITY_SECRET_KEY, + OMA_RESOURCE_TYPE, + M2MResourceInstance::OPAQUE, + false); + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + } + if(M2MSecurity::M2MServer == ser_type) { + res = _server_instance->create_dynamic_resource(SECURITY_SHORT_SERVER_ID, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + false); + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + } + } + } +} + +M2MSecurity::~M2MSecurity() +{ +} + +M2MResource* M2MSecurity::create_resource(SecurityResource resource, uint32_t value) +{ + M2MResource* res = NULL; + const char* security_id_ptr = ""; + if(!is_resource_present(resource)) { + switch(resource) { + case SMSSecurityMode: + security_id_ptr = SECURITY_SMS_SECURITY_MODE; + break; + case M2MServerSMSNumber: + security_id_ptr = SECURITY_M2M_SERVER_SMS_NUMBER; + break; + case ShortServerID: + security_id_ptr = SECURITY_SHORT_SERVER_ID; + break; + case ClientHoldOffTime: + security_id_ptr = SECURITY_CLIENT_HOLD_OFF_TIME; + break; + default: + break; + } + } + + const String security_id(security_id_ptr); + + if(!security_id.empty()) { + if(_server_instance) { + res = _server_instance->create_dynamic_resource(security_id,OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + false); + + if(res) { + res->set_operation(M2MBase::NOT_ALLOWED); + res->set_value(value); + } + } + } + return res; +} + +bool M2MSecurity::delete_resource(SecurityResource resource) +{ + bool success = false; + const char* security_id_ptr; + switch(resource) { + case SMSSecurityMode: + security_id_ptr = SECURITY_SMS_SECURITY_MODE; + break; + case M2MServerSMSNumber: + security_id_ptr = SECURITY_M2M_SERVER_SMS_NUMBER; + break; + case ShortServerID: + if(M2MSecurity::Bootstrap == _server_type) { + security_id_ptr = SECURITY_SHORT_SERVER_ID; + } + break; + case ClientHoldOffTime: + security_id_ptr = SECURITY_CLIENT_HOLD_OFF_TIME; + break; + default: + // Others are mandatory resources hence cannot be deleted. + security_id_ptr = NULL; + break; + } + + if(security_id_ptr) { + if(_server_instance) { + success = _server_instance->remove_resource(security_id_ptr); + } + } + return success; +} + +bool M2MSecurity::set_resource_value(SecurityResource resource, + const String &value) +{ + bool success = false; + if(M2MSecurity::M2MServerUri == resource) { + M2MResource* res = get_resource(resource); + if(res) { + success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length()); + } + } + return success; +} + +bool M2MSecurity::set_resource_value(SecurityResource resource, + uint32_t value) +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MSecurity::SecurityMode == resource || + M2MSecurity::SMSSecurityMode == resource || + M2MSecurity::M2MServerSMSNumber == resource || + M2MSecurity::ShortServerID == resource || + M2MSecurity::ClientHoldOffTime == resource) { + // If it is any of the above resource + // set the value of the resource. + uint8_t size = 0; + uint8_t *buffer = String::convert_integer_to_array(value, size); + success = res->set_value(buffer,size); + free(buffer); + } + } + return success; +} + +bool M2MSecurity::set_resource_value(SecurityResource resource, + const uint8_t *value, + const uint16_t length) +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MSecurity::PublicKey == resource || + M2MSecurity::ServerPublicKey == resource || + M2MSecurity::Secretkey == resource) { + success = res->set_value(value,length); + } + } + return success; +} + +String M2MSecurity::resource_value_string(SecurityResource resource) const +{ + String value = ""; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MSecurity::M2MServerUri == resource) { + value = res->get_value_string(); + } + } + return value; +} + +uint32_t M2MSecurity::resource_value_buffer(SecurityResource resource, + uint8_t *&data) const +{ + uint32_t size = 0; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MSecurity::PublicKey == resource || + M2MSecurity::ServerPublicKey == resource || + M2MSecurity::Secretkey == resource) { + res->get_value(data,size); + } + } + return size; +} + +uint32_t M2MSecurity::resource_value_buffer(SecurityResource resource, + const uint8_t *&data) const +{ + uint32_t size = 0; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MSecurity::PublicKey == resource || + M2MSecurity::ServerPublicKey == resource || + M2MSecurity::Secretkey == resource) { + data = res->value(); + size = res->value_length(); + } + } + return size; +} + + +uint32_t M2MSecurity::resource_value_int(SecurityResource resource) const +{ + uint32_t value = 0; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MSecurity::SecurityMode == resource || + M2MSecurity::SMSSecurityMode == resource || + M2MSecurity::M2MServerSMSNumber == resource || + M2MSecurity::ShortServerID == resource || + M2MSecurity::ClientHoldOffTime == resource) { + // Get the value and convert it into integer. This is not the most + // efficient way, as it takes pointless heap copy to get the zero termination. + uint8_t* buffer = NULL; + uint32_t length = 0; + res->get_value(buffer,length); + if(buffer) { + value = String::convert_array_to_integer(buffer,length); + free(buffer); + } + } + } + return value; +} + +bool M2MSecurity::is_resource_present(SecurityResource resource) const +{ + bool success = false; + M2MResource *res = get_resource(resource); + if(res) { + success = true; + } + return success; +} + +uint16_t M2MSecurity::total_resource_count() const +{ + uint16_t count = 0; + if(_server_instance) { + count = _server_instance->resources().size(); + } + return count; +} + +M2MSecurity::ServerType M2MSecurity::server_type() const +{ + return _server_type; +} + +M2MResource* M2MSecurity::get_resource(SecurityResource res) const +{ + M2MResource* res_object = NULL; + if(_server_instance) { + const char* res_name_ptr = NULL; + switch(res) { + case M2MServerUri: + res_name_ptr = SECURITY_M2M_SERVER_URI; + break; + case BootstrapServer: + res_name_ptr = SECURITY_BOOTSTRAP_SERVER; + break; + case SecurityMode: + res_name_ptr = SECURITY_SECURITY_MODE; + break; + case PublicKey: + res_name_ptr = SECURITY_PUBLIC_KEY; + break; + case ServerPublicKey: + res_name_ptr = SECURITY_SERVER_PUBLIC_KEY; + break; + case Secretkey: + res_name_ptr = SECURITY_SECRET_KEY; + break; + case SMSSecurityMode: + res_name_ptr = SECURITY_SMS_SECURITY_MODE; + break; + case SMSBindingKey: + res_name_ptr = SECURITY_SMS_BINDING_KEY; + break; + case SMSBindingSecretKey: + res_name_ptr = SECURITY_SMS_BINDING_SECRET_KEY; + break; + case M2MServerSMSNumber: + res_name_ptr = SECURITY_M2M_SERVER_SMS_NUMBER; + break; + case ShortServerID: + res_name_ptr = SECURITY_SHORT_SERVER_ID; + break; + case ClientHoldOffTime: + res_name_ptr = SECURITY_CLIENT_HOLD_OFF_TIME; + break; + } + + if (res_name_ptr) { + res_object = _server_instance->resource(res_name_ptr); + } + } + return res_object; +} + +void M2MSecurity::clear_resources() +{ + for(int i = 0; i <= M2MSecurity::ClientHoldOffTime; i++) { + M2MResource *res = get_resource((SecurityResource) i); + if (res) { + res->clear_value(); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mserver.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbed-client/m2mserver.h" +#include "mbed-client/m2mconstants.h" +#include "mbed-client/m2mobject.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mstring.h" + +#define TRACE_GROUP "mClt" + +#define BUFFER_SIZE 21 + +M2MServer::M2MServer() +: M2MObject(M2M_SERVER_ID, stringdup(M2M_SERVER_ID)) +{ + M2MObject::create_object_instance(); + + _server_instance = object_instance(); + + if(_server_instance) { + + M2MResource* res = _server_instance->create_dynamic_resource(SERVER_SHORT_SERVER_ID, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + true); + if(res) { + res->set_operation(M2MBase::GET_PUT_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SERVER_LIFETIME, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + true); + if(res) { + res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SERVER_NOTIFICATION_STORAGE, + OMA_RESOURCE_TYPE, + M2MResourceInstance::BOOLEAN, + true); + if(res) { + res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SERVER_BINDING, + OMA_RESOURCE_TYPE, + M2MResourceInstance::STRING, + true); + if(res) { + res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + } + res = _server_instance->create_dynamic_resource(SERVER_REGISTRATION_UPDATE, + OMA_RESOURCE_TYPE, + M2MResourceInstance::OPAQUE, + false); + if(res) { + res->set_operation(M2MBase::POST_ALLOWED); + } + } +} + +M2MServer::~M2MServer() +{ + +} + +M2MResource* M2MServer::create_resource(ServerResource resource, uint32_t value) +{ + M2MResource* res = NULL; + const char* server_id_ptr = ""; + if(!is_resource_present(resource)) { + switch(resource) { + case DefaultMinPeriod: + server_id_ptr = SERVER_DEFAULT_MIN_PERIOD; + break; + case DefaultMaxPeriod: + server_id_ptr = SERVER_DEFAULT_MAX_PERIOD; + break; + case DisableTimeout: + server_id_ptr = SERVER_DISABLE_TIMEOUT; + break; + default: + break; + } + } + String server_id(server_id_ptr); + + if(!server_id.empty()) { + if(_server_instance) { + res = _server_instance->create_dynamic_resource(server_id, + OMA_RESOURCE_TYPE, + M2MResourceInstance::INTEGER, + true); + if(res) { + res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + + res->set_value(value); + } + } + } + return res; +} + +M2MResource* M2MServer::create_resource(ServerResource resource) +{ + M2MResource* res = NULL; + if(!is_resource_present(resource)) { + if(M2MServer::Disable == resource) { + if(_server_instance) { + res = _server_instance->create_dynamic_resource(SERVER_DISABLE, + OMA_RESOURCE_TYPE, + M2MResourceInstance::OPAQUE, + false); + if(res) { + res->set_operation(M2MBase::POST_ALLOWED); + } + } + } + } + return res; +} + +bool M2MServer::delete_resource(ServerResource resource) +{ + bool success = false; + const char* server_id_ptr; + switch(resource) { + case DefaultMinPeriod: + server_id_ptr = SERVER_DEFAULT_MIN_PERIOD; + break; + case DefaultMaxPeriod: + server_id_ptr = SERVER_DEFAULT_MAX_PERIOD; + break; + case Disable: + server_id_ptr = SERVER_DISABLE; + break; + case DisableTimeout: + server_id_ptr = SERVER_DISABLE_TIMEOUT; + break; + default: + server_id_ptr = NULL; + break; + } + + if(server_id_ptr) { + if(_server_instance) { + success = _server_instance->remove_resource(server_id_ptr); + } + } + return success; +} + +bool M2MServer::set_resource_value(ServerResource resource, + const String &value) +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res && (M2MServer::Binding == resource)) { + success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length()); + } + return success; +} + +bool M2MServer::set_resource_value(ServerResource resource, + uint32_t value) +{ + bool success = false; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MServer::ShortServerID == resource || + M2MServer::Lifetime == resource || + M2MServer::DefaultMinPeriod == resource || + M2MServer::DefaultMaxPeriod == resource || + M2MServer::DisableTimeout == resource || + M2MServer::NotificationStorage == resource) { + // If it is any of the above resource + // set the value of the resource. + + success = res->set_value(value); + } + } + return success; +} + +String M2MServer::resource_value_string(ServerResource resource) const +{ + String value = ""; + M2MResource* res = get_resource(resource); + if(res && (M2MServer::Binding == resource)) { + + value = res->get_value_string(); + } + return value; +} + + +uint32_t M2MServer::resource_value_int(ServerResource resource) const +{ + uint32_t value = 0; + M2MResource* res = get_resource(resource); + if(res) { + if(M2MServer::ShortServerID == resource || + M2MServer::Lifetime == resource || + M2MServer::DefaultMinPeriod == resource || + M2MServer::DefaultMaxPeriod == resource || + M2MServer::DisableTimeout == resource || + M2MServer::NotificationStorage == resource) { + + value = res->get_value_int(); + } + } + return value; +} + +bool M2MServer::is_resource_present(ServerResource resource) const +{ + bool success = false; + M2MResource *res = get_resource(resource); + if(res) { + success = true; + } + return success; +} + +uint16_t M2MServer::total_resource_count() const +{ + uint16_t total_count = 0; + if(_server_instance) { + total_count = _server_instance->resources().size(); + } + return total_count; +} + +M2MResource* M2MServer::get_resource(ServerResource res) const +{ + M2MResource* res_object = NULL; + const char* res_name_ptr = NULL; + switch(res) { + case ShortServerID: + res_name_ptr = SERVER_SHORT_SERVER_ID; + break; + case Lifetime: + res_name_ptr = SERVER_LIFETIME; + break; + case DefaultMinPeriod: + res_name_ptr = SERVER_DEFAULT_MIN_PERIOD; + break; + case DefaultMaxPeriod: + res_name_ptr = SERVER_DEFAULT_MAX_PERIOD; + break; + case Disable: + res_name_ptr = SERVER_DISABLE; + break; + case DisableTimeout: + res_name_ptr = SERVER_DISABLE_TIMEOUT; + break; + case NotificationStorage: + res_name_ptr = SERVER_NOTIFICATION_STORAGE; + break; + case Binding: + res_name_ptr = SERVER_BINDING; + break; + case RegistrationUpdate: + res_name_ptr = SERVER_REGISTRATION_UPDATE; + break; + } + + if(res_name_ptr) { + if(_server_instance) { + res_object = _server_instance->resource(res_name_ptr); + } + } + return res_object; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mstring.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mstring.h" +#include <string.h> // strlen +#include <stdlib.h> // malloc, realloc +#include <assert.h> +#include <algorithm> // min + +namespace m2m { + +const String::size_type String::npos = static_cast<size_t>(-1); + +char* String::strdup(const char* s) +{ + const size_t len = strlen(s)+1; + char *p2 = static_cast<char*>(malloc(len)); + memcpy(p2, s, len); + allocated_ = len; + size_ = len-1; + return p2; +} + +String::String() + : p( strdup("") ) +{ +} + +String::~String() +{ + free(p); + p = 0; +} + +String::String(const String& s) + : p(0) +{ + if( &s != NULL ) { + p = static_cast<char*>(malloc(s.size_ + 1)); + + allocated_ = s.size_ + 1; + size_ = s.size_; + memcpy(p, s.p, size_ + 1); + } +} + +String::String(const char* s) + : p(strdup(s)) +{ +} + +String::String(const char* str, size_t n) +{ + p = static_cast<char*>(malloc(n + 1)); + + allocated_ = n + 1; + size_ = n; + memcpy(p, str, n); + p[n] = 0; +} + +String& String::operator=(const char* s) +{ + if ( p != s ) { + // s could point into our own string, so we have to allocate a new string + const size_t len = strlen(s); + char* copy = (char*) malloc( len + 1); + memmove(copy, s, len+1); // trailing 0 + free( p ); + p = copy; + size_ = len; + allocated_ = len+1; + } + return *this; +} + +String& String::operator=(const String& s) +{ + return operator=(s.p); +} + +String& String::operator+=(const String& s) +{ + if (s.size_ > 0) { + this->reserve(size_ + s.size_); + memmove(p+size_, s.p, s.size_+1); // trailing 0 + size_ += s.size_; + } + return *this; +} + +// since p and s may overlap, we have to copy our own string first +String& String::operator+=(const char* s) +{ + const size_type lens = strlen(s); + if (lens > 0) { + if (size_ + lens + 1 <= allocated_) { + memmove(p+size_, s, lens+1); // trailing 0 + size_ += lens; + } else { + String s2( *this ); // copy own data + s2.reserve(size_ + lens); + memmove(s2.p+size_, s, lens+1); // trailing 0 + s2.size_ = size_ + lens; + this->swap( s2 ); + } + } + return *this; +} + +String& String::operator+=(const char c) +{ + push_back(c); + return *this; +} + +void String::push_back(const char c) { + + if (size_ == allocated_ - 1) { + size_t more = (allocated_* 3) / 2; // factor 1.5 + if ( more < 4 ) more = 4; + reserve( size_ + more ); + } + + p[size_] = c; + size_++; + p[size_] = 0; +} + +bool String::operator==(const char* s) const +{ + if( s == NULL ) { + if( p == NULL ) { + return true; + } + return false; + } + bool ret = strcmp(p, s); + return !ret; +} + +bool String::operator==(const String& s) const +{ + bool ret = strcmp(p, s.p); + return !ret; +} + +void String::clear() +{ + size_ = 0; + p[0] = 0; +} + +String String::substr(const size_type pos, size_type length) const +{ + String s; + const size_type len = size_; + + if ( pos <= len ) { + + size_type remain = len - pos; + + if ( length > remain ) + length = remain; + + s.reserve( length ); + + memcpy(s.p, p + pos, length); + s.p[length] = '\0'; + s.size_ = length; + } + return s; +} + + +// checked access, accessing the NUL at end is allowed +char String::at(const size_type i) const +{ + if ( i <= strlen(p) ) { + return p[i]; + } else { + return '\0'; + } +} + +String& String::erase(size_type pos, size_type len) +{ + if (len > 0) { + + if ( pos < size_ ) { // user must not remove trailing 0 + + size_type s2 = size_; + size_type remain = s2 - pos - len; + + if (remain > 0) { + // erase by overwriting + memmove(p + pos, p + pos + len, remain); + } + + //if ( remain < 0 ) remain = 0; + + // remove unused space + this->resize( pos+remain ); + + } + } + return *this; +} + +String& String::append( const char* str, size_type n) { + if (str && n > 0) { + size_t lens = strlen(str); + if (n > lens) + n = lens; + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +String& String::append_raw( const char* str, size_type n) { + if (str && n > 0) { + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +void String::append_int(int param) { + + // max len of "-9223372036854775808" plus zero termination + char conv_buff[20+1]; + + int len = itoa_c(param, conv_buff); + append_raw(conv_buff, len); +} + +int String::compare( size_type pos, size_type len, const String& str ) const { + int r = -1; + if (pos <= size_) { + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = str.size(); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str.p, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::compare( size_type pos, size_type len, const char* str ) const { + int r = -1; + if (pos <= size_) { + + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = strlen(str); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::find_last_of(char c) const { + int r = -1; + char *v; + v = strrchr(p,c); + if (v != NULL) { + r = 0; + char* i = p; + while (v != i) { + i++; + r++; + } + } + return r; +} + +void String::new_realloc( size_type n) { + if (n > 0 ) { + char* pnew = static_cast<char*>(realloc(p, n)); // could return NULL + if (pnew) + p = pnew; + } +} + +void String::reserve( const size_type n) { + if (n >= allocated_ ) { + this->new_realloc(n + 1); + allocated_ = n + 1; + } +} + +void String::resize( const size_type n) { + this->resize( n, 0 ); +} + +void String::resize( const size_type n, const char c) { + if (n < size_ ) { + p[n] = 0; + size_ = n; + } + else if (n > size_ ) { + this->reserve( n ); + for (size_type i=size_; i < n; ++i ) + p[i] = c; + p[n] = 0; + size_ = n; + } +} + +void String::swap( String& s ) { + std::swap( allocated_, s.allocated_ ); + std::swap( size_, s.size_ ); + std::swap( p, s.p ); +} + + +// Comparison +bool operator<( const String& s1, const String& s2 ) { + return strcmp( s1.c_str(), s2.c_str() ) < 0; +} + +void reverse(char s[], uint32_t length) +{ + uint32_t i, j; + char c; + + for (i = 0, j = length-1; i<j; i++, j--) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } +} + +uint32_t itoa_c (int64_t n, char s[]) +{ + int64_t sign; + uint32_t i; + + if ((sign = n) < 0) + n = -n; + + i = 0; + + do { + s[i++] = n % 10 + '0'; + } + while ((n /= 10) > 0); + + if (sign < 0) + s[i++] = '-'; + + s[i] = '\0'; + + m2m::reverse(s, i); + return i; +} + +uint8_t* String::convert_integer_to_array(int64_t value, uint8_t &size, uint8_t *array, uint32_t array_size) +{ + uint8_t* buffer = NULL; + size = 0; + if (array) { + value = String::convert_array_to_integer(array, array_size); + } + + if(value < 0xFF) { + size = 1; + } else if(value < 0xFFFF) { + size = 2; + } else if(value < 0xFFFFFF) { + size = 3; + } else if(value < 0xFFFFFFFF) { + size = 4; + } else if(value < 0xFFFFFFFFFF) { + size = 5; + } else if(value < 0xFFFFFFFFFFFF) { + size = 6; + } else if(value < 0xFFFFFFFFFFFFFF) { + size = 7; + } else { + size = 8; + } + + buffer = (uint8_t*)malloc(size); + if (buffer) { + for (int i = 0; i < size; i++) { + buffer[i] = (value >> ((size - i - 1) * 8)); + } + } else { + size = 0; + } + return buffer; +} + +int64_t String::convert_array_to_integer(uint8_t *value, uint32_t size) +{ + int64_t temp_64 = 0; + for (int i = size - 1; i >= 0; i--) { + temp_64 += (uint64_t)(*value++) << i * 8; + } + return temp_64; +} + +} // namespace
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mstringbufferbase.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbed-client/m2mstringbufferbase.h" + +#include "mbed-client/m2mstring.h" + +#include <assert.h> +#include <string.h> + + +bool StringBufferBase::ensure_space(size_t max_size, size_t required_size) const +{ + const size_t space_left = max_size - _curr_size; + + bool space_available = false; + + if (required_size <= space_left) { + + space_available = true; + } + return space_available; +} + +bool StringBufferBase::append(char *buff, size_t max_size, char data) +{ + bool space_available = ensure_space(max_size, 1 + 1); // there must be space for trailing zero too + if (space_available) { + buff[_curr_size++] = data; + buff[_curr_size] = '\0'; + assert(_curr_size < max_size); + } + return space_available; +} + +bool StringBufferBase::append(char *buff, size_t max_size, const char *data) +{ + + const size_t string_len = strlen(data); + bool space_available = ensure_space(max_size, string_len + 1); + if (space_available) { + memcpy(buff + _curr_size, data, string_len + 1); // copy the zero terminator too + _curr_size += string_len; + assert(_curr_size < max_size); + } + return space_available; +} + +bool StringBufferBase::append(char *buff, size_t max_size, const char *data, size_t data_len) +{ + bool space_available = true; + if (data_len > 0) { + space_available = ensure_space(max_size, data_len + 1); + if (space_available) { + memcpy(buff + _curr_size, data, data_len); + _curr_size += data_len; + // Todo: should the code actually check, if the data already contained zero or not? + buff[_curr_size] = '\0'; + assert(_curr_size < max_size); + } + } + return space_available; +} + +bool StringBufferBase::append_int(char *buff, size_t max_size, uint16_t data) +{ + // max len of "-9223372036854775808" plus zero termination + char conv_buff[20+1]; + + // re-use the String's functionality, a more optimal version would use snprintf() or int size specific converter + int len = m2m::itoa_c(data, conv_buff); + + return append(buff, max_size, conv_buff, len); +} + +int StringBufferBase::find_last_of(const char *buff, char search_char) const +{ + int last_index = -1; + // search from the end of string, return upon first found matching char + for (int index = _curr_size; index >= 0; index--) { + if (buff[index] == search_char) { + last_index = index; + break; + } + } + + return last_index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mtlvdeserializer.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "include/m2mtlvdeserializer.h" +#include "mbed-client/m2mconstants.h" +#include "include/nsdllinker.h" +#include "mbed-trace/mbed_trace.h" + +#define TRACE_GROUP "mClt" +#define BUFFER_SIZE 10 + +M2MTLVDeserializer::M2MTLVDeserializer() +{ +} + +M2MTLVDeserializer::~M2MTLVDeserializer() +{ +} + +bool M2MTLVDeserializer::is_object_instance(uint8_t *tlv) +{ + return is_object_instance(tlv, 0); +} + +bool M2MTLVDeserializer::is_resource(uint8_t *tlv) +{ + return is_resource(tlv, 0); +} + +bool M2MTLVDeserializer::is_multiple_resource(uint8_t *tlv) +{ + return is_multiple_resource(tlv, 0); +} + +bool M2MTLVDeserializer::is_resource_instance(uint8_t *tlv) +{ + return is_resource_instance(tlv, 0); +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialise_object_instances(uint8_t* tlv, + uint32_t tlv_size, + M2MObject &object, + M2MTLVDeserializer::Operation operation) +{ + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + if (is_object_instance(tlv) ) { + tr_debug("M2MTLVDeserializer::deserialise_object_instances"); + error = deserialize_object_instances(tlv, tlv_size, 0, object,operation,false); + if(M2MTLVDeserializer::None == error) { + error = deserialize_object_instances(tlv, tlv_size, 0, object,operation,true); + } + } else { + tr_debug("M2MTLVDeserializer::deserialise_object_instances ::NotValid"); + error = M2MTLVDeserializer::NotValid; + } + return error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resources(uint8_t *tlv, + uint32_t tlv_size, + M2MObjectInstance &object_instance, + M2MTLVDeserializer::Operation operation) +{ + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + if (!is_resource(tlv) && !is_multiple_resource(tlv)) { + error = M2MTLVDeserializer::NotValid; + } else { + error = deserialize_resources(tlv, tlv_size, 0, object_instance, operation,false); + if(M2MTLVDeserializer::None == error) { + error = deserialize_resources(tlv, tlv_size, 0, object_instance, operation,true); + } + } + return error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(uint8_t *tlv, + uint32_t tlv_size, + M2MResource &resource, + M2MTLVDeserializer::Operation operation) +{ + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + if (!is_multiple_resource(tlv)) { + error = M2MTLVDeserializer::NotValid; + } else { + tr_debug("M2MTLVDeserializer::deserialize_resource_instances()"); + uint8_t offset = 2; + + ((tlv[0] & 0x20) == 0) ? offset : offset++; + + uint8_t length = tlv[0] & 0x18; + if(length == 0x08) { + offset+= 1; + } else if(length == 0x10) { + offset+= 2; + } else if(length == 0x18) { + offset+= 3; + } + + tr_debug("M2MTLVDeserializer::deserialize_resource_instances() Offset %d", offset); + error = deserialize_resource_instances(tlv, tlv_size, offset, resource, operation,false); + if(M2MTLVDeserializer::None == error) { + error = deserialize_resource_instances(tlv, tlv_size, offset, resource, operation,true); + } + } + return error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_object_instances(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MObject &object, + M2MTLVDeserializer::Operation operation, + bool update_value) +{ + tr_debug("M2MTLVDeserializer::deserialize_object_instances()"); + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize(); + offset = til->_offset; + + M2MObjectInstanceList list = object.instances(); + M2MObjectInstanceList::const_iterator it; + it = list.begin(); + + if (TYPE_OBJECT_INSTANCE == til->_type) { + for (; it!=list.end(); it++) { + if((*it)->instance_id() == til->_id) { + error = deserialize_resources(tlv, tlv_size, offset, (**it),operation, update_value); + } + } + offset += til->_length; + + if(offset < tlv_size) { + error = deserialize_object_instances(tlv, tlv_size, offset, object, operation, update_value); + } + } + delete til; + return error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resources(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MObjectInstance &object_instance, + M2MTLVDeserializer::Operation operation, + bool update_value) +{ + tr_debug("M2MTLVDeserializer::deserialize_resources()"); + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize(); + offset = til->_offset; + + M2MResourceList list = object_instance.resources(); + M2MResourceList::const_iterator it; + it = list.begin(); + + if (TYPE_RESOURCE == til->_type || TYPE_RESOURCE_INSTANCE == til->_type) { + bool found = false; + for (; it!=list.end(); it++) { + if((*it)->name_id() == til->_id){ + tr_debug("M2MTLVDeserializer::deserialize_resources() - Resource ID %d ", til->_id); + found = true; + if(update_value) { + if(til->_length > 0) { + tr_debug("M2MTLVDeserializer::deserialize_resources() - Update value"); + (*it)->set_value(tlv+offset, til->_length); + } else { + tr_debug("M2MTLVDeserializer::deserialize_resources() - Clear Value"); + (*it)->clear_value(); + } + break; + } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) { + tr_debug("M2MTLVDeserializer::deserialize_resources() - NOT_ALLOWED"); + error = M2MTLVDeserializer::NotAllowed; + break; + } + } + } + if(!found) { + if(M2MTLVDeserializer::Post == operation) { + //Create a new Resource + String id; + id.append_int(til->_id); + M2MResource *resource = object_instance.create_dynamic_resource(id,"",M2MResourceInstance::INTEGER,true,false); + if(resource) { + resource->set_operation(M2MBase::GET_PUT_POST_DELETE_ALLOWED); + } + } else if(M2MTLVDeserializer::Put == operation) { + error = M2MTLVDeserializer::NotFound; + } + } + } else if (TYPE_MULTIPLE_RESOURCE == til->_type) { + for (; it!=list.end(); it++) { + if((*it)->supports_multiple_instances()) { + error = deserialize_resource_instances(tlv, tlv_size-offset, offset, (**it), object_instance, operation, update_value); + } + } + + } else { + delete til; + error = M2MTLVDeserializer::NotValid; + return error; + } + offset += til->_length; + + delete til; + if(offset < tlv_size) { + error = deserialize_resources(tlv, tlv_size, offset, object_instance, operation, update_value); + } + return error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MResource &resource, + M2MObjectInstance &object_instance, + M2MTLVDeserializer::Operation operation, + bool update_value) +{ + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize(); + offset = til->_offset; + + if (TYPE_MULTIPLE_RESOURCE == til->_type || TYPE_RESOURCE_INSTANCE == til->_type) { + M2MResourceInstanceList list = resource.resource_instances(); + M2MResourceInstanceList::const_iterator it; + it = list.begin(); + bool found = false; + for (; it!=list.end(); it++) { + if((*it)->instance_id() == til->_id) { + found = true; + if(update_value) { + if(til->_length > 0) { + (*it)->set_value(tlv+offset, til->_length); + } else { + (*it)->clear_value(); + } + break; + } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) { + error = M2MTLVDeserializer::NotAllowed; + break; + } + } + } + if(!found) { + if(M2MTLVDeserializer::Post == operation) { + // Create a new Resource Instance + M2MResourceInstance *res_instance = object_instance.create_dynamic_resource_instance(resource.name(),"", + M2MResourceInstance::INTEGER, + true, + til->_id); + if(res_instance) { + res_instance->set_operation(M2MBase::GET_PUT_POST_DELETE_ALLOWED); + } + } else if(M2MTLVDeserializer::Put == operation) { + error = M2MTLVDeserializer::NotFound; + } + } + } else { + delete til; + error = M2MTLVDeserializer::NotValid; + return error; + } + + offset += til->_length; + + delete til; + if(offset < tlv_size) { + error = deserialize_resource_instances(tlv, tlv_size-offset, offset, resource, object_instance, operation, update_value); + } + return error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(uint8_t *tlv, + uint32_t tlv_size, + uint32_t offset, + M2MResource &resource, + M2MTLVDeserializer::Operation operation, + bool update_value) +{ + M2MTLVDeserializer::Error error = M2MTLVDeserializer::None; + TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, offset)->deserialize(); + offset = til->_offset; + + if (TYPE_RESOURCE_INSTANCE == til->_type) { + M2MResourceInstanceList list = resource.resource_instances(); + M2MResourceInstanceList::const_iterator it; + it = list.begin(); + bool found = false; + for (; it!=list.end(); it++) { + if((*it)->instance_id() == til->_id) { + found = true; + if(update_value) { + if(til->_length > 0) { + (*it)->set_value(tlv+offset, til->_length); + } else { + (*it)->clear_value(); + } + break; + } else if(0 == ((*it)->operation() & SN_GRS_PUT_ALLOWED)) { + error = M2MTLVDeserializer::NotAllowed; + break; + } + } + } + if(!found) { + if(M2MTLVDeserializer::Post == operation) { + error = M2MTLVDeserializer::NotAllowed; + } else if(M2MTLVDeserializer::Put == operation) { + error = M2MTLVDeserializer::NotFound; + } + } + } else { + delete til; + error = M2MTLVDeserializer::NotValid; + return error; + } + + offset += til->_length; + + delete til; + if(offset < tlv_size) { + error = deserialize_resource_instances(tlv, tlv_size-offset, offset, resource, operation, update_value); + } + return error; +} + +bool M2MTLVDeserializer::is_object_instance(uint8_t *tlv, uint32_t offset) +{ + bool ret = false; + if (tlv) { + uint8_t value = tlv[offset]; + ret = (TYPE_OBJECT_INSTANCE == (value & TYPE_RESOURCE)); + } + return ret; +} + +uint16_t M2MTLVDeserializer::instance_id(uint8_t *tlv) +{ + TypeIdLength *til = TypeIdLength::createTypeIdLength(tlv, 0)->deserialize(); + uint16_t id = til->_id; + delete til; + return id; +} + +bool M2MTLVDeserializer::is_resource(uint8_t *tlv, uint32_t offset) +{ + bool ret = false; + if (tlv) { + ret = (TYPE_RESOURCE == (tlv[offset] & TYPE_RESOURCE)); + } + return ret; +} + +bool M2MTLVDeserializer::is_multiple_resource(uint8_t *tlv, uint32_t offset) +{ + bool ret = false; + if (tlv) { + ret = (TYPE_MULTIPLE_RESOURCE == (tlv[offset] & TYPE_RESOURCE)); + } + return ret; +} + +bool M2MTLVDeserializer::is_resource_instance(uint8_t *tlv, uint32_t offset) +{ + bool ret = false; + if (tlv) { + ret = (TYPE_RESOURCE_INSTANCE == (tlv[offset] & TYPE_RESOURCE)); + } + return ret; +} + +TypeIdLength* TypeIdLength::createTypeIdLength(uint8_t *tlv, uint32_t offset) +{ + TypeIdLength *til = new TypeIdLength(); + til->_tlv = tlv; + til->_offset = offset; + til->_type = tlv[offset] & 0xC0; + til->_id = 0; + til->_length = 0; + return til; +} + +TypeIdLength* TypeIdLength::deserialize() +{ + uint32_t idLength = _tlv[_offset] & ID16; + uint32_t lengthType = _tlv[_offset] & LENGTH24; + if (0 == lengthType) { + _length = _tlv[_offset] & 0x07; + } + _offset++; + + deserialiseID(idLength); + deserialiseLength(lengthType); + + return this; +} + +void TypeIdLength::deserialiseID(uint32_t idLength) +{ + _id = _tlv[_offset++] & 0xFF; + if (ID16 == idLength) { + _id = (_id << 8) + (_tlv[_offset++] & 0xFF); + } +} + +void TypeIdLength::deserialiseLength(uint32_t lengthType) +{ + if (lengthType > 0) { + _length = _tlv[_offset++] & 0xFF; + } + if (lengthType > LENGTH8) { + _length = (_length << 8) + (_tlv[_offset++] & 0xFF); + } + if (lengthType > LENGTH16) { + _length = (_length << 8) + (_tlv[_offset++] & 0xFF); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/m2mtlvserializer.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "include/m2mtlvserializer.h" +#include "include/nsdllinker.h" +#include "mbed-client/m2mconstants.h" + +#include <stdlib.h> + +#define TRACE_GROUP "mClt" + +M2MTLVSerializer::M2MTLVSerializer() +{ +} + +M2MTLVSerializer::~M2MTLVSerializer() +{ +} + +uint8_t* M2MTLVSerializer::serialize(M2MObjectInstanceList object_instance_list, uint32_t &size) +{ + return serialize_object_instances(object_instance_list, size); +} + +uint8_t* M2MTLVSerializer::serialize(M2MResourceList resource_list, uint32_t &size) +{ + bool valid = true; + return serialize_resources(resource_list, size,valid); +} + +uint8_t* M2MTLVSerializer::serialize(M2MResource *resource, uint32_t &size) +{ + uint8_t* data = NULL; + serialize(resource, data, size); + return data; +} + +uint8_t* M2MTLVSerializer::serialize_object_instances(M2MObjectInstanceList object_instance_list, uint32_t &size) +{ + uint8_t *data = NULL; + + if(!object_instance_list.empty()) { + M2MObjectInstanceList::const_iterator it; + it = object_instance_list.begin(); + for (; it!=object_instance_list.end(); it++) { + uint16_t id = (*it)->instance_id(); + serialize(id, *it, data, size); + } + } + return data; +} + +uint8_t* M2MTLVSerializer::serialize_resources(M2MResourceList resource_list, uint32_t &size, bool &valid) +{ + uint8_t *data = NULL; + + if(!resource_list.empty()) { + M2MResourceList::const_iterator it; + it = resource_list.begin(); + for (; it!=resource_list.end(); it++) { + if((*it)->name_id() == -1) { + valid = false; + break; + } + } + if(valid) { + it = resource_list.begin(); + for (; it!=resource_list.end(); it++) { + serialize(*it, data, size); + } + } + } + return data; +} + +void M2MTLVSerializer::serialize(uint16_t id, M2MObjectInstance *object_instance, uint8_t *&data, uint32_t &size) +{ + uint8_t *resource_data = NULL; + uint32_t resource_size = 0; + + bool valid = true; + resource_data = serialize_resources(object_instance->resources(),resource_size,valid); + if(valid) { + serialize_TILV(TYPE_OBJECT_INSTANCE, id, resource_data, resource_size, data, size); + } + free(resource_data); +} + +bool M2MTLVSerializer::serialize(M2MResource *resource, uint8_t *&data, uint32_t &size) +{ + bool success = false; + if(resource->name_id() != -1) { + success = resource->supports_multiple_instances() ? + serialize_multiple_resource(resource, data, size) : + serialize_resource(resource, data, size); + } + return success; +} + +bool M2MTLVSerializer::serialize_resource(M2MResource *resource, uint8_t *&data, uint32_t &size) +{ + bool success = false; + if(resource->name_id() != -1) { + success = true; + serialize_TILV(TYPE_RESOURCE, resource->name_id(), resource->value(), resource->value_length(), data, size); + } + return success; +} + +bool M2MTLVSerializer::serialize_multiple_resource(M2MResource *resource, uint8_t *&data, uint32_t &size) +{ + bool success = false; + uint8_t *nested_data = NULL; + uint32_t nested_data_size = 0; + + M2MResourceInstanceList instance_list = resource->resource_instances(); + if(!instance_list.empty()) { + M2MResourceInstanceList::const_iterator it; + it = instance_list.begin(); + for (; it!=instance_list.end(); it++) { + uint16_t id = (*it)->instance_id(); + serialize_resource_instance(id, (*it), nested_data, nested_data_size); + } + } + if(resource->name_id() != -1) { + success = true; + serialize_TILV(TYPE_MULTIPLE_RESOURCE, resource->name_id(), nested_data, nested_data_size, data, size); + } + + free(nested_data); + nested_data = NULL; + return success; +} + +void M2MTLVSerializer::serialize_resource_instance(uint16_t id, M2MResourceInstance *resource, uint8_t *&data, uint32_t &size) +{ + serialize_TILV(TYPE_RESOURCE_INSTANCE, id, resource->value(), resource->value_length(), data, size); +} + +void M2MTLVSerializer::serialize_TILV(uint8_t type, uint16_t id, uint8_t *value, uint32_t value_length, uint8_t *&data, uint32_t &size) +{ + uint8_t *tlv = 0; + uint32_t type_length = 1; + type += id < 256 ? 0 : ID16; + type += value_length < 8 ? value_length : + value_length < 256 ? LENGTH8 : + value_length < 65536 ? LENGTH16 : LENGTH24; + uint8_t *tlv_type = (uint8_t*)malloc(type_length+1); + memset(tlv_type,0,type_length+1); + *tlv_type = type & 0xFF; + + uint32_t id_size = 0; + uint8_t* id_ptr = serialize_id(id, id_size); + + uint32_t length_size = 0; + uint8_t* length_ptr = serialize_length(value_length, length_size); + + tlv = (uint8_t*)malloc(size + type_length + id_size + length_size + value_length+1); + memset(tlv,0,size + type_length + id_size + length_size + value_length+1); + if(data) { + memcpy(tlv, data, size); + } + memcpy(tlv+size, tlv_type, type_length); + memcpy(tlv+size+type_length, id_ptr, id_size); + memcpy(tlv+size+type_length+id_size, length_ptr, length_size); + memcpy(tlv+size+type_length+id_size+length_size, value, value_length); + + free(tlv_type) ; + free(length_ptr); + free(id_ptr); + free(data); + + data = tlv; + size += type_length + id_size + length_size + value_length; +} + +uint8_t* M2MTLVSerializer::serialize_id(uint16_t id, uint32_t &size) +{ + uint32_t id_size = id > 255 ? 2 : 1; + uint8_t *id_ptr = (uint8_t*)malloc(id_size); + memset(id_ptr, 0 , id_size); + size += id_size; + if(id > 255) { + *id_ptr = (id & 0xFF00) >> 8; + id_ptr++; + *id_ptr = id & 0xFF; + id_ptr--; + } else { + *id_ptr = id & 0xFF; + } + return id_ptr; +} + +uint8_t* M2MTLVSerializer::serialize_length(uint32_t length, uint32_t &size) +{ + uint8_t *length_ptr = 0; + uint32_t length_size = 0; + if (length > 65535) { + length_size = 3; + length_ptr = (uint8_t*)malloc(length_size+1); + memset(length_ptr,0,length_size+1); + *length_ptr = (length & 0xFF0000) >> 16; + length_ptr++; + *length_ptr = (length & 0xFF00) >> 8; + length_ptr++; + *length_ptr = length & 0xFF; + length_ptr--; + length_ptr--; + } else if (length > 255) { + length_size = 2; + length_ptr = (uint8_t*)malloc(length_size+1); + memset(length_ptr,0,length_size+1); + *length_ptr = (length & 0xFF00) >> 8; + length_ptr++; + *length_ptr = length & 0xFF; + length_ptr--; + } else if (length > 7) { + length_size = 1; + length_ptr = (uint8_t*)malloc(length_size+1); + memset(length_ptr,0,length_size+1); + *length_ptr = length & 0xFF; + } + size += length_size; + return length_ptr; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/source/nsdlaccesshelper.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "include/nsdlaccesshelper.h" +#include "include/m2mnsdlinterface.h" + +#include <stdlib.h> + +M2MNsdlInterfaceList __nsdl_interface_list; + +// callback function for NSDL library to call into + +M2MConnectionHandler *__connection_handler = NULL; + + +uint8_t __nsdl_c_callback(struct nsdl_s *nsdl_handle, + sn_coap_hdr_s *received_coap_ptr, + sn_nsdl_addr_s *address, + sn_nsdl_capab_e nsdl_capab) +{ + uint8_t status = 0; + M2MNsdlInterface *interface = get_interface(nsdl_handle); + if(interface) { + status = interface->resource_callback(nsdl_handle,received_coap_ptr, + address, nsdl_capab); + // Payload freeing must be done in app level if blockwise message + if (received_coap_ptr->coap_status == COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED) { + free(received_coap_ptr->payload_ptr); + received_coap_ptr->payload_ptr = NULL; + } + } + return status; +} + +void* __nsdl_c_memory_alloc(uint16_t size) +{ + if(size) + return malloc(size); + else + return 0; +} + +void __nsdl_c_memory_free(void *ptr) +{ + if(ptr) + free(ptr); +} + +uint8_t __nsdl_c_send_to_server(struct nsdl_s * nsdl_handle, + sn_nsdl_capab_e protocol, + uint8_t *data_ptr, + uint16_t data_len, + sn_nsdl_addr_s *address_ptr) +{ + uint8_t status = 0; + M2MNsdlInterface *interface = get_interface(nsdl_handle); + if(interface) { + status = interface->send_to_server_callback(nsdl_handle, + protocol, data_ptr, + data_len, address_ptr); + } + return status; +} + +uint8_t __nsdl_c_received_from_server(struct nsdl_s * nsdl_handle, + sn_coap_hdr_s *coap_header, + sn_nsdl_addr_s *address_ptr) +{ + uint8_t status = 0; + M2MNsdlInterface *interface = get_interface(nsdl_handle); + if(interface) { + status = interface->received_from_server_callback(nsdl_handle, + coap_header, + address_ptr); + // Payload freeing must be done in app level if blockwise message + if (coap_header && + coap_header->options_list_ptr && + coap_header->options_list_ptr->block1 != -1) { + free(coap_header->payload_ptr); + coap_header->payload_ptr = NULL; + } + } + return status; +} + +void* __socket_malloc( void * context, size_t size) +{ + (void) context; + return malloc(size); +} + +void __socket_free(void * context, void * ptr) +{ + (void) context; + free(ptr); +} + +M2MNsdlInterface* get_interface(struct nsdl_s* nsdl_handle) +{ + M2MNsdlInterfaceList::const_iterator it; + it = __nsdl_interface_list.begin(); + M2MNsdlInterface* obj = NULL; + if (nsdl_handle) { + for (; it!=__nsdl_interface_list.end(); it++) { + if ((*it)->get_nsdl_handle() == nsdl_handle) { + obj = *it; + break; + } + } + } + return obj; +} + +void __mutex_claim() +{ + if(__connection_handler) { + __connection_handler->claim_mutex(); + } +} + +void __mutex_release() +{ + if(__connection_handler) { + __connection_handler->release_mutex(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/sources.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,23 @@ +SRCS += \ + source/m2mbase.cpp \ + source/m2mdevice.cpp \ + source/m2mfirmware.cpp \ + source/m2minterfacefactory.cpp \ + source/m2minterfaceimpl.cpp \ + source/m2mnsdlinterface.cpp \ + source/m2mobject.cpp \ + source/m2mobjectinstance.cpp \ + source/m2mreporthandler.cpp \ + source/m2mresource.cpp \ + source/m2mresourceinstance.cpp \ + source/m2msecurity.cpp \ + source/m2mserver.cpp \ + source/m2mstring.cpp \ + source/m2mtlvdeserializer.cpp \ + source/m2mtlvserializer.cpp \ + source/nsdlaccesshelper.cpp \ + source/m2mfirmware.cpp \ + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,108 @@ +if(TARGET_LIKE_X86_LINUX_NATIVE_COVERAGE) +SET(CMAKE_CXX_FLAGS "") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage -Wall -Wextra -include /usr/include/CppUTest/MemoryLeakDetectorMallocMacros.h -include /usr/include/CppUTest/MemoryLeakDetectorNewMacros.h -D__thumb2__ -DMBED_CLIENT_C_NEW_API -w") +include_directories($ENV{CPPUTEST_HOME}/include) +link_directories($ENV{CPPUTEST_HOME}/lib) +MACRO(SUBDIRLIST result curdir) + FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) + SET(dirlist "") + FOREACH(child ${children}) + IF(IS_DIRECTORY ${curdir}/${child}) + if(EXISTS "${curdir}/${child}/CMakeLists.txt") + LIST(APPEND dirlist ${curdir}/${child}) + endif() + ENDIF() + ENDFOREACH() + SET(${result} ${dirlist}) +ENDMACRO() + +SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}/mbedclient/utest) + +FOREACH(subdir ${SUBDIRS}) + ADD_SUBDIRECTORY(${subdir}) +ENDFOREACH() + +endif() + +if(TARGET_LIKE_LINUX AND NOT TARGET_LIKE_X86_LINUX_NATIVE_COVERAGE) +add_executable(mbed-client-test-mbedclient_linux + "mbedclient_linux/main.cpp" +) +target_link_libraries(mbed-client-test-mbedclient_linux + mbed-client-c + mbed-client-linux + mbed-client +) +#add_test(mbed-client-test-mbedclient_linux mbed-client-test-mbedclient_linux) +add_dependencies(all_tests mbed-client-test-mbedclient_linux) + +add_executable(mbed-client-test-helloworld-mbedclient + "helloworld-mbedclient/main.cpp" + "helloworld-mbedclient/mbedclient.cpp" + "helloworld-mbedclient/to_be_ported.c" +) +target_link_libraries(mbed-client-test-helloworld-mbedclient + mbed-client-c + mbed-client-linux + mbed-client +) +#add_test(mbed-client-test-helloworld-mbedclient mbed-client-test-helloworld-mbedclient) +add_dependencies(all_tests mbed-client-test-helloworld-mbedclient) + +endif() + +if(TARGET_LIKE_MBED) + +add_executable(mbed-client-test-mbedclient-smokeTest EXCLUDE_FROM_ALL + "mbedclient-smokeTest/main.cpp" + "mbedclient-smokeTest/testconfig.cpp" + "mbedclient-smokeTest/testconfig.h" +) +target_link_libraries(mbed-client-test-mbedclient-smokeTest + mbed-client-c + mbed-client-mbed-os + mbed-client +) + +#add_test(mbed-client-test-mbedclient-smokeTest mbed-client-test-mbedclient-smokeTest) +add_dependencies(all_tests mbed-client-test-mbedclient-smokeTest) + +# if the target has defined a post-processing step, perform it: +if(YOTTA_POSTPROCESS_COMMAND) + string(REPLACE YOTTA_CURRENT_EXE_NAME "mbed-client-test-mbedclient-smokeTest" LOCAL_POSTPROCESS_COMMAND "${YOTTA_POSTPROCESS_COMMAND}") + separate_arguments(LOCAL_POSTPROCESS_COMMAND_SEPARATED UNIX_COMMAND ${LOCAL_POSTPROCESS_COMMAND}) + add_custom_command( + TARGET mbed-client-test-mbedclient-smokeTest + POST_BUILD + COMMAND ${LOCAL_POSTPROCESS_COMMAND_SEPARATED} + ) +endif() + +add_executable(mbed-client-test-helloworld-mbedclient EXCLUDE_FROM_ALL + "helloworld-mbedclient/main.cpp" + "helloworld-mbedclient/mbedclient.cpp" + "helloworld-mbedclient/to_be_ported.c" +) +target_link_libraries(mbed-client-test-helloworld-mbedclient + mbed-client-c + mbed-client-mbed-os + mbed-client +) +# if the target has defined a post-processing step, perform it: +if(YOTTA_POSTPROCESS_COMMAND) + string(REPLACE YOTTA_CURRENT_EXE_NAME "mbed-client-test-helloworld-mbedclient" LOCAL_POSTPROCESS_COMMAND "${YOTTA_POSTPROCESS_COMMAND}") + separate_arguments(LOCAL_POSTPROCESS_COMMAND_SEPARATED UNIX_COMMAND ${LOCAL_POSTPROCESS_COMMAND}) + add_custom_command( + TARGET mbed-client-test-helloworld-mbedclient + POST_BUILD + COMMAND ${LOCAL_POSTPROCESS_COMMAND_SEPARATED} + ) +endif() + +#add_test(mbed-client-test-helloworld-mbedclient mbed-client-test-helloworld-mbedclient) +add_dependencies(all_tests mbed-client-test-helloworld-mbedclient) + +endif() + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/helloworld-mbedclient/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,23 @@ +PLATFORM= +OS = LINUX +TARGET = helloworld_mbedclient +OBJECTS = main.o mbedclient.o +CFLAGS = -std=c++11 -Wall -D_REENTRANT -D$(OS) -I ../../lwm2m-client \ + -I ../../source/include -I ../../../../libService/libService \ + -I ../../ -I ../../../ -DTARGET_LIKE_LINUX -DHAVE_DEBUG + +LDFLAGS = -D_REENTRANT -L../../ -lmbedclient_gcc -L ../../../../nsdl-c -lnsdl_gcc \ + -L ../../../../libService -lservice_gcc -lpthread\ + -L../../../../mbedtls/library -lmbedtls -lmbedcrypto -lmbedx509 + +all: $(TARGET) + +$(TARGET): $(OBJECTS) + $(PLATFORM)g++ -g -o $(TARGET) $(OBJECTS) $(LDFLAGS) + +.cpp.o: + $(PLATFORM)g++ -c -g -O2 $(CFLAGS) $< + +clean: + rm -f $(TARGET) $(OBJECTS) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/helloworld-mbedclient/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,446 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbedclient.h" + +#ifdef TARGET_LIKE_LINUX +#include <unistd.h> +#include <stdio.h> +#include <stdarg.h> +#include <pthread.h> +#include <signal.h> /* For SIGIGN and SIGINT */ +#include <time.h> +#else +#include "sockets/UDPSocket.h" +#ifdef SIXLOWPAN_INTERFACE +#include "atmel-rf-driver/driverRFPhy.h" // rf_device_register +#include "mbed-mesh-api/Mesh6LoWPAN_ND.h" +#endif +#include "EthernetInterface.h" +#include "test_env.h" +// TODO: Remove when yotta supports init. +#include "lwipv4_init.h" +using namespace mbed::util; +#endif + +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2minterfaceobserver.h" +#include "mbed-client/m2minterface.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +#include "mbed-trace/mbed_trace.h" + +#ifdef TARGET_LIKE_LINUX +static void ctrl_c_handle_function(void); +typedef void (*signalhandler_t)(int); /* Function pointer type for ctrl-c */ +#else +#if defined(TARGET_K64F) +#define OBS_BUTTON SW2 +#define UNREG_BUTTON SW3 +#endif +#endif + +bool _have_secure_conn = false; + +const unsigned char psk[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,0x31,0x32,0x33,0x34,0x35,0x36}; +const size_t psk_len = sizeof( psk ); +const unsigned char psk_identity[] = {0x0F,0x0F}; +const size_t psk_identity_len = sizeof( psk_identity ); + +const uint8_t server_cert[] = "-----BEGIN CERTIFICATE-----\r\n" +"MIIBmDCCAT6gAwIBAgIEVUCA0jAKBggqhkjOPQQDAjBLMQswCQYDVQQGEwJGSTEN\r\n" +"MAsGA1UEBwwET3VsdTEMMAoGA1UECgwDQVJNMQwwCgYDVQQLDANJb1QxETAPBgNV\r\n" +"BAMMCEFSTSBtYmVkMB4XDTE1MDQyOTA2NTc0OFoXDTE4MDQyOTA2NTc0OFowSzEL\r\n" +"MAkGA1UEBhMCRkkxDTALBgNVBAcMBE91bHUxDDAKBgNVBAoMA0FSTTEMMAoGA1UE\r\n" +"CwwDSW9UMREwDwYDVQQDDAhBUk0gbWJlZDBZMBMGByqGSM49AgEGCCqGSM49AwEH\r\n" +"A0IABLuAyLSk0mA3awgFR5mw2RHth47tRUO44q/RdzFZnLsAsd18Esxd5LCpcT9w\r\n" +"0tvNfBv4xJxGw0wcYrPDDb8/rjujEDAOMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0E\r\n" +"AwIDSAAwRQIhAPAonEAkwixlJiyYRQQWpXtkMZax+VlEiS201BG0PpAzAiBh2RsD\r\n" +"NxLKWwf4O7D6JasGBYf9+ZLwl0iaRjTjytO+Kw==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const uint8_t cert[] = "-----BEGIN CERTIFICATE-----\r\n" +"MIICTDCCAbWgAwIBAgIJAKI3S+LGklSGMA0GCSqGSIb3DQEBCwUAMD8xCzAJBgNV\r\n" +"BAYTAkZJMRMwEQYDVQQIDApTb21lLVN0YXRlMQ0wCwYDVQQHDARPdWx1MQwwCgYD\r\n" +"VQQKDANBUk0wHhcNMTUwNjExMTI0NTU1WhcNMTYwNjEwMTI0NTU1WjA/MQswCQYD\r\n" +"VQQGEwJGSTETMBEGA1UECAwKU29tZS1TdGF0ZTENMAsGA1UEBwwET3VsdTEMMAoG\r\n" +"A1UECgwDQVJNMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBt8ag12ILm2pn\r\n" +"RHUc2yMBXpdzspDwVV3VDaNTRXypVUOq/nxJc6zr8yG/Pvga2/XVijWQDLABHVhV\r\n" +"PoeulzXVSEHRR2bR2lhqulLzdUzPYJ+yJd4+082akoxdzoom8ms2LFlgiXO7lyBg\r\n" +"1t74xjEQapCkr7Tdl2pD9OTUrcfoEwIDAQABo1AwTjAdBgNVHQ4EFgQUHK0O4iK7\r\n" +"Rv8AsxAqRDlY3TSHWtUwHwYDVR0jBBgwFoAUHK0O4iK7Rv8AsxAqRDlY3TSHWtUw\r\n" +"DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQAPVLihYN65DEeYdf7gDAdP\r\n" +"MNH5RxsQlHdktQkYWcUewe3hvOf8yZUBbmO5OeEQmy5Ca2H1QhUuw+kWHo1l/K9g\r\n" +"DpR1xoDACeycBd/6tAHfaFzTEEDC9Ug839EAHDrbI4ihrPEbP6hyRIaUIM4IojXf\r\n" +"zuqwOcobS3idv8a9Npuohw==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const uint8_t key[] = "-----BEGIN PRIVATE KEY-----\r\n" +"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMG3xqDXYgubamdE\r\n" +"dRzbIwFel3OykPBVXdUNo1NFfKlVQ6r+fElzrOvzIb8++Brb9dWKNZAMsAEdWFU+\r\n" +"h66XNdVIQdFHZtHaWGq6UvN1TM9gn7Il3j7TzZqSjF3OiibyazYsWWCJc7uXIGDW\r\n" +"3vjGMRBqkKSvtN2XakP05NStx+gTAgMBAAECgYEAlRimNxsu6jIXJh4paSk8ewxb\r\n" +"0v+n0GJT0uwpPakotofaihxOepYejIfX/IMxoDKVtmImsZUiTelRGGMFORpGomS7\r\n" +"3Pb9awfn1yWiYja9MF7+pgFtXj6LxcB5rcxrP8s9rCs+kEq8yl/khGXmlwlpacUm\r\n" +"Pdg1rEHriykk/5dlyKkCQQD9zpgQKN87bQNOVSgFSNsrwCjEN2MvVUC6ycqVYqQd\r\n" +"oQZrO2lJuf57Jn7kRKJgfqqImwLYaohn5A9gKiqszo+fAkEAw2REr8L9aLoRPe5Q\r\n" +"4+lYCmNmxJjBbJoRviSlxx+p5dxK+8H4J+bnFUWzORFJP0+Bjhii2UHGBoMjuP2s\r\n" +"e8xDDQJADm0IrZp1Hb6TeodSkAJVGsaASq7PP2h8FmHT1uvVYi293Khy0pL0yPEm\r\n" +"MzlHdW6dqMgOwFhFyonm6dNbu5i+BwJBALSPKfIKDMcEev5yBgo3Dga7iLJQPx4u\r\n" +"2gqOLyvtlME3a4tu2fV1qUG9ITuxP7DjteMr3QFLiMVn1lETCpt0TNkCQGIvyjdV\r\n" +"RzYnzLDMulXCsuRBjs0C75KoZrcPPQ416SZFtYASsOl3P0Ih5jgt/1aPmth3Yson\r\n" +"GdnBOWyKzadLmz8=\r\n" +"-----END PRIVATE KEY-----\r\n"; + +const size_t server_cert_len = sizeof( server_cert ); +const size_t cert_len = sizeof( cert ); +const size_t key_len = sizeof( key ); + +#ifdef TARGET_LIKE_LINUX + +#if defined (BOOTSTRAP_ENABLED) +void* wait_for_bootstrap(void* arg) { + MbedClient *client; + client = (MbedClient*) arg; + if(client->bootstrap_successful()) { + printf("Registering endpoint\n"); + + // Create LWM2M device object specifying device resources + // as per OMA LWM2M specification. + M2MDevice* device_object = client->create_device_object(); + + M2MObject* object = client->create_generic_object(); + + // Add all the objects that you would like to register + // into the list and pass the list for register API. + M2MObjectList object_list; + object_list.push_back(device_object); + object_list.push_back(object); + + // Issue register command. + client->test_register(object_list); + } + return NULL; +} +#endif + +void* wait_for_unregister(void* arg) { + MbedClient *client; + client = (MbedClient*) arg; + if(client->unregister_successful()) { + printf("Unregistered done --> exiting\n"); + exit(1); + } + return NULL; +} + +void* send_observation(void* arg) { + MbedClient *client; + client = (MbedClient*) arg; + static uint8_t counter = 0; + while(1) { + sleep(1); + if(counter >= 10 && + client->register_successful()) { + printf("Sending observation\n"); + client->update_resource(); + counter = 0; + } + else + counter++; + } + return NULL; +} + +static MbedClient *m2mclient = NULL; + +static void ctrl_c_handle_function(void) +{ + if(m2mclient && m2mclient->register_successful()) { + printf("Unregistering endpoint\n"); + m2mclient->test_unregister(); + } +} +#else +#ifdef SIXLOWPAN_INTERFACE +volatile uint8_t mesh_network_state = MESH_DISCONNECTED; + +void mesh_network_callback(mesh_connection_status_t mesh_state) +{ + tr_info("Network established"); + mesh_network_state = mesh_state; +} +#endif +#endif + +void trace_printer(const char* str) +{ + printf("%s\r\n", str); +} + +#ifdef TARGET_LIKE_MBED +void app_start(int /*argc*/, char* /*argv*/[]) { +#else +int main() { +#endif + + // Instantiate the class which implements + // mbed Client API + MbedClient mbed_client; + +#ifdef TARGET_LIKE_LINUX + pthread_t unregister_thread; + pthread_t observation_thread; + + m2mclient = &mbed_client; + + mbed_trace_init(); + mbed_trace_print_function_set( trace_printer ); + mbed_trace_config_set(TRACE_MODE_COLOR|TRACE_ACTIVE_LEVEL_DEBUG|TRACE_CARRIAGE_RETURN); + + signal(SIGINT, (signalhandler_t)ctrl_c_handle_function); + +#else + // This sets up the network interface configuration which will be used + // by LWM2M Client API to communicate with mbed Device server. + +#ifdef SIXLOWPAN_INTERFACE + + Mesh6LoWPAN_ND *mesh_api = Mesh6LoWPAN_ND::getInstance(); + int8_t status; + + status = mesh_api->init(rf_device_register(), mesh_network_callback); + if (status != MESH_ERROR_NONE) + { + tr_error("Mesh network initialization failed %d!", status); + return 1; + } + + status = mesh_api->connect(); + if (status != MESH_ERROR_NONE) + { + tr_error("Can't connect to mesh network!"); + return 1; + } + + do + { + mesh_api->processEvent(); + } while(mesh_network_state != MESH_CONNECTED); + + +#else + EthernetInterface eth; + eth.init(); //Use DHCP + eth.connect(); + + lwipv4_socket_init(); +#endif + + // Set up Hardware interrupt button. + InterruptIn obs_button(OBS_BUTTON); + InterruptIn unreg_button(UNREG_BUTTON); + + // On press of SW3 button on K64F board, example application + // will call unregister API towards mbed Device Server + unreg_button.fall(&mbed_client,&MbedClient::test_unregister); + + // On press of SW2 button on K64F board, example application + // will send observation towards mbed Device Server + obs_button.fall(&mbed_client,&MbedClient::update_resource); + + +#endif + + // Create LWM2M Client API interface to manage bootstrap, + // register and unregister + + //These 2 are defining the secure connection usage + M2MSecurity::SecurityModeType mode = M2MSecurity::NoSecurity; + _have_secure_conn = (mode == M2MSecurity::Certificate || mode == M2MSecurity::Psk); + // SecurityNotSet, + // Psk = 0, + // Certificate = 2, + // NoSecurity = 3 + + mbed_client.create_interface(); + +#ifdef TARGET_LIKE_LINUX + +#if defined (BOOTSTRAP_ENABLED) + pthread_t bootstrap_thread; + // Create LWM2M bootstrap object specifying bootstrap server + // information. + M2MSecurity* security_object = mbed_client.create_bootstrap_object(_have_secure_conn); + // Issue bootstrap command. + mbed_client.test_bootstrap(security_object); + + pthread_create(&bootstrap_thread, NULL, &wait_for_bootstrap, (void*) &mbed_client); + pthread_join(bootstrap_thread, NULL); + +#else + M2MSecurity *register_object = mbed_client.create_register_object(_have_secure_conn); + + if( mode == M2MSecurity::Certificate ){ + register_object->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate); + register_object->set_resource_value(M2MSecurity::ServerPublicKey,server_cert,server_cert_len); + register_object->set_resource_value(M2MSecurity::PublicKey,cert,cert_len); + register_object->set_resource_value(M2MSecurity::Secretkey,key,key_len); + }else if( mode == M2MSecurity::Psk ){ + register_object->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Psk); + register_object->set_resource_value(M2MSecurity::ServerPublicKey,psk_identity,psk_identity_len); + register_object->set_resource_value(M2MSecurity::PublicKey,psk_identity,psk_identity_len); + register_object->set_resource_value(M2MSecurity::Secretkey,psk,psk_len); + }else{ + register_object->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity); + } + + mbed_client.set_register_object(register_object); + M2MDevice* device_object = mbed_client.create_device_object(); + + M2MObject* object = mbed_client.create_generic_object(); + + M2MObjectList object_list; + object_list.push_back(device_object); + object_list.push_back(object); + + mbed_client.test_register(object_list); +#endif + + pthread_create(&observation_thread, NULL, &send_observation, (void*) &mbed_client); + pthread_create(&unregister_thread, NULL, &wait_for_unregister, (void*) &mbed_client); + pthread_join(unregister_thread, NULL); + +#else + +#if defined (BOOTSTRAP_ENABLED) + // Create LWM2M bootstrap object specifying bootstrap server + // information. + M2MSecurity* security_object = mbed_client.create_bootstrap_object(_have_secure_conn); + + // Issue bootstrap command. + mbed_client.test_bootstrap(security_object); + + // Wait till the bootstrap callback is called successfully. + // Callback comes in bootstrap_done() +#ifdef SIXLOWPAN_INTERFACE + /* wait network to be established */ + do { + mesh_interface_run(); + } while(!mbed_client.bootstrap_successful()); +#else + while (!mbed_client.bootstrap_successful()) { __WFI(); } +#endif + +#else + + M2MSecurity *register_object = mbed_client.create_register_object(_have_secure_conn); + + if( mode == M2MSecurity::Certificate ){ + register_object->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate); + register_object->set_resource_value(M2MSecurity::ServerPublicKey,server_cert,server_cert_len); + register_object->set_resource_value(M2MSecurity::PublicKey,cert,cert_len); + register_object->set_resource_value(M2MSecurity::Secretkey,key,key_len); + }else if( mode == M2MSecurity::Psk ){ + register_object->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Psk); + register_object->set_resource_value(M2MSecurity::ServerPublicKey,psk_identity,psk_identity_len); + register_object->set_resource_value(M2MSecurity::PublicKey,psk_identity,psk_identity_len); + register_object->set_resource_value(M2MSecurity::Secretkey,psk,psk_len); + }else{ + register_object->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity); + } + + mbed_client.set_register_object(register_object); + +#endif + + // Create LWM2M device object specifying device resources + // as per OMA LWM2M specification. + M2MDevice* device_object = mbed_client.create_device_object(); + + M2MObject* object = mbed_client.create_generic_object(); + + // Add all the objects that you would like to register + // into the list and pass the list for register API. + M2MObjectList object_list; + object_list.push_back(device_object); + object_list.push_back(object); + + // Issue register command. + + FunctionPointer1<void, M2MObjectList> fp(&mbed_client, &MbedClient::test_register); + minar::Scheduler::postCallback(fp.bind(object_list)); + + minar::Scheduler::start(); + + // Wait till the register callback is called successfully. + // Callback comes in object_registered() +#ifdef SIXLOWPAN_INTERFACE + /* wait network to be established */ + do { + mesh_api->processEvent(); + } while(!mbed_client.register_successful()); +#endif + + // Wait for the unregister successful callback, + // Callback comes in object_unregsitered(), this will be + // waiting for user to press SW2 button on K64F board. +#ifdef SIXLOWPAN_INTERFACE + /* wait network to be established */ + do { + mesh_api->processEvent(); + } while(!mbed_client.unregister_successful()); +#endif + + +#if defined(BOOTSTRAP_ENABLED) + // This will turn on the LED on the board specifying that + // the application has run successfully. + notify_completion(mbed_client.unregister_successful() && + mbed_client.register_successful() && + mbed_client.bootstrap_successful()); + + // Delete security object created for bootstrapping + if(security_object) { + delete security_object; + } + +#else + + // Disconnect the connect and teardown the network interface +#ifdef SIXLOWPAN_INTERFACE + mesh_api->disconnect(); +#else + eth.disconnect(); +#endif +#endif //BOOTSTRAP_ENABLED + + // Delete device object created for registering device + // resources. + if(device_object) { + M2MDevice::delete_instance(); + } + if(object) { + delete object; + } + +#endif //TARGET_LIKE_LINUX + +#ifndef TARGET_LIKE_MBED +return 0; +#endif +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/helloworld-mbedclient/mbedclient.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "mbedclient.h" + +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" + +#ifdef TARGET_LIKE_MBED +#include "minar/minar.h" +#include "test_env.h" +#endif + +#include <time.h> +#include <stdio.h> + +// Enter your mbed Device Server's IPv4 address and Port number in +// mentioned format like 192.168.0.1:5693 +const String &BOOTSTRAP_SERVER_ADDRESS = "coap://10.45.3.10:5693"; +const String &BOOTSTRAP_SERVER_DTLS_ADDRESS = "coap://10.45.3.10:5694"; + +#ifdef SIXLOWPAN_INTERFACE +const String &MBED_SERVER_ADDRESS = "coap://FD00:FF1:CE0B:A5E1:1068:AF13:9B61:D557:5683"; +const String &MBED_SERVER_DTLS_ADDRESS = "coap://FD00:FF1:CE0B:A5E1:1068:AF13:9B61:D557:5684"; +#else +const String &MBED_SERVER_ADDRESS = "coap://10.45.3.10:5683"; +//const String &MBED_SERVER_ADDRESS = "coap://10.45.0.152:5683"; +const String &MBED_SERVER_DTLS_ADDRESS = "coap://10.45.3.10:5684"; +#endif +const String CLIENT_NAME = "secure-client"; + +const String &MANUFACTURER = "ARM"; +const String &TYPE = "type"; +const String &MODEL_NUMBER = "2015"; +const String &SERIAL_NUMBER = "12345"; +const uint8_t STATIC_VALUE[] = "Static value"; + +#ifdef TARGET_LIKE_LINUX +#include <unistd.h> +#else + +#endif + +MbedClient::MbedClient() +#ifndef TARGET_LIKE_LINUX +:_led(LED3) +#endif +{ + _security = NULL; + _interface = NULL; + _register_security = NULL; + _device = NULL; + _object = NULL; + _bootstrapped = false; + _error = false; + _registered = false; + _unregistered = false; + _registration_updated = false; + _value = 0; +} + +MbedClient::~MbedClient() { + if(_security) { + delete _security; + } + if(_register_security){ + delete _register_security; + } + if(_device) { + M2MDevice::delete_instance(); + } + if(_object) { + delete _object; + } + if(_interface) { + delete _interface; + } +} + +bool MbedClient::create_interface() { + + M2MInterface::NetworkStack stack = M2MInterface::LwIP_IPv4; + #ifdef SIXLOWPAN_INTERFACE + stack = M2MInterface::Nanostack_IPv6; + #endif + + /* From http://www.iana.org/assignments/port-numbers: + "The Dynamic and/or Private Ports are those from 49152 through 65535" */ + srand(time(NULL)); + uint16_t port = (rand() % (65535-49152)) + 49152; + + _interface = M2MInterfaceFactory::create_interface(*this, + CLIENT_NAME, + "test", + 60, + port, + "", + M2MInterface::UDP, + stack, + ""); + + return (_interface == NULL) ? false : true; +} + +bool MbedClient::bootstrap_successful() { +#ifdef TARGET_LIKE_LINUX + while(!_bootstrapped && !_error) { + sleep(1); + } +#endif + return _bootstrapped; +} + +bool MbedClient::register_successful() { +#ifdef TARGET_LIKE_LINUX + while(!_registered && !_error) { + sleep(1); + } +#endif + return _registered; +} + +bool MbedClient::unregister_successful() { +#ifdef TARGET_LIKE_LINUX + while(!_unregistered && !_error) { + sleep(1); + } +#endif + return _unregistered; +} + +bool MbedClient::registration_update_successful() { +#ifdef TARGET_LIKE_LINUX + while(!_registration_updated && !_error) { + sleep(1); + } +#endif + return _registration_updated; +} + +M2MSecurity* MbedClient::create_bootstrap_object(bool useSecureConnection) { + // Creates bootstrap server object with Bootstrap server address and other parameters + // required for client to connect to bootstrap server. + M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::Bootstrap); + if(security) { + if(useSecureConnection){ + security->set_resource_value(M2MSecurity::M2MServerUri, BOOTSTRAP_SERVER_DTLS_ADDRESS); + //TODO: remove these, when bootstrapping server supports DTLS + delete security; + return NULL; + }else{ + security->set_resource_value(M2MSecurity::M2MServerUri, BOOTSTRAP_SERVER_ADDRESS); + //TODO: refactor this out + security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity); + } + } + return security; +} + +M2MSecurity* MbedClient::create_register_object(bool useSecureConnection) { + // Creates bootstrap server object with Bootstrap server address and other parameters + // required for client to connect to bootstrap server. + M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); + if(security) { + if(useSecureConnection){ + security->set_resource_value(M2MSecurity::M2MServerUri, MBED_SERVER_DTLS_ADDRESS); + }else{ + security->set_resource_value(M2MSecurity::M2MServerUri, MBED_SERVER_ADDRESS); + } + } + return security; +} + +void MbedClient::test_bootstrap(M2MSecurity *security) { + if(_interface) { + // Bootstrap function. + _interface->bootstrap(security); + } +} + +M2MDevice* MbedClient::create_device_object() { + // Creates device object which contains mandatory resources linked with + // device endpoint. + M2MDevice *device = M2MInterfaceFactory::create_device(); + if(device) { + device->create_resource(M2MDevice::Manufacturer,MANUFACTURER); + device->create_resource(M2MDevice::DeviceType,TYPE); + device->create_resource(M2MDevice::ModelNumber,MODEL_NUMBER); + device->create_resource(M2MDevice::SerialNumber,SERIAL_NUMBER); + } + return device; +} + +void MbedClient::execute_function(void *argument) { +#ifdef TARGET_LIKE_LINUX + if(argument) { + char* arguments = (char*)argument; + printf("Received %s!!\n", arguments); + } + printf("I am executed !!\n"); +#else + _led == 0 ? _led = 1 : _led = 0; +#endif +} + +M2MObject* MbedClient::create_generic_object() { + _object = M2MInterfaceFactory::create_object("Test"); + if(_object) { + M2MObjectInstance* inst = _object->create_object_instance(); + if(inst) { + inst->set_operation(M2MBase::GET_ALLOWED); + + M2MResource* res = inst->create_dynamic_resource("Dynamic", + "ResourceTest", + M2MResourceInstance::INTEGER, + true); + + char buffer[20]; + int size = sprintf(buffer,"%d",_value); + res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + res->set_value((const uint8_t*)buffer, + (const uint32_t)size); + res->set_execute_function(execute_callback(this,&MbedClient::execute_function)); + _value++; + + inst->create_static_resource("Static", + "ResourceTest", + M2MResourceInstance::STRING, + STATIC_VALUE, + sizeof(STATIC_VALUE)-1); + } + } + return _object; +} + +void MbedClient::update_resource() { + if(_object) { + M2MObjectInstance* inst = _object->object_instance(); + if(inst) { + M2MResource* res = inst->resource("Dynamic"); + if( res ){ + char buffer[20]; + int size = sprintf(buffer,"%d",_value); + res->set_value((const uint8_t*)buffer, + (const uint32_t)size); + _value++; + } + } + } +} + +void MbedClient::test_register(M2MObjectList object_list){ + if(_interface) { + _interface->register_object(_register_security, object_list); + } +} + +void MbedClient::set_register_object(M2MSecurity *®ister_object){ + if(_register_security) { + delete _register_security; + _register_security = NULL; + } + _register_security = register_object; + +} + +void MbedClient::test_update_register() { + uint32_t updated_lifetime = 20; + _registered = false; + _unregistered = false; + if(_interface){ + _interface->update_registration(_register_security,updated_lifetime); + } +} + +void MbedClient::test_unregister() { + if(_interface) { + _interface->unregister_object(NULL); + } +} + +void MbedClient::bootstrap_done(M2MSecurity *server_object){ + if(server_object) { + set_register_object(server_object); + _bootstrapped = true; + _error = false; + printf("\nBootstrapped\n"); + } +} + +void MbedClient::object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){ + _registered = true; + _unregistered = false; + printf("\nRegistered\n"); +} + +void MbedClient::object_unregistered(M2MSecurity */*server_object*/){ + _unregistered = true; + _registered = false; + +#ifdef TARGET_LIKE_MBED + notify_completion(_unregistered); + minar::Scheduler::stop(); +#endif + printf("\nUnregistered\n"); +} + +void MbedClient::registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/){ + _registration_updated = true; + printf("\nregistration updated\n"); +} + +void MbedClient::error(M2MInterface::Error error){ + _error = true; + printf("\nError occured Error code %d\n", (int)error); +} + +void MbedClient::value_updated(M2MBase *base, M2MBase::BaseType type) { + printf("\nValue updated of Object name %s and Type %d\n", + base->name(), type); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/helloworld-mbedclient/mbedclient.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef __MBED_CLIENT_H__ +#define __MBED_CLIENT_H__ + +#undef SIXLOWPAN_INTERFACE + +#include "mbed-client/m2minterfaceobserver.h" + +#ifndef TARGET_LIKE_LINUX +#include "mbed/DigitalOut.h" +#endif + + +//#define BOOTSTRAP_ENABLED + +class M2MDevice; +class M2MSecurity; +class M2MObject; + +class MbedClient: public M2MInterfaceObserver { +public: + MbedClient(); + + ~MbedClient(); + + bool create_interface(); + + bool bootstrap_successful(); + + bool register_successful(); + + bool unregister_successful(); + + bool registration_update_successful(); + + M2MSecurity* create_bootstrap_object(bool useSecureConnection); + + M2MSecurity* create_register_object(bool useSecureConnection); + + void test_bootstrap(M2MSecurity *security); + + M2MDevice* create_device_object(); + + void execute_function(void *argument); + + M2MObject* create_generic_object(); + + void update_resource(); + + void test_register(M2MObjectList object_list); + + void set_register_object(M2MSecurity *®ister_object); + + void test_update_register(); + + void test_unregister(); + + //Callback from mbed client stack when the bootstrap + // is successful, it returns the mbed Device Server object + // which will be used for registering the resources to + // mbed Device server. + void bootstrap_done(M2MSecurity *server_object); + + //Callback from mbed client stack when the registration + // is successful, it returns the mbed Device Server object + // to which the resources are registered and registered objects. + void object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/); + + //Callback from mbed client stack when the unregistration + // is successful, it returns the mbed Device Server object + // to which the resources were unregistered. + void object_unregistered(M2MSecurity */*server_object*/); + + void registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/); + + //Callback from mbed client stack if any error is encountered + // during any of the LWM2M operations. Error type is passed in + // the callback. + void error(M2MInterface::Error error); + + //Callback from mbed client stack if any value has changed + // during PUT operation. Object and its type is passed in + // the callback. + void value_updated(M2MBase *base, M2MBase::BaseType type); + +private: + +#ifndef TARGET_LIKE_LINUX + mbed::DigitalOut _led; +#endif + M2MInterface *_interface; + M2MSecurity *_security; + M2MSecurity *_register_security; + M2MDevice *_device; + M2MObject *_object; + bool _bootstrapped; + bool _error; + bool _registered; + bool _unregistered; + bool _registration_updated; + int _value; +}; + + + +#endif //__MBED_CLIENT_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/helloworld-mbedclient/to_be_ported.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <stdint.h> +#include <stdio.h> +#include <string.h> + +void arm_random_module_init(void) +{ +} + +uint32_t arm_random_seed_get(void) +{ + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,101 @@ +# Makefile for LWM2M Test Application +# +# Define compiler toolchain with PLATFORM variable +# Example +# make PLATFORM=arm-linux-gnueabi- +# + +ROOT := ../../../.. +LWM2M_ROOT := $(ROOT)/lwm2m +ROUTER_ROOT := $(ROOT)/Applications/NanoRouter + +VERSION := $(shell cd $(ROOT) && git describe --tags --long --dirty --always) + +# Specify list of sources to build +LWM2M_SRC := \ + main.cpp \ + cmd_commands.cpp \ + cmd_lwm2m.cpp \ + lwm2mtest.cpp \ + +CXX_SRCS += $(LWM2M_SRC) + +HAL_SRCS += \ + linux/arm_hal_interrupt.c \ + linux/arm_hal_timer.c \ + linux/ccm_mutex.c \ + +SRCS += $(addprefix $(ROOT)/Platforms/,$(HAL_SRCS)) + +EXE = lwm2mtestapplication + +override CFLAGS += -DENDPOINT -DUSE_LINUX +override CFLAGS += -Wall -Wextra +override CFLAGS += -g +override CFLAGS += -pthread +override CFLAGS += -std=gnu99 +override CFLAGS += -D'MEM_ALLOC=malloc' -D'MEM_FREE=free' + +override CFLAGS += -DVERSION='"$(VERSION)"' + +override CXXFLAGS += -I$(ROOT) -I$(NSDL_DIR)/nsdl-c -I$(LIBSERVICE_DIR)/libService -I$(ROOT)/nanostack/nanostack -I$(ROOT)/event-loop/nanostack-event-loop +override CXXFLAGS += -I$(LWM2M_ROOT) -I$(LWM2M_ROOT)/lwm2m-client +override CXXFLAGS += -DTARGET_LIKE_LINUX +override CXXFLAGS += -DHAVE_DEBUG +override CXXFLAGS += -g +# Generate dependency files when building +override CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" + +# Build with coverage +ifeq ($(COVERAGE), 1) +override CFLAGS += --coverage +override CXXFLAGS += --coverage +endif + +# +# Libraries +# +NSDL_DIR := $(ROOT)/nsdl-c +LWM2M_DIR := $(ROOT)/lwm2m/lwm2m-client +MBEDTLS_DIR := $(ROOT)/mbedtls/library +LIBSERVICE_DIR := $(ROOT)/libService +override CFLAGS += -I$(ROOT) -I$(NSDL_DIR)/nsdl-c -I$(LIBSERVICE_DIR)/libService -I$(ROOT)/nanostack/nanostack -I$(ROOT)/event-loop/nanostack-event-loop +override CFLAGS += -I$(ROOT)/nanostack/Core/include -I$(ROOT)/Platforms/linux/include -I$(ROOT)/nanostack/HAL/common +override CFLAGS += -I$(ROUTER_ROOT)/include +override CFLAGS += -I$(ROOT)/Platforms/linux/include -I$(ROOT)/Drivers/linux -I$(ROOT)/Boards/linux +LDFLAGS += -D_REENTRANT +LDFLAGS += -L$(ROOT)/event-loop -leventOS_gcc +LDFLAGS += -L$(LWM2M_DIR) -lmbedclient_gcc +LDFLAGS += -L$(NSDL_DIR) -lnsdl_gcc +LDFLAGS += -L$(LIBSERVICE_DIR) -lCmdline_gcc -lservice_gcc +LDFLAGS += -L$(MBEDTLS_DIR) -lmbedtls -lmbedx509 -lmbedcrypto +LDFLAGS += -lpthread + + +# Main build goal, specify here before dependecy parsing +.DEFAULT_GOAL: all +.PHONY: all +all: $(EXE) + +# Create a list of objects and depencies to build +OBJS := $(SRCS:.c=.o) +CXX_OBJS := $(CXX_SRCS:.cpp=.o) +DEPS += $$(SRCS:.c=.d) $$(CXX_SRCS:.cpp=.d) + +# Include depencies +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(DEPS)),) +-include $(DEPS) +endif +endif + +# Linking +$(EXE): $(OBJS) $(CXX_OBJS) + @echo 'Building target: $@' + g++ $(CXXFLAGS) $(CFLAGS) -o $@ $(OBJS) $(CXX_OBJS) $(LDFLAGS) + @echo 'Finished building target: $@' + @echo ' ' + +.PHONY: clean +clean: + -$(RM) $(OBJS) $(CXX_OBJS) $(DEPS) $(EXE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/cmd_commands.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2014-2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <string.h> +#include <stdarg.h> +#include <stdio.h> + +#include "ns_types.h" +#include "eventOS_event.h" +#include "eventOS_event_timer.h" +#include "net_interface.h" +#include "socket_api.h" +#include "mbed-trace/mbed_trace.h" +#include "common_functions.h" + +#include "ns_cmdline.h" +#include "cmd_commands.h" +#include "cmd_lwm2m.h" + +#define TRACE_GROUP "cApp" + +#define ESC 0x03 +#define EVENT_DATA_COMMAND_EXECUTED 6 + +// Prototypes +void cmd_ready_cb(int retcode); + +static void cmdline_event(arm_event_s *event); + +/** +* Callback function for thread handling. +*/ +void* __thread_poll_function(void*); + +typedef struct { + uint8_t tasklet_id; +} cmd_commands_t; + +cmd_commands_t cmd_commands; +pthread_t input_thread; /* Thread for input_terminal-function */ + +void initialize_app_commands(int8_t /*rf_driver_id*/) +{ + //initialize ready cb + cmd_set_ready_cb( cmd_ready_cb ); + lwm2m_command_init(); + + cmd_commands.tasklet_id = eventOS_event_handler_create(&cmdline_event, EVENT_TYPE_CMDLINE); + pthread_create(&input_thread, NULL,__thread_poll_function, NULL); +} + +void cmd_ready_cb(int retcode) +{ + tr_debug("cmd_ready_cb(%d)", retcode); + arm_event_s event; + event.sender = cmd_commands.tasklet_id; + event.receiver = cmd_commands.tasklet_id; + event.event_type = APPLICATION_EVENT; + event.event_id = EVENT_DATA_COMMAND_EXECUTED; + event.event_data = retcode; + eventOS_event_send(&event); +} + +static void cmdline_event(arm_event_s *event) +{ + switch( event->event_type ) + { + case ARM_LIB_TASKLET_INIT_EVENT: + //tasklet up and running + tr_warning("cmdline_event-ARM_LIB_TASKLET_INIT_EVENT"); + break; + + case APPLICATION_EVENT: + if( event->event_id == EVENT_DATA_COMMAND_EXECUTED ) + { + int retcode = event->event_data; + cmd_next( retcode ); + } + break; + default: + tr_warning("Unknown event type (type: %i, id: %i)", event->event_type, event->event_id); + break; + } +} + +void* __thread_poll_function(void*) +{ + int16_t c = getchar(); + while( c >= 0 ) { + cmd_char_input(c); + c = getchar(); + } + return NULL; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/cmd_commands.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef CMD_COMMANDS_H_ +#define CMD_COMMANDS_H_ + +#include <pthread.h> + +#define EVENT_TYPE_CMDLINE 5 +#define EVENT_CMDLINE_CONSOLE 5 + +void initialize_app_commands(int8_t rf_driver_id); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/cmd_lwm2m.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,875 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <string.h> +#include <stdlib.h> +#include <stdarg.h> + +//libServices +#include "ns_types.h" +#include "ns_cmdline.h" +#include "cmd_lwm2m.h" +#include "lwm2mtest.h" + +#define CMD_MAN_LWM2M_CLIENT "lwm2m-client <cmd> [options] LWM2M mbed Client API\n"\ + "setup <p> [options] Set up the LWM2M Interface\n"\ + "<p>:\n"\ + " Options for setup command\n"\ + " --endpoint <name> Endpoint Name (mandatory)\n"\ + " --type <name> Resource Type\n"\ + " --lifetime <n> Lifetime in seconds, default is -1 means not included\n"\ + " --port <n> Listen port, default is 5683\n"\ + " --domain <name> Domain for mbed Device Server, default is empty\n"\ + " --binding_mode <n> Binding Mode, NOT_SET = 0|UDP = 1(default)|QUEUE = 2|SMS = 4\n"\ + " --network_interface <n> Network Interface, Uninitialized = 0 ,LwIP_IPv4 = 1(default), LwIP_IPv6 = 2, Nanostack_IPv6 = 4\n"\ + "bootstrap_object <p> [options]\n"\ + "<p>:\n"\ + " Options for bootstrap object command\n"\ + " --address <name> Bootstrap server address, format is coap://192.168.0.1:5683\n"\ + "bootstrap Issues Bootstrap command\n"\ + "object <p> [options]\n"\ + "<p>:\n"\ + " Options for custom object\n"\ + " --name <name> Object name\n"\ + " --new_instance <n> If you need new instance 0=false(default), 1=true\n"\ + " --object_observable <n> Object is observable false=0(default), true=1\n"\ + " --object_instance_observable <n> Object Instance is observable false=0(default), true=1\n"\ + " --object_instance_id <n> Instance id of object instance 0=(default)\n"\ + " --object_operation <n> Operation Mode, Default is 0, NOT_ALLOWED = 0, GET_ALLOWED = 1,\n"\ + "PUT_ALLOWED = 2, GET_PUT_ALLOWED = 3, POST_ALLOWED = 4,GET_POST_ALLOWED = 5,\n"\ + "PUT_POST_ALLOWED = 6, GET_PUT_POST_ALLOWED = 7, DELETE_ALLOWED = 8\n"\ + " --object_instance_operation <n> Operation Mode, Default is 0, NOT_ALLOWED = 0, GET_ALLOWED = 1,\n"\ + "PUT_ALLOWED = 2, GET_PUT_ALLOWED = 3, POST_ALLOWED = 4,GET_POST_ALLOWED = 5,\n"\ + "PUT_POST_ALLOWED = 6, GET_PUT_POST_ALLOWED = 7, DELETE_ALLOWED = 8\n"\ + "static_resource <p> [options]\n"\ + "<p>:\n"\ + " Options for static resource\n"\ + " --object_instance <n> Instance Id of the object this resource is associated with, default is 0\n"\ + " --name <name> Resource name\n"\ + " --value <name> Resource value\n"\ + " --value_type <n> Value Type String=0, Integer=1\n"\ + " --multiple_instance <n> Supports multiple instances, false=0(default), true=1\n"\ + "dynamic_resource <p> [options]\n"\ + "<p>:\n"\ + " Options for dynamic resource\n"\ + " --object_instance <n> Instance Id of the object this resource is associated with, default is 0\n"\ + " --name <name> Resource name\n"\ + " --observable <n> Resource is observable false=0(default), true=1\n"\ + " --multiple_instance <n> Supports multiple instances, false=0(default), true=1\n"\ + " --resource_operation <n> Operation Mode, Default is 1, NOT_ALLOWED = 0, GET_ALLOWED = 1,\n"\ + "PUT_ALLOWED = 2, GET_PUT_ALLOWED = 3, POST_ALLOWED = 4,GET_POST_ALLOWED = 5,\n"\ + "PUT_POST_ALLOWED = 6, GET_PUT_POST_ALLOWED = 7, DELETE_ALLOWED = 8\n"\ + "dynamic_resource <p> [options]\n"\ + "static_resource_instance <p> [options]\n"\ + "<p>:\n"\ + " Options for static resource instance\n"\ + " --object_instance <n> Instance Id of the object this resource is associated with, default is 0\n"\ + " --resource_instance <n> Instance Id of the resource associated with, default is 0\n"\ + " --name <name> Resource name\n"\ + " --value <name> Resource value\n"\ + " --value_type <n> Value Type String=0, Integer=1\n"\ + " --multiple_instance <n> Supports multiple instances, false=0(default), true=1\n"\ + "dynamic_resource <p> [options]\n"\ + "dynamic_resource_instance <p> [options]\n"\ + "<p>:\n"\ + " Options for dynamic resource instance\n"\ + " --object_instance <n> Instance Id of the object this resource is associated with, default is 0\n"\ + " --resource_instance <n> Instance Id of the resource associated with, default is 0\n"\ + " --name <name> Resource name\n"\ + " --value_type <n> Value Type String=0, Integer=1(default)\n"\ + " --observable <n> Resource is observable false=0(default), true=1\n"\ + " --multiple_instance <n> Supports multiple instances, false=0(default), true=1\n"\ + " --resource_instance_operation <n> Operation Mode, Default is 1, NOT_ALLOWED = 0, GET_ALLOWED = 1,\n"\ + "PUT_ALLOWED = 2, GET_PUT_ALLOWED = 3, POST_ALLOWED = 4,GET_POST_ALLOWED = 5,\n"\ + "PUT_POST_ALLOWED = 6, GET_PUT_POST_ALLOWED = 7, DELETE_ALLOWED = 8\n"\ + "dynamic_resource <p> [options]\n"\ + "device <p> [options]\n"\ + "<p>:\n"\ + " Options for device object \n"\ + " --manufacturer <name> Manufacturer name\n"\ + " --model_number <name> Model number\n"\ + " --serial_number <name> Serial number\n"\ + " --device_type <name> Device Type\n"\ + " --hardware_version <name> Hardware version\n"\ + " --software_version <name> Software version\n"\ + " --firmware_version <name> Firmware version\n"\ + " --available_power_sources <n> Number of available power sources, Must have Instance ID\n"\ + " --power_source_voltage <n> Power source voltage, Must have Instance ID\n"\ + " --power_source_current <n> Power source current, Must have Instance ID\n"\ + " --battery_level <n> Battery level\n"\ + " --battery_status <n> Battery status\n"\ + " --memory_free <n> Free memory, in bytes\n"\ + " --memory_total <n> Free memory in bytes\n"\ + " --error_code <n> Error Code, Must have Instance ID\n"\ + " --current_time <n> Current Time, EPOCH format\n"\ + " --utc_offset <name> UTC Format\n"\ + " --timezone <name> Time zone \n"\ + " --instance_id <n> Instance ID for multiple resources \n"\ + "firmware <p> [options]\n"\ + "<p>:\n"\ + " Options for firmware object \n"\ + " --package <name> Firmware package\n"\ + " --package_uri <name> URI from where the device can download package\n"\ + " --state <n> State of firmware update\n"\ + " --update_supported_objects <bool> Send update registration message after fw update\n"\ + " --update_results <n> Result of downloading or updating firmware\n"\ + " --package_name <name> Package name\n"\ + " --package_version <name> Package version\n"\ + "register_object <p> [options]\n"\ + "<p>:\n"\ + " Options for register command\n"\ + " --address <name> mbed Device Server address, format is coap://192.168.0.1:5683\n"\ + " --secure <number> 1 == secure mode, non-secure otherwise (remember: secure port is 5684)\n"\ + "register Issues Register command\n"\ + "update-register <p> [options] Issues Update registration command\n"\ + "<p>:\n"\ + " Options for update-register command\n"\ + " --lifetime <n> Lifetime value in seconds\n"\ + "unregister Issues Un-register command\n"\ + "set_value <p> [options]\n"\ + "<p>:\n"\ + " Options for set_value command \n"\ + " --name <name> Resource name (Mandatory)\n"\ + " --value <value> Resource value (Mandatory)\n"\ + " --object_instance <n> Instance ID of object this resource is associated with, default is 0\n"\ + "set_value_instance <p> [options]\n"\ + "<p>:\n"\ + " Options for set_value_instance command for Resource Instances\n"\ + " --name <name> Resource name (Mandatory)\n"\ + " --value <value> Resource value (Mandatory)\n"\ + " --object_instance <n> Instance ID of object this resource is associated with, default is 0\n"\ + " --resource_instance <n> Instance ID of object of the resource, default is 0\n"\ + "resource_value <p> [options]\n"\ + "<p>:\n"\ + " Options for resource_value command\n"\ + " --firmware <n> Resource instance id in Firmware object\n"\ + +#define EXIT_MANUAL "exit :closes the application\n" + + +int lwm2m_client_command(int argc, char *argv[]); +int lwm2m_client_setup_command(int argc, char *argv[]); +int lwm2m_client_device_command(int argc, char *argv[]); +int lwm2m_client_object_command(int argc, char *argv[]); +int lwm2m_client_static_resource_command(int argc, char *argv[]); +int lwm2m_client_dynamic_resource_command(int argc, char *argv[]); +int lwm2m_client_static_resource_instance_command(int argc, char *argv[]); +int lwm2m_client_dynamic_resource_instance_command(int argc, char *argv[]); +int lwm2m_client_bootstrap_object_command(int argc, char *argv[]); +int lwm2m_client_bootstrap_command(); +int lwm2m_client_register_object_command(int argc, char *argv[]); +int lwm2m_client_register_command(); +int lwm2m_client_update_register_command(int argc, char *argv[]); +int lwm2m_client_unregister_command(); +int lwm2m_client_set_value_command(int argc, char *argv[]); +int lwm2m_client_set_value_instance_command(int argc, char *argv[]); +int lwm2m_client_firmware_command(int argc, char *argv[]); +int lwm2m_client_resource_value(int argc, char *argv[]); +int exit_command(int argc, char *argv[]); + +void lwm2m_command_init(void) +{ + cmd_add("lwm2m-client", lwm2m_client_command, "LWM2M Client specific command", CMD_MAN_LWM2M_CLIENT); + cmd_alias_add("lwm2m-client-test-setup", "lwm2m-client setup --endpoint lwm2m-endpoint --type test --lifetime 3600"); + cmd_alias_add("lwm2m-client-test-device", "lwm2m-client device --manufacturer ARM --model_number 2015 --serial_number 12345"); + cmd_alias_add("lwm2m-client-test-bootstrap-object", "lwm2m-client bootstrap_object --address coap://10.45.3.10:5693"); + cmd_alias_add("lwm2m-client-test-register-object", "lwm2m-client register_object --address coap://10.45.3.10:5683"); + cmd_alias_add("lwm2m-client-test-object", "lwm2m-client object --name 10 --object_observable 1 --object_instance_observable 1 --object_operation 3 --object_instance_operation 3"); + cmd_alias_add("lwm2m-client-test-dynamic_resource", "lwm2m-client dynamic_resource --name 1 --resource_operation 3 --observable 0"); + cmd_alias_add("lwm2m-client-test-secure-register-object", "lwm2m-client register_object --address coap://10.45.3.10:5684 --secure 1"); + cmd_add("exit", exit_command, "exit command", EXIT_MANUAL); +} +char *test_mem_block = 0; +int test_timer; +M2MLWClient lwm2m_client; + +int lwm2m_client_command(int argc, char *argv[]) +{ + if( strcmp(argv[1], "setup") == 0 ) + { + return lwm2m_client_setup_command(argc, argv); + } + else if( strcmp(argv[1], "bootstrap_object") == 0 ) + { + return lwm2m_client_bootstrap_object_command(argc, argv); + } + else if( strcmp(argv[1], "bootstrap") == 0 ) + { + return lwm2m_client_bootstrap_command(); + } + else if( strcmp(argv[1], "device") == 0 ) + { + return lwm2m_client_device_command(argc, argv); + } + else if( strcmp(argv[1], "firmware") == 0 ) + { + return lwm2m_client_firmware_command(argc, argv); + } + else if( strcmp(argv[1], "resource_value") == 0 ) + { + return lwm2m_client_resource_value(argc, argv); + } + else if( strcmp(argv[1], "object") == 0 ) + { + return lwm2m_client_object_command(argc, argv); + } + else if( strcmp(argv[1], "static_resource") == 0 ) + { + return lwm2m_client_static_resource_command(argc, argv); + } + else if( strcmp(argv[1], "dynamic_resource") == 0 ) + { + return lwm2m_client_dynamic_resource_command(argc, argv); + } + else if( strcmp(argv[1], "static_resource_instance") == 0 ) + { + return lwm2m_client_static_resource_instance_command(argc, argv); + } + else if( strcmp(argv[1], "dynamic_resource_instance") == 0 ) + { + return lwm2m_client_dynamic_resource_instance_command(argc, argv); + } + else if( strcmp(argv[1], "register_object") == 0 ) + { + return lwm2m_client_register_object_command(argc, argv); + } + else if( strcmp(argv[1], "register") == 0 ) + { + return lwm2m_client_register_command(); + } + else if( strcmp(argv[1], "update-register") == 0 ) + { + return lwm2m_client_update_register_command(argc, argv); + } + else if( strcmp(argv[1], "unregister") == 0 ) + { + return lwm2m_client_unregister_command(); + } + else if ( strcmp(argv[1], "set_value") == 0) + { + return lwm2m_client_set_value_command(argc, argv); + } + else if ( strcmp(argv[1], "set_value_instance") == 0) + { + return lwm2m_client_set_value_instance_command(argc, argv); + } + //:TODO what another commands should be there ? + return CMDLINE_RETCODE_COMMAND_NOT_IMPLEMENTED; +} + +int lwm2m_client_setup_command(int argc, char *argv[]) +{ + char *endpoint = 0; + char *type = 0; + int lifetime = -1; + int32_t port = 5683; + char *domain = 0; + int32_t binding_mode = 1; + int32_t network_interface = 1; + + if (!cmd_parameter_val(argc, argv, "--endpoint", &endpoint)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + int opt_params = 0; + cmd_parameter_val(argc, argv, "--type", &type); + if (cmd_parameter_int(argc, argv, "--lifetime", &lifetime)) { + if (opt_params != 0) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + else { + opt_params += 1; + } + } + if (cmd_parameter_int(argc, argv, "--port", &port)) { + if (port > UINT16_MAX || opt_params != 1) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + else { + opt_params += 1; + } + } + if (cmd_parameter_val(argc, argv, "--domain", &domain)) { + if (opt_params != 2) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + else { + opt_params += 1; + } + } + if (cmd_parameter_int(argc, argv, "--binding_mode", &binding_mode)) { + if (opt_params != 3) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + else { + opt_params += 1; + } + } + if (cmd_parameter_int(argc, argv, "--network_interface", &network_interface)) { + if (opt_params != 4) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + else { + opt_params += 1; + } + } + + bool success = false; + if (lwm2m_client.create_interface(opt_params, + endpoint, + type, + lifetime, + port, + domain, + binding_mode, + network_interface)) { + return CMDLINE_RETCODE_SUCCESS; + } + + return CMDLINE_RETCODE_FAIL; +} + +int lwm2m_client_device_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_SUCCESS;// CMDLINE_RETCODE_INVALID_PARAMETERS; + char *manufacturer = 0; + char *model_number = 0; + char *serial_number = 0; + char *device_type = 0; + char *hardware_version = 0; + char *software_version = 0; + char *firmware_version = 0; + char *utc_offset = 0; + char *timezone = 0; + int32_t current_time = 0; + int32_t available_power_sources = 0; + int32_t power_source_voltage = 0; + int32_t power_source_current = 0; + int32_t battery_status = 0; + int32_t battery_level = 0; + int32_t memory_free = 0; + int32_t memory_total = 0; + int32_t error_code = 0; + int32_t instance_id = 0; + + lwm2m_client.create_device_object(); + + if(cmd_parameter_val(argc, argv, "--manufacturer", &manufacturer)) { + if(!lwm2m_client.create_device_object(M2MDevice::Manufacturer, + manufacturer)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--model_number", &model_number)) { + if(!lwm2m_client.create_device_object(M2MDevice::ModelNumber, + model_number)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--serial_number", &serial_number)){ + if(!lwm2m_client.create_device_object(M2MDevice::SerialNumber, + serial_number)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--device_type", &device_type)){ + if(!lwm2m_client.create_device_object(M2MDevice::DeviceType, + device_type)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--hardware_version", &hardware_version)){ + if(!lwm2m_client.create_device_object(M2MDevice::HardwareVersion, + hardware_version)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--software_version", &software_version)){ + if(!lwm2m_client.create_device_object(M2MDevice::SoftwareVersion, + software_version)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--firmware_version", &firmware_version)){ + if(!lwm2m_client.create_device_object(M2MDevice::FirmwareVersion, + firmware_version)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--available_power_sources", &available_power_sources)){ + if(cmd_parameter_int(argc, argv, "--instance_id", &instance_id)) { + if(!lwm2m_client.create_device_object(M2MDevice::AvailablePowerSources, + available_power_sources,instance_id)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + } + if(cmd_parameter_int(argc, argv, "--power_source_voltage", &power_source_voltage)){ + if(cmd_parameter_int(argc, argv, "--instance_id", &instance_id)) { + if(!lwm2m_client.create_device_object(M2MDevice::PowerSourceVoltage, + power_source_voltage,instance_id)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + } + if(cmd_parameter_int(argc, argv, "--power_source_current", &power_source_current)){ + if(cmd_parameter_int(argc, argv, "--instance_id", &instance_id)) { + if(!lwm2m_client.create_device_object(M2MDevice::PowerSourceCurrent, + power_source_current,instance_id)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + } + if(cmd_parameter_int(argc, argv, "--battery_level", &battery_level)){ + if(!lwm2m_client.create_device_object(M2MDevice::BatteryLevel, + battery_level)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--battery_status", &battery_status)){ + if(!lwm2m_client.create_device_object(M2MDevice::BatteryStatus, + battery_status)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--memory_free", &memory_free)){ + if(!lwm2m_client.create_device_object(M2MDevice::MemoryFree, + memory_free)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--memory_total", &memory_total)){ + if(!lwm2m_client.create_device_object(M2MDevice::MemoryTotal, + memory_total)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--error_code", &error_code)){ + if(cmd_parameter_int(argc, argv, "--instance_id", &instance_id)) { + if(!lwm2m_client.create_device_object(M2MDevice::ErrorCode, + error_code,instance_id)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + } + if(cmd_parameter_int(argc, argv, "--current_time", ¤t_time)){ + if(!lwm2m_client.create_device_object(M2MDevice::CurrentTime, + current_time)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--utc_offset", &utc_offset)){ + if(!lwm2m_client.create_device_object(M2MDevice::UTCOffset, + utc_offset)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--timezone", &timezone)){ + if(!lwm2m_client.create_device_object(M2MDevice::Timezone, + timezone)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + + return return_code; +} + +int lwm2m_client_firmware_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_SUCCESS;// CMDLINE_RETCODE_INVALID_PARAMETERS; + char *package = 0; + char *package_uri = 0; + char *package_name = 0; + char *package_version = 0; + int32_t state = 1; + int32_t update_result = 0; + int32_t update_supported_objects = 0; + + lwm2m_client.create_firmware_object(); + + if(cmd_parameter_val(argc, argv, "--package", &package)) { + uint16_t length = (uint16_t)sizeof(package); + if(!lwm2m_client.create_firmware_object(M2MFirmware::Package, + (const uint8_t*)package, length)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + + if(cmd_parameter_val(argc, argv, "--package_uri", &package_uri)) { + if(!lwm2m_client.create_firmware_object(M2MFirmware::PackageUri, + package_uri)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--state", &state)) { + if(!lwm2m_client.create_firmware_object(M2MFirmware::State, + state)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--update_supported_objects", &update_supported_objects)) { + if(!lwm2m_client.create_firmware_object(M2MFirmware::UpdateSupportedObjects, + update_supported_objects)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_int(argc, argv, "--update_results", &update_result)) { + if(!lwm2m_client.create_firmware_object(M2MFirmware::UpdateResult, + update_result)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--package_name", &package_name)) { + if(!lwm2m_client.create_firmware_object(M2MFirmware::PackageName, + package_name)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + if(cmd_parameter_val(argc, argv, "--package_version", &package_version)) { + if(!lwm2m_client.create_firmware_object(M2MFirmware::PackageVersion, + package_version)) { + return CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + lwm2m_client.set_fw_execute_function(); + return return_code; +} + +int lwm2m_client_resource_value(int argc, char *argv[]) +{ + int resource = 0; + if(cmd_parameter_int(argc, argv, "--firmware", &resource)) { + if (resource == 3 || resource == 4 || resource == 5) { + lwm2m_client.firmware_resource_int(resource); + } + else if (resource == 0) { + lwm2m_client.firmware_resource_buffer(); + } + else { + lwm2m_client.firmware_resource_string(resource); + } + } + return CMDLINE_RETCODE_SUCCESS; +} + +int lwm2m_client_object_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_SUCCESS;// CMDLINE_RETCODE_INVALID_PARAMETERS; + char *object_name = 0; + int32_t new_instance = 0; + int32_t object_operation = 0; + int32_t object_instance_operation = 0; + int32_t object_instance_id = 0; + int32_t object_observable = 0; + int32_t object_instance_observable = 0; + + if(cmd_parameter_val(argc, argv, "--name", &object_name)) { + cmd_parameter_int(argc, argv, "--new_instance", &new_instance); + cmd_parameter_int(argc, argv, "--object_operation", &object_operation); + cmd_parameter_int(argc, argv, "--object_instance_operation", &object_instance_operation); + cmd_parameter_int(argc, argv, "--object_instance_id", &object_instance_id); + cmd_parameter_int(argc, argv, "--object_observable", &object_observable); + cmd_parameter_int(argc, argv, "--object_instance_observable", &object_instance_observable); + + if(!lwm2m_client.create_object(object_name, + new_instance, + object_operation, + object_instance_operation, + object_instance_id, + object_observable, + object_instance_observable)) { + return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + } + } + return return_code; +} + +int lwm2m_client_static_resource_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + char *name = 0; + char *value_string = 0; + int32_t value_int = 0; + int32_t value_type = -1; + int32_t multiple_instance = 0; + int32_t object_instance = 0; + + cmd_parameter_int(argc, argv, "--multiple_instance", &multiple_instance); + cmd_parameter_int(argc, argv, "--object_instance", &object_instance); + + + if(cmd_parameter_int(argc, argv, "--value_type", &value_type)) { + if(0 == value_type){ + if(cmd_parameter_val(argc, argv, "--name", &name) && + cmd_parameter_val(argc, argv, "--value", &value_string)) { + if(lwm2m_client.create_static_resource_string(name,value_string, + multiple_instance,object_instance)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + } else if(1 == value_type){ + if(cmd_parameter_val(argc, argv, "--name", &name) && + cmd_parameter_int(argc, argv, "--value", &value_int)) { + if(lwm2m_client.create_static_resource_int(name,value_int, + multiple_instance,object_instance)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + } + } + return return_code; +} + +int lwm2m_client_dynamic_resource_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + char *name = 0; + int32_t multiple_instance = 0; + int32_t object_instance = 0; + int32_t observable = 0; + int32_t resource_operation = 1; + int32_t value_type = -1; + + cmd_parameter_int(argc, argv, "--value_type", &value_type); + cmd_parameter_int(argc, argv, "--multiple_instance", &multiple_instance); + cmd_parameter_int(argc, argv, "--object_instance", &object_instance); + cmd_parameter_int(argc, argv, "--observable", &observable); + cmd_parameter_int(argc, argv, "--resource_operation", &resource_operation); + if(-1 == value_type){ + value_type = 1; + } + + if(cmd_parameter_val(argc, argv, "--name", &name)) { + if(0 == value_type) { + if(lwm2m_client.create_dynamic_resource_string(name,observable, + multiple_instance, + object_instance, + resource_operation)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + else if(1 == value_type){ + if(lwm2m_client.create_dynamic_resource_int(name,observable, + multiple_instance, + object_instance, + resource_operation)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + + } + return return_code; +} + +int lwm2m_client_static_resource_instance_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + char *name = 0; + char *value_string = 0; + int32_t value_int = 0; + int32_t value_type = -1; + int32_t multiple_instance = 0; + int32_t object_instance = 0; + int32_t resource_instance = 0; + + cmd_parameter_int(argc, argv, "--multiple_instance", &multiple_instance); + cmd_parameter_int(argc, argv, "--object_instance", &object_instance); + cmd_parameter_int(argc, argv, "--resource_instance", &resource_instance); + + if(cmd_parameter_int(argc, argv, "--value_type", &value_type)) { + if(0 == value_type){ + if(cmd_parameter_val(argc, argv, "--name", &name) && + cmd_parameter_val(argc, argv, "--value", &value_string)) { + if(lwm2m_client.create_static_resource_instance_string(name,value_string, + multiple_instance, + object_instance, + resource_instance)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + } else if(1 == value_type){ + if(cmd_parameter_val(argc, argv, "--name", &name) && + cmd_parameter_int(argc, argv, "--value", &value_int)) { + if(lwm2m_client.create_static_resource_instance_int(name,value_int, + multiple_instance, + object_instance, + resource_instance)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + } + } + return return_code; +} + +int lwm2m_client_dynamic_resource_instance_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + char *name = 0; + int32_t multiple_instance = 0; + int32_t object_instance = 0; + int32_t resource_instance = 0; + int32_t observable = 0; + int32_t resource_instance_operation = 1; + int32_t value_type = -1; + + cmd_parameter_int(argc, argv, "--value_type", &value_type); + cmd_parameter_int(argc, argv, "--multiple_instance", &multiple_instance); + cmd_parameter_int(argc, argv, "--object_instance", &object_instance); + cmd_parameter_int(argc, argv, "--resource_instance", &resource_instance); + cmd_parameter_int(argc, argv, "--observable", &observable); + cmd_parameter_int(argc, argv, "--resource_instance_operation", &resource_instance_operation); + if(-1 == value_type){ + value_type = 1; + } + + if(cmd_parameter_val(argc, argv, "--name", &name)) { + if(0 == value_type){ + if(lwm2m_client.create_dynamic_resource_instance_string(name,observable, + multiple_instance, + object_instance, + resource_instance, + resource_instance_operation)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + else if(1 == value_type){ + if(lwm2m_client.create_dynamic_resource_instance_int(name,observable, + multiple_instance, + object_instance, + resource_instance, + resource_instance_operation)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + } + return return_code; +} + +int lwm2m_client_bootstrap_object_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_FAIL; + char *address = 0; + + if( cmd_parameter_val(argc, argv, "--address", &address) ){ + if(lwm2m_client.create_bootstrap_object(address)){ + return_code = CMDLINE_RETCODE_SUCCESS; + } + } else { + return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + } + return return_code; +} + +int lwm2m_client_bootstrap_command() +{ + int return_code = CMDLINE_RETCODE_FAIL; + + if(lwm2m_client.test_bootstrap()){ + return_code = CMDLINE_RETCODE_EXCUTING_CONTINUE; + } + return return_code; +} + +int lwm2m_client_register_object_command(int argc, char *argv[]) +{ + char *address = 0; + cmd_parameter_val(argc, argv, "--address", &address); + + int useSecureConn = 0; + if( !cmd_parameter_int(argc, argv, "--secure", &useSecureConn) ){ + useSecureConn = 0; + } + + if(lwm2m_client.create_register_object(address, useSecureConn == 1)) { + return CMDLINE_RETCODE_SUCCESS; + } + return CMDLINE_RETCODE_INVALID_PARAMETERS; +} + +int lwm2m_client_register_command() +{ + if(lwm2m_client.test_register()) { + return CMDLINE_RETCODE_EXCUTING_CONTINUE; + } + return CMDLINE_RETCODE_INVALID_PARAMETERS; +} + +int lwm2m_client_update_register_command(int argc, char *argv[]) +{ + int ret_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + int32_t lifetime = 0; + + cmd_parameter_int(argc, argv, "--lifetime", &lifetime); + + if(lifetime >= 0) { + if(lwm2m_client.test_update_register(lifetime)) { + ret_code = CMDLINE_RETCODE_EXCUTING_CONTINUE; + } + } + return ret_code; +} + +int lwm2m_client_unregister_command() +{ + if(lwm2m_client.test_unregister()) { + return CMDLINE_RETCODE_EXCUTING_CONTINUE; + } + return CMDLINE_RETCODE_INVALID_PARAMETERS; +} + +int lwm2m_client_set_value_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + char *name = 0; + int32_t value = 0; + int32_t object_instance = 0; + + cmd_parameter_int(argc, argv, "--object_instance", &object_instance); + + if(cmd_parameter_val(argc, argv, "--name", &name) && + cmd_parameter_int(argc, argv, "--value", &value)) { + if(lwm2m_client.set_resource_value(name,value,object_instance)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + return return_code; +} + +int lwm2m_client_set_value_instance_command(int argc, char *argv[]) +{ + int return_code = CMDLINE_RETCODE_INVALID_PARAMETERS; + char *name = 0; + int32_t value = 0; + int32_t object_instance = 0; + int32_t resource_instance = 0; + + cmd_parameter_int(argc, argv, "--object_instance", &object_instance); + cmd_parameter_int(argc, argv, "--resource_instance", &resource_instance); + + if(cmd_parameter_val(argc, argv, "--name", &name) && + cmd_parameter_int(argc, argv, "--value", &value)) { + if(lwm2m_client.set_resource_instance_value(name,value, + object_instance, + resource_instance)) { + return_code = CMDLINE_RETCODE_SUCCESS; + } + } + return return_code; +} + +int exit_command(int argc, char *argv[]) +{ + exit(1); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/cmd_lwm2m.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef CMD_LWM2M_H_ +#define CMD_LWM2M_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +void lwm2m_command_init(void); + +#ifdef __cplusplus +} +#endif + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/generate_coverage.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,29 @@ +#!/bin/bash + +# Copyright (c) 2015 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. + + +rm -rf coverage +lcov --base-directory ../../ --directory ../../output/gcc_linux/source -c -o testapp.info +lcov --base-directory ../../ --directory ../../output/lwm2m-client-linux/source -c -o lwm2mlinux.info +lcov --base-directory ../../ --directory ../../output/lwm2m-client-mbedtls/source -c -o mbedtls.info +lcov --base-directory ../../../../nsdl-c --directory ../../../../nsdl-c/output/gcc_/source/libCoap/src -c -o libcoap.info +lcov --base-directory ../../../../nsdl-c --directory ../../../../nsdl-c/output/gcc_/source/libNsdl/src -c -o libnsdl.info +genhtml -o coverage -t "lwm2mtestapplication coverage" --num-spaces 4 testapp.info libcoap.info libnsdl.info lwm2mlinux.info mbedtls.info +lcov --base-directory ../../ --directory ../../output/gcc_linux/source -z +lcov --base-directory ../../ --directory ../../output/lwm2m-client-linux/source -z +lcov --base-directory ../../ --directory ../../output/lwm2m-client-mbedtls/source -z +lcov --base-directory ../../../../nsdl-c --directory ../../../../nsdl-c/output/gcc_/source/libCoap/src -z +lcov --base-directory ../../../../nsdl-c --directory ../../../../nsdl-c/output/gcc_/source/libNsdl/src -z \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/lwm2mtest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,859 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "lwm2mtest.h" +#include "ns_types.h" +#include "ns_cmdline.h" + +M2MLWClient::M2MLWClient() +: _security(NULL), + _interface(NULL), + _device(NULL), + _bootstrapped(false), + _error(false), + _registered(false), + _unregistered(false), + _registration_updated(false) +{ +} + +M2MLWClient::~M2MLWClient() +{ + if(_interface) { + delete _interface; + } + if(_security) { + delete _security; + } + if( _register_security){ + delete _register_security; + } +} + + +bool M2MLWClient::create_interface(int32_t param_count, + const char *endpoint, + const char *resource_type, + const int32_t lifetime, + const uint16_t listen_port, + const char *domain, + const uint8_t binding_mode, + const uint8_t network_interface) +{ + if(_interface) { + delete _interface; + _interface = NULL; + } + String ep; + String rt; + String dmn; + if(endpoint) { + ep += endpoint; + } + if(resource_type) { + rt += resource_type; + } + if(domain) { + dmn += domain; + } + + // Binding mode cannot be higher than 0x07 since it is an enum, check M2MInterface::BindingMode + if(binding_mode > 0x07) { + return false; + } + + switch (param_count) { + case 0: + _interface = M2MInterfaceFactory::create_interface(*this, ep, rt); + break; + case 1: + _interface = M2MInterfaceFactory::create_interface(*this, ep, rt, lifetime); + break; + case 2: + _interface = M2MInterfaceFactory::create_interface(*this, ep, rt, lifetime, listen_port); + break; + case 3: + _interface = M2MInterfaceFactory::create_interface(*this, ep, rt, lifetime, listen_port, dmn); + break; + case 4: + _interface = M2MInterfaceFactory::create_interface(*this, ep, rt, lifetime, listen_port, dmn, (M2MInterface::BindingMode)binding_mode); + break; + case 5: + _interface = M2MInterfaceFactory::create_interface(*this, ep, rt, lifetime, listen_port, dmn, (M2MInterface::BindingMode)binding_mode, (M2MInterface::NetworkStack)network_interface); + break; + } + return (_interface == NULL) ? false : true; +} + +bool M2MLWClient::create_bootstrap_object(const char *coap_bootstrap_address) +{ + bool success = false; + String address; + if(coap_bootstrap_address) { + address += coap_bootstrap_address; + } + if(_security) { + delete _security; + } + _security = M2MInterfaceFactory::create_security(M2MSecurity::Bootstrap); + if(_security) { + if(_security->set_resource_value(M2MSecurity::M2MServerUri, address) && + _security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity)) { + success = true; + } + } + return success; +} + +bool M2MLWClient::create_register_object(const char *coap_register_address, bool useSecureConn) +{ + bool success = false; + String address; + if(coap_register_address) { + address += coap_register_address; + } + if(_register_security) { + delete _register_security; + } + _register_security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); + if(_register_security) { + if( !useSecureConn ){ + if(_register_security->set_resource_value(M2MSecurity::M2MServerUri, address) && + _register_security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity)) { + success = true; + } + }else{ + if(_register_security->set_resource_value(M2MSecurity::M2MServerUri, address) && + _register_security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate) && + _register_security->set_resource_value(M2MSecurity::ServerPublicKey,server_cert,server_cert_len) && + _register_security->set_resource_value(M2MSecurity::PublicKey,cert,cert_len) && + _register_security->set_resource_value(M2MSecurity::Secretkey,key,key_len) ){ + success = true; + } + } + } + return success; +} + +bool M2MLWClient::test_bootstrap() +{ + bool success = false; + if(_interface) { + _interface->bootstrap(_security); + success = true; + } + return success; +} + +bool M2MLWClient::create_device_object(M2MDevice::DeviceResource resource, + const char *value) +{ + bool success = false; + String value_string; + if(value) { + value_string += value; + } + if(!_device) { + _device = M2MInterfaceFactory::create_device(); + } + if(_device) { + + if(_device->create_resource(resource,value_string)){ + success = true; + } else { + success = _device->set_resource_value(resource,value); + } + } + return success; +} + +bool M2MLWClient::create_device_object() +{ + bool success = false; + if(!_device) { + _device = M2MInterfaceFactory::create_device(); + success = true; + } + return success; +} + +bool M2MLWClient::create_device_object(M2MDevice::DeviceResource resource, + int64_t value) +{ + bool success = false; + if(!_device) { + _device = M2MInterfaceFactory::create_device(); + } + if(_device) { + if(_device->create_resource(resource,value)) { + success = true; + } else { + success = _device->set_resource_value(resource, value); + } + } + return success; +} + +bool M2MLWClient::create_device_object(M2MDevice::DeviceResource resource, + int64_t value, + uint16_t instance_id) +{ + bool success = false; + if(!_device) { + _device = M2MInterfaceFactory::create_device(); + } + if(_device) { + if(_device->create_resource_instance(resource,value,instance_id)) { + success = true; + } else { + success = _device->set_resource_value(resource, + value, + instance_id); + } + } + return success; +} + +bool M2MLWClient::create_firmware_object(M2MFirmware::FirmwareResource resource, + const char *value) +{ + bool success = false; + String value_string; + if(value) { + value_string += value; + } + if(!_firmware) { + _firmware = M2MInterfaceFactory::create_firmware(); + } + if(_firmware) { + if(_firmware->create_resource(resource,value_string)){ + success = true; + } else { + success = _firmware->set_resource_value(resource,value); + } + } + return success; +} + +bool M2MLWClient::create_firmware_object() +{ + bool success = false; + if(!_firmware) { + _firmware = M2MInterfaceFactory::create_firmware(); + success = true; + } + return success; +} + +bool M2MLWClient::create_firmware_object(M2MFirmware::FirmwareResource resource, + int64_t value) +{ + bool success = false; + if(!_firmware) { + _firmware = M2MInterfaceFactory::create_firmware(); + } + if(_firmware) { + if(_firmware->create_resource(resource,value)) { + success = true; + } else { + success = _firmware->set_resource_value(resource, value); + } + } + return success; +} + +bool M2MLWClient::create_firmware_object(M2MFirmware::FirmwareResource resource, + const uint8_t *value, + const uint32_t length) +{ + bool success = false; + if(!_firmware) { + _firmware = M2MInterfaceFactory::create_firmware(); + } + if(_firmware) { + success = _firmware->set_resource_value(resource, value, length); + } + return success; +} + +void M2MLWClient::set_fw_execute_function() +{ + if(_firmware) { + M2MObjectInstance *inst = _firmware->object_instance(0); + if(inst) { + M2MResource *res = inst->resource("2"); + if (res) { + res->set_execute_function(execute_callback( + this, + &M2MLWClient::fw_execute_function)); + } + } + } +} + +bool M2MLWClient::create_object(const char *name, + bool new_instance, + uint8_t object_operation, + uint8_t object_instance_operation, + uint16_t object_instance_id, + bool object_observable, + bool object_instance_observable) +{ + bool success = false; + M2MObjectInstance *inst = NULL; + if(!_object) { + _object = M2MInterfaceFactory::create_object(name); + if(_object) { + _object->set_operation(int_to_operation(object_operation)); + _object->set_observable(object_observable); + inst = _object->create_object_instance(object_instance_id); + if(inst) { + success = true; + inst->set_operation(int_to_operation(object_instance_operation)); + inst->set_observable(object_instance_observable); + } + } + } else { + if(new_instance) { + inst = _object->create_object_instance(object_instance_id); + if(inst) { + success = true; + inst->set_operation(int_to_operation(object_instance_operation)); + inst->set_observable(object_instance_observable); + } + } + } + return success; +} + +bool M2MLWClient::create_static_resource_string(const char *name, + const char *value, + bool multiple_instance, + uint16_t object_instance) +{ + bool success = false; + String name_string; + if(name) { + name_string += name; + } + String value_string; + if(value) { + value_string += value; + } + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + if(inst->create_static_resource(name,"resource", + M2MResourceInstance::STRING, + (const uint8_t*)value_string.c_str(), + value_string.size()) != NULL) { + success = true; + } + } + } + return success; +} + +bool M2MLWClient::create_static_resource_int(const char *name, + int64_t value, + bool multiple_instance, + uint16_t object_instance) +{ + bool success = false; + String name_string; + String value_string; + + if(name) { + name_string += name; + } + + char value_buffer[20]; + sprintf(value_buffer,"%ld",value); + value_string += value_buffer; + + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + if(inst->create_static_resource(name,"resource", + M2MResourceInstance::INTEGER, + (const uint8_t*)value_string.c_str(), + value_string.size()) != NULL) { + success = true; + } + } + } + return success; +} + +bool M2MLWClient::create_dynamic_resource_string(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance, + uint8_t resource_operation) +{ + bool success = false; + String name_string; + if(name) { + name_string += name; + } + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResource *res = inst->create_dynamic_resource(name,"resource", + M2MResourceInstance::STRING, + observable, multiple_instance); + if(res) { + success = true; + res->set_operation(int_to_operation(resource_operation)); + } + } + } + return success; +} + +bool M2MLWClient::create_dynamic_resource_int(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance, + uint8_t resource_operation) +{ + bool success = false; + String name_string; + if(name) { + name_string += name; + } + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResource *res = inst->create_dynamic_resource(name,"resource", + M2MResourceInstance::INTEGER, + observable, multiple_instance); + if(res) { + success = true; + res->set_operation(int_to_operation(resource_operation)); + } + } + } + return success; +} + +bool M2MLWClient::set_resource_value(const char *name, + int32_t value, + uint16_t object_instance) +{ + bool success = false; + String name_string; + String value_string; + if(name) { + name_string += name; + } + + char value_buffer[20]; + sprintf(value_buffer,"%d",value); + value_string += value_buffer; + + if(_object && name_string.length() > 0) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResource *res = inst->resource(name_string); + if (res) { + if (res->set_value((const uint8_t*)value_string.c_str(), value_string.size())) { + success = true; + } + } + } + } + return success; +} + +bool M2MLWClient::set_resource_value(const char *name, + const char *value, + uint16_t object_instance) +{ + bool success = false; + String name_string; + String value_string; + if(name) { + name_string += name; + } + if(value) { + value_string += value; + } + + if(_object && name_string.length() > 0) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResource *res = inst->resource(name_string); + if (res) { + if (res->set_value((const uint8_t*)value_string.c_str(), value_string.size())) { + success = true; + } + } + } + } + return success; +} + +bool M2MLWClient::create_static_resource_instance_string(const char *name, + const char *value, + bool multiple_instance, + uint16_t object_instance, + uint16_t resource_instance) +{ + bool success = false; + String name_string; + if(name) { + name_string += name; + } + String value_string; + if(value) { + value_string += value; + } + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + if(inst->create_static_resource_instance(name,"resource", + M2MResourceInstance::STRING, + (const uint8_t*)value_string.c_str(), + value_string.size(), + resource_instance) != NULL) { + success = true; + } + } + } + return success; +} + +bool M2MLWClient::create_static_resource_instance_int(const char *name, + int32_t value, + bool multiple_instance, + uint16_t object_instance, + uint16_t resource_instance) +{ + bool success = false; + String name_string; + String value_string; + + if(name) { + name_string += name; + } + + char value_buffer[20]; + sprintf(value_buffer,"%ld",value); + value_string += value_buffer; + + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + if(inst->create_static_resource_instance(name,"resource", + M2MResourceInstance::INTEGER, + (const uint8_t*)value_string.c_str(), + value_string.size(), + resource_instance) != NULL) { + success = true; + } + } + } + return success; +} + +bool M2MLWClient::create_dynamic_resource_instance_int(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance, + uint16_t resource_instance, + uint8_t resource_instance_operation) +{ + bool success = false; + String name_string; + if(name) { + name_string += name; + } + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResourceInstance *res = inst->create_dynamic_resource_instance(name,"resource", + M2MResourceInstance::INTEGER, + observable, + resource_instance); + if( res) { + success = true; + res->set_operation(int_to_operation(resource_instance_operation)); + } + } + } + return success; +} + +bool M2MLWClient::create_dynamic_resource_instance_string(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance, + uint16_t resource_instance, + uint8_t resource_instance_operation) +{ + bool success = false; + String name_string; + if(name) { + name_string += name; + } + if(_object) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResourceInstance *res = inst->create_dynamic_resource_instance(name,"resource", + M2MResourceInstance::STRING, + observable, + resource_instance); + if( res) { + success = true; + res->set_operation(int_to_operation(resource_instance_operation)); + } + } + } + return success; +} + +bool M2MLWClient::set_resource_instance_value(const char *name, + int32_t value, + uint16_t object_instance, + uint16_t resource_instance) +{ + bool success = false; + String name_string; + String value_string; + if(name) { + name_string += name; + } + + char value_buffer[20]; + sprintf(value_buffer,"%d",value); + value_string += value_buffer; + + if(_object && name_string.length() > 0) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResource *res = inst->resource(name_string); + if (res) { + M2MResourceInstance *res_inst = res->resource_instance(resource_instance); + if(res_inst) { + if (res_inst->set_value((const uint8_t*)value_string.c_str(), value_string.size())) { + success = true; + } + } + } + } + } + return success; +} + +bool M2MLWClient::set_resource_instance_value(const char *name, + const char *value, + uint16_t object_instance, + uint16_t resource_instance) +{ + bool success = false; + String name_string; + String value_string; + if(name) { + name_string += name; + } + if(value) { + value_string += value; + } + + if(_object && name_string.length() > 0) { + M2MObjectInstance *inst = _object->object_instance(object_instance); + if(inst) { + M2MResource *res = inst->resource(name_string); + if (res) { + M2MResourceInstance *res_inst = res->resource_instance(resource_instance); + if(res_inst) { + if (res_inst->set_value((const uint8_t*)value_string.c_str(), value_string.size())) { + success = true; + } + } + } + } + } + return success; +} + +bool M2MLWClient::test_register() +{ + bool success = false; + M2MObjectList object_list; + if(_device) { + object_list.push_back(_device); + } + if(_firmware) { + object_list.push_back(_firmware); + } + if(_object) { + object_list.push_back(_object); + } + if(_interface) { + _interface->register_object(_register_security,object_list); + success = true; + } + return success; +} + +bool M2MLWClient::test_update_register(const uint32_t lifetime) +{ + bool success = false; + if(_interface && _register_security) { + success = true; + _interface->update_registration(_register_security,lifetime); + } + return success; +} + +bool M2MLWClient::test_unregister() +{ + bool success = false; + if(_interface) { + success = true; + _interface->unregister_object(_register_security); + } + return success; +} + +void M2MLWClient::bootstrap_done(M2MSecurity *server_object) +{ + if(server_object) { + _register_security = server_object; + _bootstrapped = true; + cmd_printf("\nBootstrapped\n"); + cmd_ready( CMDLINE_RETCODE_SUCCESS ); + } +} + +void M2MLWClient::object_registered(M2MSecurity *security_object, const M2MServer &server_object) +{ + _registered = true; + cmd_printf("\nRegistered\n"); + cmd_ready( CMDLINE_RETCODE_SUCCESS ); +} + +void M2MLWClient::object_unregistered(M2MSecurity *server_object) +{ + _unregistered = true; + if(_device) { + M2MDevice::delete_instance(); + _device = NULL; + } + if(_object) { + delete _object; + _object = NULL; + } + if(_security) { + delete _security; + _security = NULL; + } + if(_register_security) { + delete _register_security; + _register_security = NULL; + } + cmd_printf("\nUnregistered\n"); + cmd_ready( CMDLINE_RETCODE_SUCCESS ); +} + +void M2MLWClient::registration_updated(M2MSecurity *security_object, + const M2MServer &server_object) +{ + _registration_updated = true; + cmd_printf("\nregistration updated\n"); + cmd_ready( CMDLINE_RETCODE_SUCCESS ); +} + +void M2MLWClient::error(M2MInterface::Error error) +{ + _error = true; + cmd_printf("\nError occured Error Code : %d\n", (int8_t)error); + cmd_ready( CMDLINE_RETCODE_SUCCESS ); +} + +void M2MLWClient::value_updated(M2MBase *base, M2MBase::BaseType type) +{ + cmd_printf("\nValue updated of Object name %s and Type \n", + base->name().c_str(), type); +} + +M2MBase::Operation M2MLWClient::int_to_operation(uint8_t operation) +{ + M2MBase::Operation op = M2MBase::NOT_ALLOWED; + switch(operation) { + case 0: + op = M2MBase::NOT_ALLOWED; + break; + case 1: + op = M2MBase::GET_ALLOWED; + break; + case 2: + op = M2MBase::PUT_ALLOWED; + break; + case 3: + op = M2MBase::GET_PUT_ALLOWED; + break; + case 4: + op = M2MBase::POST_ALLOWED; + break; + case 5: + op = M2MBase::GET_POST_ALLOWED; + break; + case 6: + op = M2MBase::PUT_POST_ALLOWED; + break; + case 7: + op = M2MBase::GET_PUT_POST_ALLOWED; + break; + case 8: + op = M2MBase::DELETE_ALLOWED; + break; + default: + break; + } + return op; +} + +void M2MLWClient::fw_execute_function(void *argument) +{ + if(argument) { + char* arguments = (char*)argument; + cmd_printf("Received %s!!\n", arguments); + } + cmd_printf("Firmware update executed\n"); +} + +void M2MLWClient::firmware_resource_int(int resource) +{ + cmd_printf("Firmware resource value int\n"); + cmd_printf("%ld\n", _firmware->resource_value_int(static_cast<M2MFirmware::FirmwareResource>(resource))); +} + +void M2MLWClient::firmware_resource_string(int resource) +{ + cmd_printf("Firmware resource value string\n"); + cmd_printf("%s\n", _firmware->resource_value_string(static_cast<M2MFirmware::FirmwareResource>(resource)).c_str()); +} + +void M2MLWClient::firmware_resource_buffer() +{ + cmd_printf("Firmware resource value buffer\n"); + uint8_t *value = 0; + uint32_t valueSize = _firmware->resource_value_buffer(M2MFirmware::Package, value); + cmd_printf("%s\n", value); + free(value); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/lwm2mtest.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <unistd.h> +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2minterface.h" +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2minterfaceobserver.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" +#include "mbed-client/m2mfirmware.h" + +class M2MLWClient: public M2MInterfaceObserver { +public: + M2MLWClient(); + + ~M2MLWClient(); + + bool create_interface(int32_t param_count, + const char *endpoint, + const char *resource_type, + const int32_t lifetime, + const uint16_t listen_port, + const char *domain, + const uint8_t binding_mode, + const uint8_t network_interface); + + bool create_bootstrap_object(const char *coap_bootstrap_address); + + bool create_register_object(const char *coap_register_address, bool useSecureConn); + + bool test_bootstrap(); + + bool create_device_object(); + + bool create_device_object(M2MDevice::DeviceResource resource, + const char *value); + + bool create_device_object(M2MDevice::DeviceResource resource, + int64_t value, + uint16_t instance_id); + + bool create_device_object(M2MDevice::DeviceResource resource, + int64_t value); + + bool create_firmware_object(); + + bool create_firmware_object(M2MFirmware::FirmwareResource resource, + const char *value); + + bool create_firmware_object(M2MFirmware::FirmwareResource resource, + int64_t value); + + bool create_firmware_object(M2MFirmware::FirmwareResource resource, + const uint8_t *value, + const uint32_t length); + + void firmware_resource_int(int resource); + void firmware_resource_string(int resource); + + void firmware_resource_buffer(); + + bool create_object(const char *name, + bool new_instance, + uint8_t object_operation, + uint8_t object_instance_operation, + uint16_t object_instance_id, + bool object_observable, + bool object_instance_observable); + + bool create_static_resource_string(const char *name, + const char *value, + bool multiple_instance, + uint16_t object_instance = 0); + + bool create_static_resource_int(const char *name, + int64_t value, + bool multiple_instance, + uint16_t object_instance = 0); + + bool create_dynamic_resource_int(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance = 0, + uint8_t resource_operation = 1); + bool create_dynamic_resource_string(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance = 0, + uint8_t resource_operation = 1); + + bool set_resource_value(const char *name, + int32_t value, + uint16_t object_instance = 0); + + bool set_resource_value(const char *name, + const char *value, + uint16_t object_instance = 0); + + bool create_static_resource_instance_string(const char *name, + const char *value, + bool multiple_instance, + uint16_t object_instance = 0, + uint16_t resource_instance = 0); + + bool create_static_resource_instance_int(const char *name, + int32_t value, + bool multiple_instance, + uint16_t object_instance = 0, + uint16_t resource_instance = 0); + + bool create_dynamic_resource_instance_int(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance = 0, + uint16_t resource_instance = 0, + uint8_t resource_instance_operation = 1); + bool create_dynamic_resource_instance_string(const char *name, + bool observable, + bool multiple_instance, + uint16_t object_instance = 0, + uint16_t resource_instance = 0, + uint8_t resource_instance_operation = 1); + + bool set_resource_instance_value(const char *name, + int32_t value, + uint16_t object_instance = 0, + uint16_t resource_instance = 0); + + bool set_resource_instance_value(const char *name, + const char *value, + uint16_t object_instance = 0, + uint16_t resource_instance = 0); + + bool create_object_instance(); + + bool test_register(); + + bool test_update_register(const uint32_t lifetime); + + bool test_unregister(); + + void bootstrap_done(M2MSecurity *server_object); + + void object_registered(M2MSecurity *security_object, const M2MServer &server_object); + + void object_unregistered(M2MSecurity *server_object); + + void registration_updated(M2MSecurity *security_object, const M2MServer &server_object); + + void error(M2MInterface::Error error); + + void value_updated(M2MBase *base, M2MBase::BaseType type); + + void set_fw_execute_function(); + +private: + + M2MBase::Operation int_to_operation(uint8_t operation); + void fw_execute_function(void *argument); + + +private: + + M2MInterface *_interface; + M2MSecurity *_security; + M2MSecurity *_register_security; + M2MDevice *_device; + M2MFirmware *_firmware; + M2MObject *_object; + bool _bootstrapped; + bool _error; + bool _registered; + bool _unregistered; + bool _registration_updated; +}; + + +const unsigned char psk[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,0x31,0x32,0x33,0x34,0x35,0x36}; +const size_t psk_len = sizeof( psk ); +const unsigned char psk_identity[] = {0x0F,0x0F}; +const size_t psk_identity_len = sizeof( psk_identity ); + +const uint8_t server_cert[] = "-----BEGIN CERTIFICATE-----\r\n" +"MIIBmDCCAT6gAwIBAgIEVUCA0jAKBggqhkjOPQQDAjBLMQswCQYDVQQGEwJGSTEN\r\n" +"MAsGA1UEBwwET3VsdTEMMAoGA1UECgwDQVJNMQwwCgYDVQQLDANJb1QxETAPBgNV\r\n" +"BAMMCEFSTSBtYmVkMB4XDTE1MDQyOTA2NTc0OFoXDTE4MDQyOTA2NTc0OFowSzEL\r\n" +"MAkGA1UEBhMCRkkxDTALBgNVBAcMBE91bHUxDDAKBgNVBAoMA0FSTTEMMAoGA1UE\r\n" +"CwwDSW9UMREwDwYDVQQDDAhBUk0gbWJlZDBZMBMGByqGSM49AgEGCCqGSM49AwEH\r\n" +"A0IABLuAyLSk0mA3awgFR5mw2RHth47tRUO44q/RdzFZnLsAsd18Esxd5LCpcT9w\r\n" +"0tvNfBv4xJxGw0wcYrPDDb8/rjujEDAOMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0E\r\n" +"AwIDSAAwRQIhAPAonEAkwixlJiyYRQQWpXtkMZax+VlEiS201BG0PpAzAiBh2RsD\r\n" +"NxLKWwf4O7D6JasGBYf9+ZLwl0iaRjTjytO+Kw==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const uint8_t cert[] = "-----BEGIN CERTIFICATE-----\r\n" +"MIICTDCCAbWgAwIBAgIJAKI3S+LGklSGMA0GCSqGSIb3DQEBCwUAMD8xCzAJBgNV\r\n" +"BAYTAkZJMRMwEQYDVQQIDApTb21lLVN0YXRlMQ0wCwYDVQQHDARPdWx1MQwwCgYD\r\n" +"VQQKDANBUk0wHhcNMTUwNjExMTI0NTU1WhcNMTYwNjEwMTI0NTU1WjA/MQswCQYD\r\n" +"VQQGEwJGSTETMBEGA1UECAwKU29tZS1TdGF0ZTENMAsGA1UEBwwET3VsdTEMMAoG\r\n" +"A1UECgwDQVJNMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBt8ag12ILm2pn\r\n" +"RHUc2yMBXpdzspDwVV3VDaNTRXypVUOq/nxJc6zr8yG/Pvga2/XVijWQDLABHVhV\r\n" +"PoeulzXVSEHRR2bR2lhqulLzdUzPYJ+yJd4+082akoxdzoom8ms2LFlgiXO7lyBg\r\n" +"1t74xjEQapCkr7Tdl2pD9OTUrcfoEwIDAQABo1AwTjAdBgNVHQ4EFgQUHK0O4iK7\r\n" +"Rv8AsxAqRDlY3TSHWtUwHwYDVR0jBBgwFoAUHK0O4iK7Rv8AsxAqRDlY3TSHWtUw\r\n" +"DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQAPVLihYN65DEeYdf7gDAdP\r\n" +"MNH5RxsQlHdktQkYWcUewe3hvOf8yZUBbmO5OeEQmy5Ca2H1QhUuw+kWHo1l/K9g\r\n" +"DpR1xoDACeycBd/6tAHfaFzTEEDC9Ug839EAHDrbI4ihrPEbP6hyRIaUIM4IojXf\r\n" +"zuqwOcobS3idv8a9Npuohw==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const uint8_t key[] = "-----BEGIN PRIVATE KEY-----\r\n" +"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMG3xqDXYgubamdE\r\n" +"dRzbIwFel3OykPBVXdUNo1NFfKlVQ6r+fElzrOvzIb8++Brb9dWKNZAMsAEdWFU+\r\n" +"h66XNdVIQdFHZtHaWGq6UvN1TM9gn7Il3j7TzZqSjF3OiibyazYsWWCJc7uXIGDW\r\n" +"3vjGMRBqkKSvtN2XakP05NStx+gTAgMBAAECgYEAlRimNxsu6jIXJh4paSk8ewxb\r\n" +"0v+n0GJT0uwpPakotofaihxOepYejIfX/IMxoDKVtmImsZUiTelRGGMFORpGomS7\r\n" +"3Pb9awfn1yWiYja9MF7+pgFtXj6LxcB5rcxrP8s9rCs+kEq8yl/khGXmlwlpacUm\r\n" +"Pdg1rEHriykk/5dlyKkCQQD9zpgQKN87bQNOVSgFSNsrwCjEN2MvVUC6ycqVYqQd\r\n" +"oQZrO2lJuf57Jn7kRKJgfqqImwLYaohn5A9gKiqszo+fAkEAw2REr8L9aLoRPe5Q\r\n" +"4+lYCmNmxJjBbJoRviSlxx+p5dxK+8H4J+bnFUWzORFJP0+Bjhii2UHGBoMjuP2s\r\n" +"e8xDDQJADm0IrZp1Hb6TeodSkAJVGsaASq7PP2h8FmHT1uvVYi293Khy0pL0yPEm\r\n" +"MzlHdW6dqMgOwFhFyonm6dNbu5i+BwJBALSPKfIKDMcEev5yBgo3Dga7iLJQPx4u\r\n" +"2gqOLyvtlME3a4tu2fV1qUG9ITuxP7DjteMr3QFLiMVn1lETCpt0TNkCQGIvyjdV\r\n" +"RzYnzLDMulXCsuRBjs0C75KoZrcPPQ416SZFtYASsOl3P0Ih5jgt/1aPmth3Yson\r\n" +"GdnBOWyKzadLmz8=\r\n" +"-----END PRIVATE KEY-----\r\n"; + +const size_t server_cert_len = sizeof( server_cert ); +const size_t cert_len = sizeof( cert ); +const size_t key_len = sizeof( key ); +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/lwm2mtestapplication/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <string.h> +#include <stdio.h> +#include <stdarg.h> + +//stack +#include "eventOS_event.h" +#include "eventOS_scheduler.h" + +//mbed-client-libservice +#include "randLIB.h" +#include "nsdynmemLIB.h" +#include "mbed-trace/mbed_trace.h" +#include "ns_cmdline.h" + + +//application +#include "cmd_commands.h" + +#define APP_DEV_HEAP_SIZE 30000 + +void eventOS_scheduler_idle(void) +{ + eventOS_scheduler_wait(); +} + +/*Global variables*/ + +uint8_t app_defined_stack_heap[APP_DEV_HEAP_SIZE]; + +void app_heap_error_handler(heap_fail_t event) +{ + switch (event) + { + case NS_DYN_MEM_NULL_FREE: + tracef(TRACE_LEVEL_ERROR, "mem", "Dyn mem error:NULL_FREE"); + break; + case NS_DYN_MEM_DOUBLE_FREE: + tracef(TRACE_LEVEL_ERROR, "mem", "Dyn mem error:DOUBLE_FREE"); + break; + + case NS_DYN_MEM_ALLOCATE_SIZE_NOT_VALID: + tracef(TRACE_LEVEL_ERROR, "mem", "Dyn mem error:SIZE_NOT_VALID"); + break; + case NS_DYN_MEM_POINTER_NOT_VALID: + tracef(TRACE_LEVEL_ERROR, "mem", "Dyn mem error:POINTER_NOT_VALID"); + break; + + case NS_DYN_MEM_HEAP_SECTOR_CORRUPTED: + tracef(TRACE_LEVEL_ERROR, "mem", "Dyn mem error:SECTOR_CORRUPTED"); + break; + + case NS_DYN_MEM_HEAP_SECTOR_UNITIALIZED: + tracef(TRACE_LEVEL_ERROR, "mem", "Dyn mem error:SECTOR_UNITIALIZED"); + break; + default: + tracef(TRACE_LEVEL_ERROR, "mem", "Dyn mem error:UNKNOWN!"); + break; + } + while(1); +} + +int app_time_i=0; +char* time_now(size_t size) +{ + static char str[10] = {0}; + sprintf(str, "[%04d]", app_time_i++); + return str; +} + +void trace_printer(const char* str) +{ + printf("%s\r\n", str); + cmd_output(); + fflush(stdout); +} +void cmd_printer(const char *str) +{ + cmd_printf("%s", str); + fflush(stdout); +} + +void custom_cmd_response_out(const char* fmt, va_list ap) +{ + vprintf(fmt, ap); + fflush(stdout); +} + +mem_stat_t memory_heap_stat; +/** + * \brief Application infinite loop. + */ +int main(void) +{ + ns_dyn_mem_init(app_defined_stack_heap, APP_DEV_HEAP_SIZE, app_heap_error_handler, &memory_heap_stat); + eventOS_scheduler_init(); + mbed_trace_init(); + mbed_trace_print_function_set( trace_printer ); + mbed_trace_cmdprint_function_set( cmd_printer ); + mbed_trace_prefix_function_set( time_now ); + mbed_trace_config_set(TRACE_MODE_COLOR|TRACE_ACTIVE_LEVEL_DEBUG|TRACE_CARRIAGE_RETURN); + cmd_init( &custom_cmd_response_out ); + + initialize_app_commands(0); + + eventOS_scheduler_run(); + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient-smokeTest/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,497 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "sockets/UDPSocket.h" +#include "EthernetInterface.h" +#include "test_env.h" +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2minterfaceobserver.h" +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2minterface.h" +#include "testconfig.h" + +// TODO: Remove when yotta supports init. +#include "lwipv4_init.h" + +// Minar for event scheduling +#include "minar/minar.h" + +using namespace mbed::util; +const String &MANUFACTURER = "ARM"; +const String &TYPE = "type"; + +static bool test_result = false; + +// Dynamic resource variables +const String &DYNAMIC_RESOURCE_NAME = "Dynamic"; +const String &DYNAMIC_RESOURCE_TYPE = "DynamicType"; +const String &STATIC_RESOURCE_NAME = "Static"; +const String &STATIC_RESOURCE_TYPE = "StaticType"; +const uint8_t STATIC_VALUE[] = "Static value"; + +//TODO: should this be configured in .json conf file, and communicated via host test to here? +int CALLBACK_TIMEOUT = 5; +int MINAR_DELAY = 10000; + +#define SUITE_TEST_INFO(test_name, info) printf("Suite-%s: %s\n", test_name, info) +#define SUITE_TEST_RESULT(test_name, result) printf("Suite-%s: result %s\n", test_name, result ? "PASSED" : "FAILED") +#define SUITE_RESULT(result) printf("Suite: result %s\n", result ? "success" : "failure") + + +class MbedClient: public M2MInterfaceObserver { +public: + MbedClient(TestConfig *test_config){ + _interface = NULL; + _register_security = NULL; + _resource_object = NULL; + _bootstrapped = false; + _error = false; + _registered = false; + _unregistered = false; + _registration_updated = false; + _resource_value = 0; + _object = NULL; + _test_config = test_config; + } + + virtual ~MbedClient() { + if(_interface) { + delete _interface; + } + if( _register_security){ + delete _register_security; + } + } + + bool create_interface() { + bool success = false; + // Creates M2MInterface using which endpoint can + // setup its name, resource type, life time, connection mode, + // Currently only LwIPv4 is supported. + _interface = M2MInterfaceFactory::create_interface( *this, + _test_config->get_endpoint_name(), + _test_config->get_endpoint_type(), + _test_config->get_lifetime(), + _test_config->get_port(), + _test_config->get_domain(), + M2MInterface::UDP, + M2MInterface::LwIP_IPv4, + ""); + if (_interface) { + success = true; + } + + return success; + } + + bool bootstrap_successful() { + return _bootstrapped; + } + + M2MSecurity* create_bootstrap_object() { + // Creates bootstrap server object with Bootstrap server address and other parameters + // required for client to connect to bootstrap server. + M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::Bootstrap); + if(security) { + security->set_resource_value(M2MSecurity::M2MServerUri, _test_config->get_bootstrap_server()); + security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity); + } + return security; + } + + void test_bootstrap(M2MSecurity *security) { + if(_interface) { + // Bootstrap function. + _interface->bootstrap(security); + } + } + + bool register_successful() { + return _registered; + } + + bool unregister_successful() { + return _unregistered; + } + + bool update_register_successful() { + return _registration_updated; + } + + void check_result(const char* result) { + if(_registered && _registration_updated && _unregistered) { + SUITE_TEST_RESULT(result, true); + test_result = true; + } else { + SUITE_TEST_RESULT(result, false); + test_result = false; + } + minar::Scheduler::stop(); + } + + M2MSecurity* create_register_object() { + // Creates server object with LWM2M server address and other parameters + // required for client to connect to LWM2M server. + M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); + if(security) { + security->set_resource_value(M2MSecurity::M2MServerUri, _test_config->get_mds_server()); + //security->set_resource_value(M2MSecurity::M2MServerUri, "ds-test.dev.mbed.com"); + security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity); + } + return security; + } + + void test_register(M2MObjectList object_list){ + if(_interface) { + // Register function + _interface->register_object(_register_security, object_list); + } + } + + void test_update_register(const uint32_t lifetime) + { + if(_interface && _register_security) { + _interface->update_registration(_register_security,lifetime); + } + } + + void test_unregister(){ + if(_interface) { + // Unregister function + _interface->unregister_object(NULL); + } + } + + void set_register_object(M2MSecurity *®ister_object){ + if(_register_security) { + delete _register_security; + _register_security = NULL; + } + _register_security = register_object; + } + + M2MDevice* create_device_object() { + M2MDevice *device = M2MInterfaceFactory::create_device(); + if (device) { + device->create_resource(M2MDevice::Manufacturer, MANUFACTURER); + device->create_resource(M2MDevice::DeviceType, TYPE); + } + return device; + } + + M2MObject* create_generic_object() { + _object = M2MInterfaceFactory::create_object("Test"); + if(_object) { + M2MObjectInstance* inst = _object->create_object_instance(); + if(inst) { + M2MResource* res = inst->create_dynamic_resource("D","ResourceTest", + M2MResourceInstance::INTEGER, + true); + char buffer[20]; + int size = sprintf(buffer,"%d",_resource_value); + res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + res->set_value((const uint8_t*)buffer, + (const uint32_t)size); + _resource_value++; + + inst->create_static_resource("S", + "ResourceTest", + M2MResourceInstance::STRING, + STATIC_VALUE, + sizeof(STATIC_VALUE)-1); + } + } + return _object; + } + + //Callback from mbed client stack when the bootstrap + // is successful, it returns the mbed Device Server object + // which will be used for registering the resources to + // mbed Device server. + void bootstrap_done(M2MSecurity *server_object){ + if(server_object) { + _bootstrapped = true; + _error = false; + } + } + + //Callback from mbed client stack when the registration + // is successful, it returns the mbed Device Server object + // to which the resources are registered and registered objects. + void object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){ + _registered = true; + } + + //Callback from mbed client stack when the registration update + // is successful, it returns the mbed Device Server object + // to which the resources are registered and registered objects. + void registration_updated(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){ + _registration_updated = true; + } + + //Callback from mbed client stack when the unregistration + // is successful, it returns the mbed Device Server object + // to which the resources were unregistered. + void object_unregistered(M2MSecurity */*server_object*/){ + _unregistered = true; + } + + //Callback from mbed client stack if any value has changed + // during PUT operation. Object and its type is passed in + // the callback. + void value_updated(M2MBase *base, M2MBase::BaseType type) { + printf("\nValue updated of Object name %s and Type %d\n", + base->name().c_str(), type); + } + + //Callback from mbed client stack if any error is encountered + // during any of the LWM2M operations. Error type is passed in + // the callback. + void error(M2MInterface::Error error){ + _error = true; + printf("\nError occured %d\n", error); + } + +private: + + M2MInterface *_interface; + M2MSecurity *_register_security; + M2MObject *_resource_object; + M2MObject *_object; + volatile bool _bootstrapped; + volatile bool _error; + volatile bool _registered; + volatile bool _unregistered; + volatile bool _registration_updated; + int _resource_value; + TestConfig *_test_config; +}; + +#define WAIT_CALLBACK(X, TIMEOUT) \ +{int _timer = 0;\ +while ( 1 ) \ + { \ + _result &= (X); \ + if (_result) { \ + SUITE_TEST_INFO(_tn, "callback done"); \ + break; \ + } \ + wait_ms(1000); _timer+=1; \ + if (_timer >= TIMEOUT) { \ + SUITE_TEST_INFO(_tn, "ERROR: callback timeout");\ + break; \ + } \ + }} + +bool test_bootStrap(TestConfig *test_config) { + bool _result = true; + const char* _tn = "TC1_bootStrap"; + + SUITE_TEST_INFO(_tn, "STARTED"); + + // Instantiate the class which implements + // mbed Client API + MbedClient *mbed_client = new MbedClient(test_config); + + SUITE_TEST_INFO(_tn, "client done"); + + // Create LWM2M Client API interface to manage bootstrap, + // register and unregister + _result &= mbed_client->create_interface(); + + // Create LWM2M bootstrap object specifying bootstrap server + // information. + M2MSecurity* security_object = mbed_client->create_bootstrap_object(); + + // Issue bootstrap command. + mbed_client->test_bootstrap(security_object); + SUITE_TEST_INFO(_tn, "bootstrap done"); + + SUITE_TEST_INFO(_tn, "waiting bootstrap callback..."); + // Wait till the bootstrap callback is called successfully. + // Callback comes in bootstrap_done() + WAIT_CALLBACK(mbed_client->bootstrap_successful(), CALLBACK_TIMEOUT); + + // Delete security object created for bootstrapping + if(security_object) { + delete security_object; + } + + if (mbed_client) { + delete mbed_client; + } + + SUITE_TEST_RESULT(_tn, _result); + return _result; +} + +void test_deviceObject(TestConfig *test_config) { + const char* _tn = "TC2_deviceObject"; + + SUITE_TEST_INFO(_tn, "STARTED"); + + // Instantiate the class which implements + // LWM2M Client API + MbedClient mbed_client(test_config);// = new MbedClient(test_config); + + SUITE_TEST_INFO(_tn, "client done"); + + // Create LWM2M Client API interface for M2M server + mbed_client.create_interface(); + + M2MSecurity *register_object = mbed_client.create_register_object(); + + mbed_client.set_register_object(register_object); + + // Create LWM2M device object specifying device resources + // as per OMA LWM2M specification. + M2MDevice* device_object = mbed_client.create_device_object(); + + // Add the device object that we want to register + // into the list and pass the list for register API. + M2MObjectList object_list; + object_list.push_back(device_object); + + // Issue register command. + + FunctionPointer1<void, M2MObjectList> tr(&mbed_client, &MbedClient::test_register); + minar::Scheduler::postCallback(tr.bind(object_list)); + + // Issue update register command. + + uint32_t lifetime = 2222; + + FunctionPointer1<void, uint32_t> ur(&mbed_client, &MbedClient::test_update_register); + minar::Scheduler::postCallback(ur.bind(lifetime)).delay(MINAR_DELAY); + + // Issue unregister command. + + FunctionPointer0<void> tur(&mbed_client, &MbedClient::test_unregister); + minar::Scheduler::postCallback(tur.bind()).delay(MINAR_DELAY*2); + + FunctionPointer1<void, const char*> cus(&mbed_client, &MbedClient::check_result); + minar::Scheduler::postCallback(cus.bind(_tn)).delay(MINAR_DELAY*3); + + minar::Scheduler::start(); + + // Delete device object created for registering device + // resources. + + if(device_object) { + M2MDevice::delete_instance(); + } +} + +bool test_resource(TestConfig *test_config) { + bool _result = true; + const char* _tn = "TC3_resource"; + SUITE_TEST_INFO(_tn, "STARTED"); + + // Instantiate the class which implements LWM2M Client API + MbedClient mbed_client(test_config); + SUITE_TEST_INFO(_tn, "client done"); + + // Create LWM2M Client API interface for M2M server + _result &= mbed_client.create_interface(); + + M2MSecurity *register_object = mbed_client.create_register_object(); + + mbed_client.set_register_object(register_object); + + // Create LWM2M device object specifying device resources + // as per OMA LWM2M specification. + M2MDevice* device_object = mbed_client.create_device_object(); + + // Create LWM2M generic object for resource + M2MObject* resource_object = mbed_client.create_generic_object(); + + // Add the device object that we want to register + // into the list and pass the list for register API. + M2MObjectList object_list; + object_list.push_back(device_object); + object_list.push_back(resource_object); + + // Issue register command. + + FunctionPointer1<void, M2MObjectList> tr(&mbed_client, &MbedClient::test_register); + minar::Scheduler::postCallback(tr.bind(object_list)); + + // Issue update register command. + + uint32_t lifetime = 2222; + + FunctionPointer1<void, uint32_t> ur(&mbed_client, &MbedClient::test_update_register); + minar::Scheduler::postCallback(ur.bind(lifetime)).delay(MINAR_DELAY); + + // Issue unregister command. + + FunctionPointer0<void> tur(&mbed_client, &MbedClient::test_unregister); + minar::Scheduler::postCallback(tur.bind()).delay(MINAR_DELAY*2); + + FunctionPointer1<void, const char*> cus(&mbed_client, &MbedClient::check_result); + minar::Scheduler::postCallback(cus.bind(_tn)).delay(MINAR_DELAY*3); + + minar::Scheduler::start(); + + // Delete device object created for registering device resources. + if(device_object) { + M2MDevice::delete_instance(); + } + + // Delete resource object for registering resources. + if(resource_object) { + delete resource_object; + } +} + + + +void app_start(int /*argc*/, char* /*argv*/[]) { + DigitalOut _led = DigitalOut(LED3); + _led = 1; + + MBED_HOSTTEST_TIMEOUT(40); + MBED_HOSTTEST_SELECT(mbed_client_auto); + MBED_HOSTTEST_DESCRIPTION(LWM2MClient Smoke Test); + MBED_HOSTTEST_START("LWM2MClientSmokeTest"); + + // This sets up the network interface configuration which will be used + // by LWM2M Client API to communicate with mbed Device server. + EthernetInterface eth; + eth.init(); //Use DHCP + eth.connect(); + + lwipv4_socket_init(); + + // Create test config object, and setup with unique MAC address + TestConfig test_config; + test_config.setup(); + + _led = 0; + + // Bootstrap test is uncommented, until it will be supported. + //result &= test_bootStrap(&test_config); + test_deviceObject(&test_config); + test_resource(&test_config); + + _led = 1; + + // Disconnect and teardown the network interface + eth.disconnect(); + + SUITE_RESULT(test_result); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient-smokeTest/security.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,115 @@ + + +/* + + * Copyright (c) 2015 ARM Limited. All rights reserved. + + * SPDX-License-Identifier: Apache-2.0 + + * 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 + + * 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. + + */ + +#ifndef __SECURITY_H__ + +#define __SECURITY_H__ + + + +#include <inttypes.h> + + + +#define MBED_DOMAIN "eeforester" + +#define MBED_ENDPOINT_NAME "a3e4593c-4e03-492a-9e32-320550fe442e" + + + +const unsigned char PSK[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,0x31,0x32,0x33,0x34,0x35,0x36}; + +const unsigned char PSK_IDENTITY[] = {0x0F,0x0F}; + + + +const uint8_t SERVER_CERT[] = "-----BEGIN CERTIFICATE-----\r\n" + +"MIIBmDCCAT6gAwIBAgIEVUCA0jAKBggqhkjOPQQDAjBLMQswCQYDVQQGEwJGSTEN\r\n" + +"MAsGA1UEBwwET3VsdTEMMAoGA1UECgwDQVJNMQwwCgYDVQQLDANJb1QxETAPBgNV\r\n" + +"BAMMCEFSTSBtYmVkMB4XDTE1MDQyOTA2NTc0OFoXDTE4MDQyOTA2NTc0OFowSzEL\r\n" + +"MAkGA1UEBhMCRkkxDTALBgNVBAcMBE91bHUxDDAKBgNVBAoMA0FSTTEMMAoGA1UE\r\n" + +"CwwDSW9UMREwDwYDVQQDDAhBUk0gbWJlZDBZMBMGByqGSM49AgEGCCqGSM49AwEH\r\n" + +"A0IABLuAyLSk0mA3awgFR5mw2RHth47tRUO44q/RdzFZnLsAsd18Esxd5LCpcT9w\r\n" + +"0tvNfBv4xJxGw0wcYrPDDb8/rjujEDAOMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0E\r\n" + +"AwIDSAAwRQIhAPAonEAkwixlJiyYRQQWpXtkMZax+VlEiS201BG0PpAzAiBh2RsD\r\n" + +"NxLKWwf4O7D6JasGBYf9+ZLwl0iaRjTjytO+Kw==\r\n" + +"-----END CERTIFICATE-----\r\n"; + + + +const uint8_t CERT[] = "-----BEGIN CERTIFICATE-----\r\n" + +"MIIBjDCCATCgAwIBAgIEFGtTOzAMBggqhkjOPQQDAgUAMBAxDjAMBgNVBAMTBW5z\r\n" + +"cDAxMB4XDTE1MDkwMjE0MjE0MVoXDTE2MDkwMTE0MjE0MVowgYcxODA2BgNVBAMT\r\n" + +"L2EzZTQ1OTNjLTRlMDMtNDkyYS05ZTMyLTMyMDU1MGZlNDQyZS9lZWZvcmVzdGVy\r\n" + +"MQwwCgYDVQQLEwNBUk0xEjAQBgNVBAoTCW1iZWQgdXNlcjENMAsGA1UEBxMET3Vs\r\n" + +"dTENMAsGA1UECBMET3VsdTELMAkGA1UEBhMCRkkwWTATBgcqhkjOPQIBBggqhkjO\r\n" + +"PQMBBwNCAAQuxHp1a1V8pCVziDMhuuSt5zbrduEe+0y+UXuPMj2k6uoEuVCYI4+k\r\n" + +"JU6WSfVYAFSVVka0JhIMKB289xU2G5+EMAwGCCqGSM49BAMCBQADSAAwRQIgeWQK\r\n" + +"su17hcY+fQxY8H8BgrGy0z+RKJr51WZl2LR9ZSwCIQDKPx9LYzwSw8y1hugpcsc/\r\n" + +"ul5++FNrYwLE44l3pW87yw==\r\n" + +"-----END CERTIFICATE-----\r\n"; + + + +const uint8_t KEY[] = "-----BEGIN PRIVATE KEY-----\r\n" + +"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9RFcAVbOKG1LbIF8\r\n" + +"kNqA8dznz4wnD+B/ghYNQMHtL/qhRANCAAQuxHp1a1V8pCVziDMhuuSt5zbrduEe\r\n" + +"+0y+UXuPMj2k6uoEuVCYI4+kJU6WSfVYAFSVVka0JhIMKB289xU2G5+E\r\n" + +"-----END PRIVATE KEY-----\r\n"; + + + +#endif //__SECURITY_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient-smokeTest/testconfig.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include <stdio.h> +#include "mbed-client/m2mstring.h" +#include "testconfig.h" +#include "security.h" + +TestConfig::TestConfig() { } + +TestConfig::~TestConfig() { } + +/*void TestConfig::set_endpoint_name(const char *name) { + _endpointName = m2m::String("lwm2mtest-"); + _endpointName += name; + + printf("MBED: endpoint=%s", _endpointName.c_str()); +}*/ + +void TestConfig::setup() { + _bootstrapAddress = m2m::String("dummy"); + _mdsAddress = m2m::String("coap://ds-test.dev.mbed.com:5683"); + _endpointName = m2m::String(MBED_ENDPOINT_NAME); + _endpointType = m2m::String("test2"); + _domain = m2m::String(MBED_DOMAIN); + _port = 5683; + _lifetime = 2222; + + printf("MBED: test configuration \n"); + printf("mds_server=%s\n", _mdsAddress.c_str()); + printf("endpoint name=%s\n", _endpointName.c_str()); + printf("endpoint type=%s\n", _endpointType.c_str()); + printf("domain=%s\n", _domain.c_str()); + printf("port=%d\n", _port); + printf("lifetime=%d\n\n", _lifetime); +} + +m2m::String& TestConfig::get_domain() { + return _domain; +} + +m2m::String& TestConfig::get_bootstrap_server() { + return _bootstrapAddress; +} + +m2m::String& TestConfig::get_mds_server() { + return _mdsAddress; +} + +m2m::String& TestConfig::get_endpoint_name() { + return _endpointName; +} + +m2m::String& TestConfig::get_endpoint_type() { + return _endpointType; +} + +int TestConfig::get_port() { + //return _port++; + return _port; +} + +int TestConfig::get_lifetime() { + return _lifetime; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient-smokeTest/testconfig.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef TESTCONFIG_H_ +#define TESTCONFIG_H_ + +class TestConfig { + +public: + + TestConfig(); + ~TestConfig(); + + void setup(); + void set_endpoint_name(const char *name); + + m2m::String& get_domain(); + m2m::String& get_bootstrap_server(); + m2m::String& get_mds_server(); + m2m::String& get_endpoint_name(); + m2m::String& get_endpoint_type(); + int get_port(); + int get_lifetime(); + +private: + + int _port; + int _lifetime; + m2m::String _domain; + m2m::String _endpointName; + m2m::String _endpointType; + m2m::String _bootstrapAddress; + m2m::String _mdsAddress; + +}; + +#endif /* TESTCONFIG_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/CThunk.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,202 @@ +/* General C++ Object Thunking class + * + * - allows direct callbacks to non-static C++ class functions + * - keeps track for the corresponding class instance + * - supports an optional context parameter for the called function + * - ideally suited for class object receiving interrupts (NVIC_SetVector) + * + * Copyright (c) 2014-2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __CTHUNK_H__ +#define __CTHUNK_H__ + +#define CTHUNK_ADDRESS 1 + +#if defined(__CORTEX_M3) || defined(__CORTEX_M4) || defined(__thumb2__) +#define CTHUNK_VARIABLES volatile uint32_t code[1] +/** +* CTHUNK disassembly for Cortex-M3/M4 (thumb2): +* * ldm.w pc,{r0,r1,r2,pc} +* +* This instruction loads the arguments for the static thunking function to r0-r2, and +* branches to that function by loading its address into PC. +* +* This is safe for both regular calling and interrupt calling, since it only touches scratch registers +* which should be saved by the caller, and are automatically saved as part of the IRQ context switch. +*/ +#define CTHUNK_ASSIGMENT m_thunk.code[0] = 0x8007E89F + +#elif defined(__CORTEX_M0PLUS) || defined(__CORTEX_M0) +/* +* CTHUNK disassembly for Cortex M0 (thumb): +* * push {r0,r1,r2,r3,r4,lr} save touched registers and return address +* * movs r4,#4 set up address to load arguments from (immediately following this code block) (1) +* * add r4,pc set up address to load arguments from (immediately following this code block) (2) +* * ldm r4!,{r0,r1,r2,r3} load arguments for static thunk function +* * blx r3 call static thunk function +* * pop {r0,r1,r2,r3,r4,pc} restore scratch registers and return from function +*/ +#define CTHUNK_VARIABLES volatile uint32_t code[3] +#define CTHUNK_ASSIGMENT do { \ + m_thunk.code[0] = 0x2404B51F; \ + m_thunk.code[1] = 0xCC0F447C; \ + m_thunk.code[2] = 0xBD1F4798; \ + } while (0) + +#else +#error "Target is not currently suported." +#endif + +/* IRQ/Exception compatible thunk entry function */ +typedef void (*CThunkEntry)(void); + +template<class T> +class CThunk +{ + public: + typedef void (T::*CCallbackSimple)(void); + typedef void (T::*CCallback)(void* context); + + inline CThunk(T *instance) + { + init(instance, NULL, NULL); + } + + inline CThunk(T *instance, CCallback cb) + { + init(instance, cb, NULL); + } + + ~CThunk() { + + } + + inline CThunk(T *instance, CCallbackSimple cb) + { + init(instance, (CCallback)cb, NULL); + } + + inline CThunk(T &instance, CCallback cb) + { + init(instance, cb, NULL); + } + + inline CThunk(T &instance, CCallbackSimple cb) + { + init(instance, (CCallback)cb, NULL); + } + + inline CThunk(T &instance, CCallback cb, void* ctx) + { + init(instance, cb, ctx); + } + + inline void callback(CCallback cb) + { + m_callback = cb; + } + + inline void callback(CCallbackSimple cb) + { + m_callback = (CCallback)cb; + } + + inline void context(void* ctx) + { + m_thunk.context = (uint32_t)ctx; + } + + inline void context(uint32_t ctx) + { + m_thunk.context = ctx; + } + + inline uint32_t entry(void) + { + return (((uint32_t)&m_thunk)|CTHUNK_ADDRESS); + } + + /* get thunk entry point for connecting rhunk to an IRQ table */ + inline operator CThunkEntry(void) + { + return (CThunkEntry)entry(); + } + + /* get thunk entry point for connecting rhunk to an IRQ table */ + inline operator uint32_t(void) + { + return entry(); + } + + /* simple test function */ + inline void call(void) + { + (((CThunkEntry)(entry()))()); + } + + private: + T* m_instance; + volatile CCallback m_callback; + +// TODO: this needs proper fix, to refactor toolchain header file and all its use +// PACKED there is not defined properly for IAR +#if defined (__ICCARM__) + typedef __packed struct + { + CTHUNK_VARIABLES; + volatile uint32_t instance; + volatile uint32_t context; + volatile uint32_t callback; + volatile uint32_t trampoline; + } CThunkTrampoline; +#else + typedef struct + { + CTHUNK_VARIABLES; + volatile uint32_t instance; + volatile uint32_t context; + volatile uint32_t callback; + volatile uint32_t trampoline; + } __attribute__((__packed__)) CThunkTrampoline; +#endif + + static void trampoline(T* instance, void* ctx, CCallback* cb) + { + if(instance && *cb) { + (static_cast<T*>(instance)->**cb)(ctx); + } + } + + volatile CThunkTrampoline m_thunk; + + inline void init(T *instance, CCallback cb, void* ctx) + { + /* remember callback - need to add this level of redirection + as pointer size for member functions differs between platforms */ + m_callback = cb; + + /* populate thunking trampoline */ +// CTHUNK_ASSIGMENT; +// m_thunk.context = (uint32_t)ctx; +// m_thunk.instance = (uint32_t)instance; +// m_thunk.callback = (uint32_t)&m_callback; +// m_thunk.trampoline = (uint32_t)&trampoline; + +// __ISB(); +// __DSB(); + } +}; + +#endif/*__CTHUNK_H__*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/FunctionPointer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,604 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef MBED_FUNCTIONPOINTER_H +#define MBED_FUNCTIONPOINTER_H + +#include <string.h> +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> +#include <new> +#include "FunctionPointerBase.h" +#include "FunctionPointerBind.h" + +namespace mbed { +/** A class for storing and calling a pointer to a static or member void function without arguments + */ +template <typename R> +class FunctionPointer0 : public FunctionPointerBase<R>{ +public: + typedef R(*static_fp)(void); + typedef struct arg_struct{ + } ArgStruct; + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer0(static_fp function = 0): + FunctionPointerBase<R>() + { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer0(T *object, R (T::*member)(void)): + FunctionPointerBase<R>() + { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer0::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(void)) { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(void)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer0::membercaller<T>; + } + + /** Call the attached static or member function + */ + R call(){ + return FunctionPointerBase<R>::call(NULL); + } + + FunctionPointerBind<R> bind() { + FunctionPointerBind<R> fp; + fp.bind(&FunctionPointerBase<R>::_nullops, (ArgStruct *) NULL, this); + return fp; + } + + static_fp get_function()const { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(void) { + return call(); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + (void) arg; + T* o = static_cast<T*>(object); + R (T::**m)(void) = reinterpret_cast<R (T::**)(void)>(member); + return (o->**m)(); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + (void) arg; + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(); + } +}; + +/* If we had variaditic templates, this wouldn't be a problem, but until C++11 is enabled, we are stuck with multiple classes... */ + +/** A class for storing and calling a pointer to a static or member void function with one argument + */ +template <typename R, typename A1> +class FunctionPointer1 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + arg_struct(const A1 *b1) { + a1 = *b1; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer1(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer1(T *object, R (T::*member)(A1)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer1::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer1::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1) { + FunctionPointerBind<R> fp; + fp.bind(&_fp1_ops, (ArgStruct *) NULL, this, &a1); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1) + { + ArgStruct Args(&a1); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a) { + return call(a); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1) = reinterpret_cast<R (T::**)(A1)>(member); + return (o->**m)(Args->a1); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1); + } +/* static void constructor(void * dest, va_list args) { + new(dest) ArgStruct(va_arg(args,A1*)); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp1_ops; +}; + +template <typename R, typename A1> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer1<R,A1>::_fp1_ops = { + FunctionPointer1<R,A1>::constructor, + FunctionPointer1<R,A1>::copy_constructor, + FunctionPointer1<R,A1>::destructor +}; + + +/** A class for storing and calling a pointer to a static or member void function with two arguments + */ +template <typename R, typename A1, typename A2> +class FunctionPointer2 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + A2 a2; + arg_struct(const A1 *b1, const A2 *b2) { + a1 = *b1; + a2 = *b2; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1, A2); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer2(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer2(T *object, R (T::*member)(A1, A2)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer2::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer2::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1, const A2 &a2) { + FunctionPointerBind<R> fp; + fp.bind(&_fp2_ops, (ArgStruct *) NULL, this, &a1, &a2); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1, A2 a2) + { + ArgStruct Args(&a1, &a2); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a1, A2 a2) { + return call(a1, a2); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2) = reinterpret_cast<R (T::**)(A1, A2)>(member); + return (o->**m)(Args->a1, Args->a2); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1, Args->a2); + } +/* static void constructor(void * dest, va_list args) { + A1 *a1 = va_arg(args, A1*); + A2 *a2 = va_arg(args, A2*); + new(dest) ArgStruct(a1, a2); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1), &(src_args->a2)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp2_ops; +}; + +template <typename R, typename A1, typename A2> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer2<R,A1,A2>::_fp2_ops = { + FunctionPointer2<R,A1,A2>::constructor, + FunctionPointer2<R,A1,A2>::copy_constructor, + FunctionPointer2<R,A1,A2>::destructor +}; + +/** A class for storing and calling a pointer to a static or member void function with three arguments + */ +template <typename R, typename A1, typename A2, typename A3> +class FunctionPointer3 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + A2 a2; + A3 a3; + arg_struct(const A1 *b1, const A2 *b2, const A3* b3) { + a1 = *b1; + a2 = *b2; + a3 = *b3; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1, A2, A3); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer3(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer3(T *object, R (T::*member)(A1, A2, A3)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer3::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2, A3)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2, A3)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer3::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1, const A2 &a2, const A3 &a3) { + FunctionPointerBind<R> fp; + fp.bind(&_fp3_ops, (ArgStruct *) NULL, this, &a1, &a2, &a3); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1, A2 a2, A3 a3) + { + ArgStruct Args(&a1, &a2, &a3); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a1, A2 a2, A3 a3) { + return call(a1, a2, a3); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2, A3) = reinterpret_cast<R (T::**)(A1, A2, A3)>(member); + return (o->**m)(Args->a1, Args->a2, Args->a3); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1, Args->a2, Args->a3); + } +/* static void constructor(void * dest, va_list args) { + A1 *a1 = va_arg(args, A1*); + A2 *a2 = va_arg(args, A2*); + A3 *a3 = va_arg(args, A3*); + new(dest) ArgStruct(a1, a2, a3); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1), &(src_args->a2), &(src_args->a3)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp3_ops; +}; + +template <typename R, typename A1, typename A2, typename A3> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer3<R,A1,A2,A3>::_fp3_ops = { + FunctionPointer3<R,A1,A2,A3>::constructor, + FunctionPointer3<R,A1,A2,A3>::copy_constructor, + FunctionPointer3<R,A1,A2,A3>::destructor +}; + +/** A class for storing and calling a pointer to a static or member void function with four arguments + */ +template <typename R, typename A1, typename A2, typename A3, typename A4> +class FunctionPointer4 : public FunctionPointerBase<R> { +protected: + typedef struct arg_struct{ + A1 a1; + A2 a2; + A3 a3; + A4 a4; + arg_struct(const A1 *b1, const A2 *b2, const A3* b3, const A4* b4) { + a1 = *b1; + a2 = *b2; + a3 = *b3; + a4 = *b4; + } + } ArgStruct; + +public: + typedef R(*static_fp)(A1, A2, A3, A4); + /** Create a FunctionPointer, attaching a static function + * + * @param function The void static function to attach (default is none) + */ + FunctionPointer4(static_fp function = 0) { + attach(function); + } + + /** Create a FunctionPointer, attaching a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + FunctionPointer4(T *object, R (T::*member)(A1, A2, A3, A4)) { + attach(object, member); + } + + /** Attach a static function + * + * @param function The void static function to attach (default is none) + */ + void attach(static_fp function) { + FunctionPointerBase<R>::_object = reinterpret_cast<void*>(function); + FunctionPointerBase<R>::_membercaller = &FunctionPointer4::staticcaller; + } + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ + template<typename T> + void attach(T *object, R (T::*member)(A1, A2, A3, A4)) + { + FunctionPointerBase<R>::_object = static_cast<void*>(object); + *reinterpret_cast<R (T::**)(A1, A2, A3, A4)>(FunctionPointerBase<R>::_member) = member; + FunctionPointerBase<R>::_membercaller = &FunctionPointer4::membercaller<T>; + } + + FunctionPointerBind<R> bind(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) { + FunctionPointerBind<R> fp; + fp.bind(&_fp4_ops, (ArgStruct *) NULL, this, &a1, &a2, &a3, &a4); + return fp; + } + + + /** Call the attached static or member function + */ + R call(A1 a1, A2 a2, A3 a3, A4 a4) + { + ArgStruct Args(&a1, &a2, &a3, &a4); + return FunctionPointerBase<R>::call(&Args); + } + + static_fp get_function()const + { + return reinterpret_cast<static_fp>(FunctionPointerBase<R>::_object); + } + + R operator ()(A1 a1, A2 a2, A3 a3, A4 a4) { + return call(a1, a2, a3, a4); + } + +private: + template<typename T> + static R membercaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + T* o = static_cast<T*>(object); + R (T::**m)(A1, A2, A3, A4) = reinterpret_cast<R (T::**)(A1, A2, A3, A4)>(member); + return (o->**m)(Args->a1, Args->a2, Args->a3, Args->a4); + } + static R staticcaller(void *object, uintptr_t *member, void *arg) { + ArgStruct *Args = static_cast<ArgStruct *>(arg); + (void) member; + static_fp f = reinterpret_cast<static_fp>(object); + return f(Args->a1, Args->a2, Args->a3, Args->a4); + } +/* static void constructor(void * dest, va_list args) { + A1 *a1 = va_arg(args, A1*); + A2 *a2 = va_arg(args, A2*); + A3 *a3 = va_arg(args, A3*); + A4 *a4 = va_arg(args, A4*); + new(dest) ArgStruct(a1, a2, a3, a4); + } + static void copy_constructor(void *dest , void* src) { + ArgStruct *src_args = static_cast<ArgStruct *>(src); + new(dest) ArgStruct(&(src_args->a1), &(src_args->a2), &(src_args->a3), &(src_args->a4)); + } + static void destructor(void *args) { + ArgStruct *argstruct = static_cast<ArgStruct *>(args); + argstruct->~arg_struct(); + } +*/ +protected: + static const struct FunctionPointerBase<R>::ArgOps _fp4_ops; +}; + +template <typename R, typename A1, typename A2, typename A3, typename A4> +const struct FunctionPointerBase<R>::ArgOps FunctionPointer4<R,A1,A2,A3,A4>::_fp4_ops = { + FunctionPointer4<R,A1,A2,A3,A4>::constructor, + FunctionPointer4<R,A1,A2,A3,A4>::copy_constructor, + FunctionPointer4<R,A1,A2,A3,A4>::destructor +}; + +typedef FunctionPointer0<void> FunctionPointer; +//typedef FunctionPointer1<void, int> event_callback_t; + +} // namespace mbed + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/FunctionPointerBase.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* mbed Microcontroller Library + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef MBED_FUNCTIONPOINTERBASE_H +#define MBED_FUNCTIONPOINTERBASE_H + +#include <string.h> +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> +namespace mbed { + +template<typename R> +class FunctionPointerBase { +public: + operator bool(void) const { + return (_membercaller != NULL) && (_object != NULL); + } + + /** + * Clears the current function pointer assignment + * After clear(), this instance will point to nothing (NULL) + */ + virtual void clear() { + _membercaller = NULL; + _object = NULL; + } + +protected: + struct ArgOps { + void (*constructor)(void *, va_list); + void (*copy_args)(void *, void *); + void (*destructor)(void *); + }; + void * _object; // object Pointer/function pointer + R (*_membercaller)(void *, uintptr_t *, void *); + // aligned raw member function pointer storage - converted back by registered _membercaller + uintptr_t _member[4]; + static const struct ArgOps _nullops; + +protected: + FunctionPointerBase():_object(NULL), _membercaller(NULL) {} + FunctionPointerBase(const FunctionPointerBase<R> & fp) { + copy(&fp); + } + virtual ~FunctionPointerBase() { + } + + /** + * Calls the member pointed to by object::member or (function)object + * @param arg + * @return + */ + inline R call(void* arg) { + return _membercaller(_object, _member, arg); + } + + void copy(const FunctionPointerBase<R> * fp) { + _object = fp->_object; + memcpy (_member, fp->_member, sizeof(_member)); + _membercaller = fp->_membercaller; + } +private: + static void _null_constructor(void * dest, va_list args) {(void) dest;(void) args;} + static void _null_copy_args(void *dest , void* src) {(void) dest; (void) src;} + static void _null_destructor(void *args) {(void) args;} + +}; +template<typename R> +const struct FunctionPointerBase<R>::ArgOps FunctionPointerBase<R>::_nullops = { + FunctionPointerBase<R>::_null_constructor, + FunctionPointerBase<R>::_null_copy_args, + FunctionPointerBase<R>::_null_destructor +}; + +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/FunctionPointerBind.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,112 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * 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 + * 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. + */ + +#ifndef MBED_FUNCTIONPOINTERBIND_H__ +#define MBED_FUNCTIONPOINTERBIND_H__ + +#include <string.h> +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> +#include <assert.h> +#include "FunctionPointerBase.h" + +#ifndef EVENT_STORAGE_SIZE +#define EVENT_STORAGE_SIZE 32 +#endif + +#define MBED_STATIC_ASSERT(MBED_STATIC_ASSERT_FAILED,MSG)\ + switch(0){\ + case 0:case (MBED_STATIC_ASSERT_FAILED): \ + break;} + +namespace mbed{ + +template<typename R> +class FunctionPointerBind : public FunctionPointerBase<R> { +public: + // Call the Event + inline R call() { + return FunctionPointerBase<R>::call(static_cast<void *>(_storage)); + } + FunctionPointerBind(): + FunctionPointerBase<R>(), + _ops(&FunctionPointerBase<R>::_nullops) + {} + + FunctionPointerBind(const FunctionPointerBind<R> & fp): + FunctionPointerBase<R>(), + _ops(&FunctionPointerBase<R>::_nullops) { + *this = fp; + } + + virtual ~FunctionPointerBind() { + _ops->destructor(_storage); + } + + FunctionPointerBind<R> & operator=(const FunctionPointerBind<R>& rhs) { + if (_ops != &FunctionPointerBase<R>::_nullops) { + _ops->destructor(_storage); + } + FunctionPointerBase<R>::copy(&rhs); + _ops = rhs._ops; + _ops->copy_args(_storage, (void *)rhs._storage); + return *this; + } + + /** + * Clears the current binding, making this instance unbound + */ + virtual void clear() { + if (_ops != &FunctionPointerBase<R>::_nullops) { + _ops->destructor(_storage); + } + _ops = &FunctionPointerBase<R>::_nullops; + FunctionPointerBase<R>::clear(); + } + + template<typename S> + FunctionPointerBind<R> & bind(const struct FunctionPointerBase<R>::ArgOps * ops , S * argStruct, FunctionPointerBase<R> *fp, ...) { + MBED_STATIC_ASSERT(sizeof(S) <= sizeof(_storage), ERROR: Arguments too large for FunctionPointerBind internal storage) + if (_ops != &FunctionPointerBase<R>::_nullops) { + _ops->destructor(_storage); + } + _ops = ops; + FunctionPointerBase<R>::copy(fp); + assert(this->_ops != NULL); + assert(this->_ops->constructor != NULL); + if (argStruct) { + this->_ops->copy_args(this->_storage, (void *)argStruct); + } else { + va_list args; + va_start(args, fp); + this->_ops->constructor(_storage, args); + va_end(args); + } + return *this; + } + + R operator()() { + return call(); + } + +protected: + const struct FunctionPointerBase<R>::ArgOps * _ops; + uint32_t _storage[(EVENT_STORAGE_SIZE+sizeof(uint32_t)-1)/sizeof(uint32_t)]; +}; +} + +#endif // MBED_FUNCTIONPOINTERBIND_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/Ticker.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TICKER_H +#define TICKER_H + +namespace mbed +{ +typedef uint64_t timestamp_t; + + class Ticker{ + public : + Ticker() {} + ~Ticker(){} + + // Ticker + template<typename T> + void attach_us(T* tptr, void (T::*mptr)(void), timestamp_t){} + + void detach(); + }; +} + +#endif // TICKER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/mbed-net-socket-abstract/socket_api.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,164 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__ +#define __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__ + +#include <stdint.h> +#include "socket_types.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SOCKET_MAX_STACKS +#define SOCKET_MAX_STACKS 2 +#endif + +typedef socket_error_t (*socket_init)(); +typedef socket_error_t (*socket_create)(struct socket *socket, + const socket_address_family_t af, const socket_proto_family_t pf, + socket_api_handler_t const handler); +typedef socket_error_t (*socket_destroy)(struct socket *socket); +typedef socket_error_t (*socket_close)(struct socket *socket); +typedef socket_api_handler_t (*socket_periodic_task)(const struct socket * socket); +typedef uint32_t (*socket_periodic_interval)(const struct socket * socket); +typedef socket_error_t (*socket_resolve)(struct socket *socket, const char *address); +typedef socket_error_t (*socket_connect)(struct socket *sock, const struct socket_addr *address, const uint16_t port); +typedef socket_error_t (*socket_bind)(struct socket *socket, const struct socket_addr *address, const uint16_t port); +typedef socket_error_t (*socket_str2addr)(const struct socket *socket, struct socket_addr *addr, const char *address); +typedef socket_error_t (*socket_start_listen)(struct socket *socket, const uint32_t backlog); +typedef socket_error_t (*socket_stop_listen)(struct socket *socket); +typedef socket_error_t (*socket_accept)(struct socket *sock, socket_api_handler_t handler); +typedef socket_error_t (*socket_reject)(struct socket *sock); +typedef socket_error_t (*socket_send)(struct socket *socket, const void * buf, const size_t len); +typedef socket_error_t (*socket_send_to)(struct socket *socket, const void * buf, const size_t len, const struct socket_addr *addr, const uint16_t port); +typedef socket_error_t (*socket_recv)(struct socket *socket, void * buf, size_t *len); +typedef socket_error_t (*socket_recv_from)(struct socket *socket, void * buf, size_t *len, struct socket_addr *addr, uint16_t *port); + +typedef socket_error_t (*socket_get_local_addr)(const struct socket *socket, struct socket_addr *addr); +typedef socket_error_t (*socket_get_remote_addr)(const struct socket *socket, struct socket_addr *addr); +typedef socket_error_t (*socket_get_local_port)(const struct socket *socket, uint16_t *port); +typedef socket_error_t (*socket_get_remote_port)(const struct socket *socket, uint16_t *port); + +typedef uint8_t (*socket_is_connected)(const struct socket *socket); +typedef uint8_t (*socket_is_bound)(const struct socket *socket); + +struct socket_api { + socket_stack_t stack; + uint32_t version; + socket_init init; + socket_create create; + socket_destroy destroy; + socket_close close; + socket_periodic_task periodic_task; + socket_periodic_interval periodic_interval; + socket_resolve resolve; + socket_connect connect; + socket_str2addr str2addr; + socket_bind bind; + socket_start_listen start_listen; + socket_stop_listen stop_listen; + socket_accept accept; + socket_reject reject; + socket_send send; + socket_send_to send_to; + socket_recv recv; + socket_recv_from recv_from; + socket_is_connected is_connected; + socket_is_bound is_bound; + socket_get_local_addr get_local_addr; + socket_get_remote_addr get_remote_addr; + socket_get_local_port get_local_port; + socket_get_remote_port get_remote_port; +}; +#define SOCKET_API_FIRST_PTR init +#define SOCKET_API_LAST_PTR get_remote_port + +socket_error_t socket_register_stack(const struct socket_api * api); +const char * socket_strerror(const socket_error_t err); +const struct socket_api * socket_get_api(const socket_stack_t stack); + +static inline int socket_addr_is_ipv4(const struct socket_addr *addr) +{ + if ((addr->ipv6be[0] == 0) && + (addr->ipv6be[1] == 0) && + (addr->ipv6be[2] == 0)) { + return 1; + } else { + return 0; + } +} +static inline int socket_addr_is_any(const struct socket_addr *addr) +{ + if ((addr->ipv6be[0] == 0) && + (addr->ipv6be[1] == 0) && + (addr->ipv6be[2] == 0) && + (addr->ipv6be[3] == 0)) { + return 1; + } else { + return 0; + } +} +static inline void socket_addr_set_ipv4_addr(struct socket_addr *addr, uint32_t ipv4addr) +{ + addr->ipv6be[0] = 0; + addr->ipv6be[1] = 0; + addr->ipv6be[2] = 0; + addr->ipv6be[3] = ipv4addr; +} +static inline uint32_t socket_addr_get_ipv4_addr(const struct socket_addr *addr) +{ + if (!socket_addr_is_ipv4(addr)) { + return 0; + } + return addr->ipv6be[3]; +} +static inline const uint32_t * socket_addr_get_ipv4_addrp(const struct socket_addr *addr) +{ + if (!socket_addr_is_ipv4(addr)) { + return NULL; + } + return &addr->ipv6be[3]; +} +static inline void socket_addr_set_any(struct socket_addr *addr) +{ + addr->ipv6be[0] = 0; + addr->ipv6be[1] = 0; + addr->ipv6be[2] = 0; + addr->ipv6be[3] = 0; +} + +static inline void socket_addr_copy(struct socket_addr *dest, const struct socket_addr *src) +{ + (dest)->ipv6be[0] = (src)->ipv6be[0]; + (dest)->ipv6be[1] = (src)->ipv6be[1]; + (dest)->ipv6be[2] = (src)->ipv6be[2]; + (dest)->ipv6be[3] = (src)->ipv6be[3]; +} +static inline int socket_addr_cmp(const struct socket_addr *a, const struct socket_addr *b) +{ + return + a->ipv6be[0] != b->ipv6be[0] || + a->ipv6be[1] != b->ipv6be[1] || + a->ipv6be[2] != b->ipv6be[2] || + a->ipv6be[3] != b->ipv6be[3]; +} + +#ifdef __cplusplus +} +#endif + +#endif /* __MBED_NET_SOCKET_ABSTRACT_SOCKET_API_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/mbed-net-socket-abstract/socket_types.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,181 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKET_ABSTRACT_SOCKET_TYPES_H__ +#define __MBED_NET_SOCKET_ABSTRACT_SOCKET_TYPES_H__ + +#include <stddef.h> +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MBED_NET_LWIP +#define MBED_NET_LWIP 1 +#endif + +typedef enum { + SOCKET_ERROR_NONE = 0, + SOCKET_ERROR_UNKNOWN, + SOCKET_ERROR_UNIMPLEMENTED, + SOCKET_ERROR_BUSY, + SOCKET_ERROR_NULL_PTR, + SOCKET_ERROR_BAD_FAMILY, + SOCKET_ERROR_TIMEOUT, + SOCKET_ERROR_BAD_ALLOC, + SOCKET_ERROR_NO_CONNECTION, + SOCKET_ERROR_SIZE, + SOCKET_ERROR_STACK_EXISTS, + SOCKET_ERROR_STACKS, + SOCKET_ERROR_BAD_STACK, + SOCKET_ERROR_BAD_ADDRESS, + SOCKET_ERROR_DNS_FAILED, + SOCKET_ERROR_WOULD_BLOCK, + SOCKET_ERROR_CLOSED, + SOCKET_ERROR_VALUE, + SOCKET_ERROR_ADDRESS_IN_USE, + SOCKET_ERROR_ALREADY_CONNECTED, + SOCKET_ERROR_ABORT, + SOCKET_ERROR_RESET, + SOCKET_ERROR_BAD_ARGUMENT, + SOCKET_ERROR_INTERFACE_ERROR, + SOCKET_ERROR_API_VERSION, + SOCKET_ERROR_NOT_BOUND, + +} socket_error_t; + +typedef enum { + SOCKET_ALLOC_HEAP = 0, + SOCKET_ALLOC_POOL_BEST, +} socket_alloc_pool_t; + +typedef enum { + SOCKET_AF_UNINIT, + SOCKET_AF_INET4, + SOCKET_AF_INET6, + SOCKET_AF_MAX, +} socket_address_family_t; + +typedef enum { + SOCKET_PROTO_UNINIT = 0, + SOCKET_DGRAM, + SOCKET_STREAM, + SOCKET_PROTO_MAX, +} socket_proto_family_t; + +typedef enum { + SOCKET_EVENT_NONE = 0, + SOCKET_EVENT_ERROR, + SOCKET_EVENT_RX_DONE, + SOCKET_EVENT_TX_DONE, + SOCKET_EVENT_RX_ERROR, + SOCKET_EVENT_TX_ERROR, + SOCKET_EVENT_CONNECT, + SOCKET_EVENT_DISCONNECT, + SOCKET_EVENT_DNS, + SOCKET_EVENT_ACCEPT, +} event_flag_t; + +typedef enum { + SOCKET_STATUS_IDLE = 0, + SOCKET_STATUS_RX_BUSY = 1 << 0, + SOCKET_STATUS_TX_BUSY = 1 << 1, + SOCKET_STATUS_CONNECTED = 1 << 2, + SOCKET_STATUS_BOUND = 1 << 3, +} socket_status_t; + +typedef enum { + SOCKET_STACK_UNINIT = 0, + SOCKET_STACK_LWIP_IPV4, + SOCKET_STACK_LWIP_IPV6, + SOCKET_STACK_RESERVED, + SOCKET_STACK_NANOSTACK_IPV6, + SOCKET_STACK_PICOTCP, + SOCKET_STACK_MAX, +} socket_stack_t; + +typedef enum { + SOCKET_BUFFER_UNINITIALISED = 0, + SOCKET_BUFFER_RAW, + SOCKET_BUFFER_LWIP_PBUF, + SOCKET_BUFFER_NANOSTACK_PBUF, +} socket_buffer_type_t; + +struct socket_addr { + uint32_t ipv6be[4]; +}; + +struct socket_buffer { + socket_buffer_type_t type; + const struct socket_buf_api *api; + void *impl; +}; + +struct socket_rawbuf { + void * buf; + size_t size; + size_t pos; +}; + +typedef void (*socket_api_handler_t)(void); +typedef struct { + void * (*alloc)(void *,const size_t); + void (*dealloc)(void *, void *); + void *context; +} socket_allocator_t; + +struct socket_tx_info { + uint16_t sentbytes; +}; + +struct socket_dns_info { + struct socket_addr addr; // A stack-specific socket address struct + const char *domain; +}; + +struct socket_accept_info { + void * newimpl; + uint8_t reject; +}; + +struct socket_event { + event_flag_t event; + struct socket *sock; + union { + struct socket_tx_info t; + socket_error_t e; + struct socket_dns_info d; + struct socket_accept_info a; + } i; +}; +typedef struct socket_event socket_event_t; + +struct socket { + socket_api_handler_t handler; + socket_event_t *event; // TODO: (CThunk upgrade/Alpha3) + const struct socket_api *api; + void *impl; + socket_status_t status; + uint8_t family; + socket_stack_t stack; + void *rxBufChain; // TODO: Only required in some stacks, which do not support BSD-style buffering +}; + +#ifdef __cplusplus +} +#endif +#endif /* __MBED_NET_SOCKET_ABSTRACT_SOCKET_TYPES_H__ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/mbed.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef MBED_H +#define MBED_H + +#include <cstdio> +#include <cstring> + +#endif // MBED_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/Socket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_SOCKET_H__ +#define __MBED_NET_SOCKETS_SOCKET_H__ + +/* Include all versions of the API */ +#include "v0/Socket.h" + +/* Set the current namespace */ +namespace mbed { + namespace Sockets { + namespace current { + using namespace mbed::Sockets::v0; + } + } +} + +#endif // __MBED_NET_SOCKETS_SOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/SocketAddr.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_SOCKETADDR_H__ +#define __MBED_NET_SOCKETS_SOCKETADDR_H__ + +/* Include all versions of the API */ +#include "v0/SocketAddr.h" + +/* Set the current namespace */ +namespace mbed { + namespace Sockets { + namespace current { + using namespace mbed::Sockets::v0; + } + } +} + +#endif // __MBED_NET_SOCKETS_SOCKETADDR_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/UDPSocket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_UDPSOCKET_H__ +#define __MBED_NET_SOCKETS_UDPSOCKET_H__ + +/* Include all versions of the API */ +#include "v0/UDPSocket.h" + +/* Set the current namespace */ +namespace mbed { + namespace Sockets { + namespace current { + using namespace mbed::Sockets::v0; + } + } +} + +#endif // __MBED_NET_SOCKETS_UDPSOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/v0/Socket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,268 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_SOCKET_H__ +#define __MBED_NET_SOCKETS_V0_SOCKET_H__ + + +#include <stddef.h> +#include <stdint.h> +#include "mbed.h" +#include "FunctionPointer.h" +#include "CThunk.h" +#include "mbed-net-socket-abstract/socket_types.h" +#include "SocketAddr.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +/** + * \brief Socket implements most of the interfaces required for sockets. + * Socket is a pure virtual class; it should never be instantiated directly, but it provides + * common functionality for derived classes. + */ +class Socket { +public: + typedef FunctionPointer3<void, Socket *, struct socket_addr, const char *> DNSHandler_t; + typedef FunctionPointer2<void, Socket *, socket_error_t> ErrorHandler_t; + typedef FunctionPointer1<void, Socket *> ReadableHandler_t; + typedef FunctionPointer2<void, Socket *, uint16_t> SentHandler_t; +protected: + /** + * Socket constructor + * Initializes the Socket object. Initializes the underlying struct socket. Does not instantiate + * an underlying network stack socket. + * Since it is somewhat awkward to provide the network stack, a future change will provide + * a way to pass the network interface to the socket constructor, which will extract the stack from + * the interface. + * @param[in] stack The network stack to use for this socket. + */ + Socket(const socket_stack_t stack); + /** + * Socket destructor + * Frees the underlying socket implementation. + */ + virtual ~Socket(); +public: + /** + * Start the process of resolving a domain name. + * If the input is a text IP address, an event is queued immediately; otherwise, onDNS is + * queued as soon as DNS is resolved. + * The socket must have been opened before resolve is called + * @param[in] address The domain name to resolve + * @param[in] onDNS The handler to call when the name is resolved + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t resolve(const char* address, const DNSHandler_t &onDNS); + /** + * Open the socket. + * Instantiates and initializes the underlying socket. Receive is started immediately after + * the socket is opened. + * @param[in] af Address family (SOCKET_AF_INET4 or SOCKET_AF_INET6), currently only IPv4 is supported + * @param[in] pf Protocol family (SOCKET_DGRAM or SOCKET_STREAM) + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t open(const socket_address_family_t af, const socket_proto_family_t pf); + /** + * Binds the socket's local address and IP. + * 0.0.0.0 is accepted as a local address if only the port is meant to be bound. + * The behaviour of bind("0.0.0.0",...) is undefined where two or more stacks are in use. + * + * @param[in] address The string representation of the address to bind + * @param[in] port The local port to bind + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t bind(const char *address, const uint16_t port); + /** + * bind(const SocketAddr *, const uint16_t) is the same as bind(const char *, const uint16_t), + * except that the address passed in is a SocketAddr. + * @param[in] address The address to bind + * @param[in] port The local port to bind + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t bind(const SocketAddr *address, const uint16_t port); + /** + * Set the error handler. + * Errors are ignored if onError is not set. + * @param[in] onError + */ + virtual void setOnError(const ErrorHandler_t &onError); + /** + * Set the received data handler + * Received data is queued until it is read using recv or recv_from. + * @param[in] onReadable the handler to use for receive events + */ + virtual void setOnReadable(const ReadableHandler_t &onReadable); + /** + * Receive a message + * @param[out] buf The buffer to fill + * @param[in,out] len A pointer to the size of the receive buffer. Sets the maximum number of bytes + * to read but is updated with the actual number of bytes copied on success. len is not changed on + * failure + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t recv(void * buf, size_t *len); + /** + * Receive a message with the sender address and port + * This API is not valid for SOCK_STREAM + * @param[out] buf The buffer to fill + * @param[in,out] len A pointer to the size of the receive buffer. Sets the maximum number of bytes + * to read but is updated with the actual number of bytes copied on success. len is not changed on + * failure + * @param[out] remote_addr Pointer to an address structure to fill with the sender address + * @param[out] remote_port Pointer to a uint16_t to fill with the sender port + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t recv_from(void * buf, size_t *len, SocketAddr *remote_addr, uint16_t *remote_port); + /** + * Set the onSent handler. + * The exact moment this handler is called varies from implementation to implementation. + * On LwIP, onSent is called when the remote host ACK's data in TCP sockets, or when the message enters + * the network stack in UDP sockets. + * @param[in] onSent The handler to call when a send completes + */ + virtual void setOnSent(const SentHandler_t &onSent); + /** + * Send a message + * Sends a message over an open connection. This call is valid for UDP sockets, provided that connect() + * has been called. + * @param[in] buf The payload to send + * @param[in] len The size of the payload + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t send(const void * buf, const size_t len); + /** + * Send a message to a specific address and port + * This API is not valid for SOCK_STREAM + * @param[in] buf The payload to send + * @param[in] len The size of the payload + * @param[in] address The address to send to + * @param[in] port The remote port to send to + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t send_to(const void * buf, const size_t len, const SocketAddr *remote_addr, uint16_t remote_port); + /** + * Shuts down a socket. + * Sending and receiving are no longer possible after close() is called. + * The socket is not deallocated on close. A socket must not be reopened, it should be + * destroyed (either with delete, or by going out of scope) after calling close. + * Calling open on a closed socket can result in a memory leak. + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t close(); + /** + * Error checking utility + * Generates an event on error, does nothing on SOCKET_ERROR_NONE + * @param[in] err the error code to check + * @return false if err is SOCKET_ERROR_NONE, true otherwise + */ + virtual bool error_check(socket_error_t err); + + /** + * Checks the socket status to determine whether it is still connected. + * @return true if the socket is connected, false if it is not + */ + virtual bool isConnected() const; + + /** + * Get the local address of the socket if bound. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been bound, returns SOCKET_ERROR_NOT_BOUND + * 3. If addr is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the SocketAddr object with the local address + * + * @param[out] addr a pointer to a SocketAddr object + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getLocalAddr(SocketAddr *addr) const; + + /** + * Get the local port of the socket if bound. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been bound, returns SOCKET_ERROR_NOT_BOUND + * 3. If port is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the uint16_t object with the local port + * + * @param[out] port a pointer to a uint16_t + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getLocalPort(uint16_t *port) const; + + /** + * Get the remote address of the socket if connected. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been connected, returns SOCKET_ERROR_NO_CONNECTION + * 3. If addr is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the SocketAddr object with the remote address + * + * @param[out] addr a pointer to a SocketAddr object + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getRemoteAddr(SocketAddr *addr) const; + /** + * Get the remote port of the socket if connected. + * There are several failing conditions for this method: + * 1. If the socket has not been opened, returns SOCKET_ERROR_NULL_PTR + * 2. If the socket has not been connected, returns SOCKET_ERROR_NO_CONNECTION + * 3. If port is NULL, returns SOCKET_ERROR_NULL_PTR + * + * Otherwise, populates the uint16_t object with the remote port + * + * @param[out] port a pointer to a uint16_t + * @return SOCKET_ERROR_NONE on success, or an error code on failure (see description) + */ + virtual socket_error_t getRemotePort(uint16_t *port) const; + +#if 0 // not implemented yet + static long ntohl(long); + static short ntohs(short); + static long long ntohll(long long); +#endif + +protected: + /** + * The internal event handler + * @param[in] ev The event to handle + */ + virtual void _eventHandler(struct socket_event *ev); + +protected: + DNSHandler_t _onDNS; + ErrorHandler_t _onError; + ReadableHandler_t _onReadable; + SentHandler_t _onSent; + + CThunk<Socket> _irq; + struct socket _socket; +private: + socket_event_t *_event; + /** + * Internal event handler. + * @param[in] arg + */ + void _nvEventHandler(void * arg); +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_SOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/v0/SocketAddr.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,43 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_SOCKETADDR_H__ +#define __MBED_NET_SOCKETS_V0_SOCKETADDR_H__ + +#include "mbed-net-socket-abstract/socket_types.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +class SocketAddr { +public: + struct socket_addr * getAddr() {return &_addr;} + const struct socket_addr * getAddr() const {return &_addr;} + void setAddr(const struct socket_addr *addr); + void setAddr(const SocketAddr *addr); + size_t getAddrSize() const {return sizeof(_addr.ipv6be);} + bool is_v4(); + + int fmtIPv4(char *buf, size_t size); + int fmtIPv6(char *buf, size_t size); +protected: + struct socket_addr _addr; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_SOCKETADDR_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/v0/TCPAsynch.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,47 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_TCP_ASYNCH__ +#define __MBED_NET_SOCKETS_V0_TCP_ASYNCH__ + +#include "Socket.h" +#include "mbed-net-socket-abstract/socket_api.h" + +#include "Ticker.h" + +namespace mbed { +namespace Sockets { +namespace v0 { +class TCPAsynch: public Socket { +protected: + TCPAsynch(const socket_stack_t stack); + ~TCPAsynch(); + +public: + virtual socket_error_t open(const socket_address_family_t af); +protected: + static Ticker _ticker; + static FunctionPointer0<void> _tick_handler; + // uintptr_t is used to guarantee that there will always be a large enough + // counter to avoid overflows. Memory allocation will always fail before + // counter overflow if the counter is the same size as the pointer type and + // sizeof(TCPAsynch) > 0 + static uintptr_t _TCPSockets; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_TCP_ASYNCH__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/v0/TCPListener.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,86 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_TCPLISTENER_H__ +#define __MBED_NET_SOCKETS_V0_TCPLISTENER_H__ + +#include <stddef.h> +#include <stdint.h> +#include "mbed/FunctionPointer.h" +#include "TCPAsynch.h" +#include "TCPStream.h" + +namespace mbed { +namespace Sockets { +namespace v0 { +/** \brief TCPListener: a TCP server socket + * The TCPListener listens for incoming connections. Prior to listening, the + * TCPListener must be bound to a port and, optionally, an address. + */ +class TCPListener: public TCPAsynch { +public: + typedef FunctionPointer2<void, TCPListener *, void *> IncomingHandler_t; + /** + * The TCP Listener constructor. + * @param[in] stack the network stack to use + */ + TCPListener(const socket_stack_t stack); + + /** + * The TCP Listener destructor + * This performs teardown of the listener + */ + ~TCPListener(); + + /** + * Begin listening for incoming connections. + * The supplied listenHandler will be called whenever an incoming connection arrives + * To reject a connection, the event handler needs to set the reject flag in the event. + * @param[in] listenHandler The event handler to call when an incoming connection arrives + * @param[in] backlog The number of connection requests to keep in the backlog + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t start_listening(IncomingHandler_t listenHandler, uint32_t backlog = 0); + /** + * Stop listening for incoming connections + * After this call, the server will reject incoming connections until start_listening is called again + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t stop_listening(); + + /** + * accept is a utility function for constructing a new TCPStream from an incoming connection + * The event passed to the listenHandler contains a pointer to a low level implementation of an + * already connected socket. This function + * @param new_impl + * @return + */ + virtual TCPStream * accept(void *new_impl); + virtual void reject(void *new_impl); + +protected: + /** + * Internal event handler + * @param[in] ev the event to handle + */ + void _eventHandler(struct socket_event *ev); + + IncomingHandler_t _onIncoming; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_TCPLISTENER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/v0/TCPStream.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_TCPSTREAM_H__ +#define __MBED_NET_SOCKETS_V0_TCPSTREAM_H__ +#include <stddef.h> +#include <stdint.h> +#include "Ticker.h" +#include "TCPAsynch.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +class TCPStream: public TCPAsynch { +public: + typedef FunctionPointer1<void, TCPStream *> ConnectHandler_t; + typedef FunctionPointer1<void, TCPStream *> DisconnectHandler_t; + /** + * TCP socket constructor. + * Does not allocate an underlying TCP Socket instance. + * @param[in] stack The network stack to use for this socket. + */ + TCPStream(const socket_stack_t stack); + /** + * TCP socket constructor. + * Does not allocate an underlying TCP Socket instance. This version is for use with + * TCPListener::accept(). The struct socket instance passed into this constructor should + * be a fully initialized socket, with an initialized impl field. TCPStream will copy + * the stack, API, protocol family, and impl pointer from sock. + * @param[in] sock The TCP socket instance to use for this TCP socket. + */ + TCPStream(const struct socket * sock); + /** + * TCP socket destructor + */ + ~TCPStream(); + /** + * Connect to a remote host. + * Initates the TCP Connection process. onConnect is called when the connection + * is acknowledged. + * @param[in] address The remote host to connect to + * @param[in] port The remote port to connect to + * @param[in] onConnect + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + virtual socket_error_t connect(const SocketAddr &address, const uint16_t port, + const ConnectHandler_t &onConnect); + /** + * Set a disconnect handler + * This handler only needs to be configured once onConnect has been called + * @param[in] h the handler to call when a connection is disconnected + */ + virtual void setOnDisconnect(const DisconnectHandler_t &h) { _onDisconnect = h; } + +protected: + /** + * Internal event handler + * @param[in] ev the event to handle + */ + void _eventHandler(struct socket_event *ev); + +protected: + ConnectHandler_t _onConnect; + DisconnectHandler_t _onDisconnect; +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_TCPSTREAM_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/common/sockets/v0/UDPSocket.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,64 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * 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 + * 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. + */ +#ifndef __MBED_NET_SOCKETS_V0_UDPSOCKET_H__ +#define __MBED_NET_SOCKETS_V0_UDPSOCKET_H__ + +#include <stddef.h> +#include <stdint.h> +#include "Socket.h" + +namespace mbed { +namespace Sockets { +namespace v0 { + +/* UDP socket class */ +class UDPSocket: public Socket { +public: + /** + * UDP socket constructor. + * Does not allocate an underlying UDP Socket instance. + * @param[in] stack The network stack to use for this socket. + */ + UDPSocket(socket_stack_t stack); + /** + * UDP Socket destructor + */ + ~UDPSocket(); + /** + * Open a UDP socket + * Instantiates and initializes the underlying socket. Receive is started immediately after + * the socket is opened. + * @param[in] af Address family (SOCKET_AF_INET4 or SOCKET_AF_INET6), currently only IPv4 is supported + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t inline open(const socket_address_family_t af) + { + return Socket::open(af,SOCKET_DGRAM); + } + /** + * Connect to a remote host. + * This is an internal configuration API only. No network traffic is generated. + * @param[in] address The remote host to connect to + * @param[in] port The remote port to connect to + * @return SOCKET_ERROR_NONE on success, or an error code on failure + */ + socket_error_t connect(const SocketAddr *address, const uint16_t port); +}; +} // namespace v0 +} // namespace Sockets +} // namespace mbed +#endif // __MBED_NET_SOCKETS_V0_UDPSOCKET_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/includes.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,17 @@ +if(TARGET_LIKE_LINUX) +include_directories( + "../common" + "../stub" + "../../../../mbed-client" + "../../../../source" + "../../../../source/include" + "../../../../yotta_modules/mbed-client-mbedtls" + "../../../../yotta_modules/mbedtls/include" + "../../../../yotta_modules/mbed-client-linux/mbed-client-linux" + "../../../../yotta_modules/mbed-client-mbed-os" + "../../../../yotta_modules/mbed-client-c" + "usr/include" + "$ENV{CPPUTEST_HOME}/include" +) +SET(UTEST_LINK_FLAGS "-fprofile-arcs") +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mbase/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mbase + "../../../../source/m2mbase.cpp" + "main.cpp" + "../stub/m2mreporthandler_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mresource_stub.cpp" + "m2mbasetest.cpp" + "test_m2mbase.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mbase + CppUTest + CppUTestExt +) +set_target_properties(m2mbase +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mbase") +add_test(m2mbase ${binary}) + + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mbase/m2mbasetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mbase.h" + +TEST_GROUP(M2MBase) +{ + Test_M2MBase* m2m_base; + Handler *obsHandler; + void setup() { + // Path ownership moved to m2mbase + char* path = (char*)malloc(5); + strcpy(path, "test"); + + obsHandler = new Handler(); + m2m_base = new Test_M2MBase(path, obsHandler); + } + + void teardown() { + delete m2m_base; + delete obsHandler; + } +}; + +TEST(M2MBase, Create) +{ + CHECK(m2m_base != NULL); +} + +TEST(M2MBase, set_operation) +{ + m2m_base->test_set_operation(); +} + +TEST(M2MBase, test_set_base_type) +{ + m2m_base->test_set_base_type(); +} + +TEST(M2MBase, set_interface_description) +{ + m2m_base->test_set_interface_description(); +} + +TEST(M2MBase, uri_path) +{ + m2m_base->test_uri_path(); +} + +TEST(M2MBase, set_resource_type) +{ + m2m_base->test_set_resource_type(); +} + +TEST(M2MBase, set_coap_content_type) +{ + m2m_base->test_set_coap_content_type(); +} + +TEST(M2MBase, set_instance_id) +{ + m2m_base->test_set_instance_id(); +} + +TEST(M2MBase, observation_number) +{ + m2m_base->test_observation_number(); +} + +TEST(M2MBase, mode) +{ + m2m_base->test_mode(); +} + +TEST(M2MBase, observation_token) +{ + m2m_base->test_get_observation_token(); +} + +TEST(M2MBase, observation_level) +{ + m2m_base->test_observation_level(); +} + +TEST(M2MBase, set_observation_token) +{ + m2m_base->test_set_observation_token(); +} + +TEST(M2MBase, set_under_observation) +{ + m2m_base->test_set_under_observation(); +} + +TEST(M2MBase, set_observable) +{ + m2m_base->test_set_observable(); +} + +TEST(M2MBase, add_observation_level) +{ + m2m_base->test_add_observation_level(); +} + +TEST(M2MBase, remove_observation_level) +{ + m2m_base->test_remove_observation_level(); +} + +TEST(M2MBase, name) +{ + m2m_base->test_name(); +} + +TEST(M2MBase, name_id) +{ + m2m_base->test_name_id(); +} + +TEST(M2MBase, test_handle_observation_attribute) +{ + m2m_base->test_handle_observation_attribute(); +} + +TEST(M2MBase, test_observation_to_be_sent) +{ + m2m_base->test_observation_to_be_sent(); +} + +TEST(M2MBase, test_handle_get_request) +{ + m2m_base->test_handle_get_request(); +} + +TEST(M2MBase, test_handle_put_request) +{ + m2m_base->test_handle_put_request(); +} + +TEST(M2MBase, test_handle_post_request) +{ + m2m_base->test_handle_post_request(); +} + +TEST(M2MBase, test_memory_alloc) +{ + m2m_base->test_memory_alloc(); +} + +TEST(M2MBase, test_memory_free) +{ + m2m_base->test_memory_free(); +} + +TEST(M2MBase, test_report_handler) +{ + m2m_base->test_report_handler(); +} + +TEST(M2MBase, test_observation_handler) +{ + m2m_base->test_observation_handler(); +} + +TEST(M2MBase, test_id_number) +{ + m2m_base->test_id_number(); +} + +TEST(M2MBase, test_set_register_uri) +{ + m2m_base->test_set_register_uri(); +} + +TEST(M2MBase, test_set_observation_number) +{ + m2m_base->test_set_observation_number(); +} + +TEST(M2MBase, test_set_max_age) +{ + m2m_base->test_set_max_age(); +} + +TEST(M2MBase, test_is_under_observation) +{ + m2m_base->test_is_under_observation(); +} + +TEST(M2MBase, test_value_updated_function) +{ + m2m_base->test_value_updated_function(); +} + +TEST(M2MBase, test_build_path) +{ + m2m_base->test_build_path(); +} + +TEST(M2MBase, test_set_observation_handler) +{ + m2m_base->test_set_observation_handler(); +} + +TEST(M2MBase, test_resource_type) +{ + m2m_base->test_resource_type(); +} + +TEST(M2MBase, test_resource_name_length) +{ + m2m_base->test_resource_name_length(); +} + +TEST(M2MBase, test_get_nsdl_resource) +{ + m2m_base->test_get_nsdl_resource(); +} + +TEST(M2MBase, test_create_path) +{ + m2m_base->test_create_path(); +} + +TEST(M2MBase, test_create_report_handler) +{ + m2m_base->test_create_report_handler(); +} + +TEST(M2MBase, test_validate_string_length) +{ + m2m_base->test_validate_string_length(); +} + +TEST(M2MBase, test_is_integer) +{ + m2m_base->test_is_integer(); +} + +TEST(M2MBase, test_alloc_string_copy) +{ + m2m_base->test_alloc_string_copy(); +} + +TEST(M2MBase, test_alloc_copy) +{ + m2m_base->test_alloc_copy(); +} + +TEST(M2MBase, test_ctor) +{ + m2m_base->test_ctor(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mbase/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MBase);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mbase/test_m2mbase.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,554 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mbase.h" + +#include "m2mreportobserver.h" +#include "m2mreporthandler.h" +#include "m2mreporthandler_stub.h" +#include "nsdlaccesshelper_stub.h" +#include "m2mresource_stub.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" + +static bool value_update_called = false; +static void value_updated_function(const char* name) { + value_update_called = true; +} + +class MyTest{ +public: + void value_updated_function(const char* name) { + visited = true; + } + + bool visited; +}; + + +class Observer : public M2MReportObserver { +public: + Observer(){} + ~Observer(){} + + void observation_to_be_sent(m2m::Vector<uint16_t>,bool){} +}; + +Test_M2MBase::Test_M2MBase(char* path, Handler *handler) + : M2MBase("name",M2MBase::Dynamic, "type", path, false) + +{ + obsHandler = handler; +} + +Test_M2MBase::~Test_M2MBase() +{ +} + +void Test_M2MBase::test_set_operation() +{ + this->_sn_resource->dynamic_resource_params->static_resource_parameters->mode = M2MBase::Static; + M2MBase::Operation test = M2MBase::GET_ALLOWED; + set_operation(test); + + CHECK(test == this->operation()); + + this->_sn_resource->dynamic_resource_params->static_resource_parameters->mode = M2MBase::Dynamic; + test = M2MBase::PUT_ALLOWED; + set_operation(test); + + CHECK(test == this->operation()); +} + +void Test_M2MBase::test_set_base_type() +{ + set_base_type(M2MBase::ObjectInstance); + CHECK(M2MBase::ObjectInstance == this->base_type()); +} + +void Test_M2MBase::test_set_interface_description() +{ + String test = "interface_description"; + set_interface_description(test); + + CHECK(test == this->interface_description()); +} + +void Test_M2MBase::test_uri_path() +{ + // Default value in ctor + String test = "test"; + CHECK(test == uri_path()); +} + +void Test_M2MBase::test_set_resource_type() +{ + String test = "resource_type"; + set_resource_type(test); + + CHECK(test == this->_sn_resource->dynamic_resource_params->static_resource_parameters->resource_type_ptr); +} + +void Test_M2MBase::test_set_coap_content_type() +{ + u_int8_t test = 1; + set_coap_content_type(test); + + CHECK(test == this->coap_content_type()); +} + +void Test_M2MBase::test_set_instance_id() +{ + u_int16_t test = 1; + set_instance_id(test); + + CHECK(test == this->instance_id()); +} + +void Test_M2MBase::test_set_observable() +{ + bool test = true; + set_observable(test); + + CHECK(test == this->is_observable()); +} + +void Test_M2MBase::test_add_observation_level() +{ + add_observation_level(M2MBase::R_Attribute); + CHECK(M2MBase::R_Attribute == this->_observation_level); + + add_observation_level(M2MBase::O_Attribute); + CHECK(M2MBase::OR_Attribute == this->_observation_level); +} + +void Test_M2MBase::test_remove_observation_level() +{ + this->_observation_level = M2MBase::OR_Attribute; + remove_observation_level(M2MBase::R_Attribute); + CHECK(M2MBase::O_Attribute == this->_observation_level); + + remove_observation_level(M2MBase::O_Attribute); + CHECK(M2MBase::None == this->_observation_level); + + this->_observation_level = M2MBase::OI_Attribute; + remove_observation_level(M2MBase::R_Attribute); + CHECK(M2MBase::OI_Attribute == this->_observation_level); + + remove_observation_level(M2MBase::OI_Attribute); + CHECK(M2MBase::None == this->_observation_level); + remove_observation_level(M2MBase::OI_Attribute); + CHECK(M2MBase::None == this->_observation_level); +} + +void Test_M2MBase::test_set_under_observation() +{ + this->set_base_type(M2MBase::ObjectInstance); + + bool test = true; + set_under_observation(test,NULL); + set_under_observation(test,obsHandler); + + CHECK(obsHandler == this->_observation_handler); + + set_under_observation(test,NULL); + + test = false; + set_under_observation(test,NULL); + + test = false; + set_under_observation(test,obsHandler); + + set_under_observation(test,obsHandler); +} + +void Test_M2MBase::test_set_observation_token() +{ + this->_token_length = 4; + this->_token = (u_int8_t *)malloc(this->_token_length); + String test = "token"; + set_observation_token((const u_int8_t*)test.c_str(), (u_int8_t)test.size()); + + CHECK(this->_token_length == 5); +} + +void Test_M2MBase::test_observation_level() +{ + this->_observation_level = M2MBase::OR_Attribute; + CHECK(M2MBase::OR_Attribute == this->observation_level()); +} + +void Test_M2MBase::test_get_observation_token() +{ + u_int8_t test_value[] = {"val"}; + u_int32_t value_length((u_int32_t)sizeof(test_value)); + + u_int8_t* out_value = (u_int8_t *)malloc(value_length); + u_int32_t out_size = value_length; + memcpy((u_int8_t *)out_value, (u_int8_t *)test_value, value_length); + + u_int8_t test[] = {"token"}; + this->_token_length = (u_int8_t)sizeof(test); + this->_token = (u_int8_t *)malloc(this->_token_length); + memcpy((u_int8_t *)this->_token, (u_int8_t *)test, this->_token_length); + + get_observation_token(out_value,out_size); + + CHECK(out_size == 6); + + free(out_value); +} + +void Test_M2MBase::test_mode() +{ + CHECK(M2MBase::Dynamic == mode()); +} + +void Test_M2MBase::test_observation_number() +{ + u_int8_t test = 1; + this->_observation_number = test; + + CHECK(test == observation_number()); +} + +void Test_M2MBase::test_name() +{ + // Default value in ctor + String test = "name"; + CHECK(test == name()); +} + +void Test_M2MBase::test_name_id() +{ + int id = 10; + this->_sn_resource->name_id = id; + CHECK(id == name_id()); +} + +void Test_M2MBase::test_handle_observation_attribute() +{ + char *s = "wrong"; + bool ret = handle_observation_attribute(s); + CHECK(ret == false); + delete this->_report_handler; + + Observer obs; + this->_report_handler = new M2MReportHandler(obs); + + m2mreporthandler_stub::bool_return = true; + ret = handle_observation_attribute(s); + CHECK(ret == true); + + this->_is_under_observation = true; + ret = handle_observation_attribute(s); + CHECK(ret == true); + + this->_is_under_observation = true; + m2mreporthandler_stub::bool_return = false; + ret = handle_observation_attribute(s); + CHECK(ret == false); +} + +void Test_M2MBase::test_observation_to_be_sent() +{ + Vector<uint16_t> list; + observation_to_be_sent(list); + CHECK(obsHandler->visited == false); + this->set_base_type(M2MBase::ObjectInstance); + + bool test = true; + set_under_observation(test,obsHandler); + observation_to_be_sent(list); + CHECK(obsHandler->visited == true); +} + +void Test_M2MBase::test_handle_get_request() +{ + CHECK(this->handle_get_request(NULL,NULL,NULL) == NULL); +} + +void Test_M2MBase::test_handle_put_request() +{ + bool execute = false; + CHECK(this->handle_put_request(NULL,NULL,NULL, execute) == NULL); +} + +void Test_M2MBase::test_handle_post_request() +{ + bool execute = false; + CHECK(this->handle_post_request(NULL,NULL,NULL, execute) == NULL); +} + +void Test_M2MBase::test_memory_alloc() +{ + CHECK(memory_alloc(0) == 0); + uint8_t *ptr = 0; + ptr = (uint8_t*)memory_alloc(sizeof(uint8_t)); + CHECK(ptr != NULL); + memory_free(ptr); +} + +void Test_M2MBase::test_memory_free() +{ + uint8_t *ptr = (uint8_t*)memory_alloc(sizeof(uint8_t)); + memory_free((void*)ptr); + //memory leak test will fail, if there is a leak, so no need for CHECK +} + +void Test_M2MBase::test_report_handler() +{ + CHECK(report_handler() == NULL); +} + +void Test_M2MBase::test_observation_handler() +{ + CHECK(observation_handler() == NULL); +} + +void Test_M2MBase::test_id_number() +{ + char* path = (char*)malloc(3); + strcpy(path, "10"); + M2MBase* b = new M2MBase("10", M2MBase::Static, "", path, false); + CHECK(b->name_id() == 10); + delete b; + + char* path1 = (char*)malloc(6); + strcpy(path1, "66567"); + + M2MBase * test1 = new M2MBase("66567",M2MBase::Static, "", path1, false); + CHECK(test1->name_id() == -1); + delete test1; +} + +void Test_M2MBase::test_set_register_uri() +{ + this->set_register_uri(false); + CHECK(this->register_uri() == false); +} + +void Test_M2MBase::test_set_observation_number() +{ + set_observation_number(0); + CHECK(0 == this->_observation_number); +} + +void Test_M2MBase::test_set_max_age() +{ + this->set_max_age(10000); + CHECK(this->max_age() == 10000); +} + +void Test_M2MBase::test_is_under_observation() +{ + CHECK(false == is_under_observation()); + this->_is_under_observation = true; + CHECK(true == is_under_observation()); +} + +void Test_M2MBase::test_value_updated_function() +{ + MyTest test; + test.visited = false; + + CHECK(this->is_value_updated_function_set() == false); + + this->set_value_updated_function(value_updated_callback(&test,&MyTest::value_updated_function)); + this->execute_value_updated("test"); + CHECK(this->is_value_updated_function_set() == true); + CHECK(test.visited == true); + + value_update_called = false; + this->set_value_updated_function(value_updated_callback2(value_updated_function)); + this->execute_value_updated("test"); + CHECK(value_update_called == true); +} + +void Test_M2MBase::test_build_path() +{ + StringBuffer<MAX_PATH_SIZE> buffer; + CHECK(build_path(buffer, "0123456789012345678901234567890123456789012345678901234567891234", 10000, "2123456789012345678901234567890123456789012345678901234567891234", 20000)); + CHECK(!build_path(buffer, "01234567890123456789012345678901234567890123456789012345678912345", 10000, "21234567890123456789012345678901234567890123456789012345678912345", 20000)); + + StringBuffer<MAX_PATH_SIZE_2> buffer2; + CHECK(build_path(buffer2, "0123456789012345678901234567890123456789012345678901234567891234", 10000, "2123456789012345678901234567890123456789012345678901234567891234")); + CHECK(!build_path(buffer2, "01234567890123456789012345678901234567890123456789012345678912345", 10000, "21234567890123456789012345678901234567890123456789012345678912345")); + + StringBuffer<MAX_PATH_SIZE_3> buffer3; + CHECK(build_path(buffer3, "0123456789012345678901234567890123456789012345678901234567891234", 10000, 20000)); + CHECK(!build_path(buffer3, "01234567890123456789012345678901234567890123456789012345678912345", 10000, 20000)); + + StringBuffer<MAX_PATH_SIZE_4> buffer4; + CHECK(build_path(buffer4, "0123456789012345678901234567890123456789012345678901234567891234", 10000)); + CHECK(!build_path(buffer4, "01234567890123456789012345678901234567890123456789012345678912345", 10000)); +} + +void Test_M2MBase::test_set_observation_handler() +{ + set_observation_handler(obsHandler); + CHECK(observation_handler() == obsHandler); +} + +void Test_M2MBase::test_resource_type() +{ + // Default value in ctor + String test = "type"; + CHECK(test == resource_type()); +} + +void Test_M2MBase::test_resource_name_length() +{ + CHECK(4 == resource_name_length()); +} + +void Test_M2MBase::test_get_nsdl_resource() +{ + sn_nsdl_dynamic_resource_parameters_s *res = get_nsdl_resource(); + CHECK(res != NULL); + CHECK(res->static_resource_parameters != NULL); +} + +void Test_M2MBase::test_create_path() +{ + char* path1 = (char*)malloc(5); + strcpy(path1, "name"); + M2MObject* object = new M2MObject("name", path1); + + char* path2 = (char*)malloc(7); + strcpy(path2, "name/0"); + m2mresource_stub::object_instance = + new M2MObjectInstance(*object, "name","", path2); + + String path = "name/1"; + String res_path = "name/0/resource"; + String res_path_instance = "name/0/resource/1"; + + char* result = create_path(*object, "1"); + CHECK(path == result); + free(result); + + result = create_path(*object, 1); + CHECK(path == result); + free(result); + + result = create_path(*m2mresource_stub::object_instance, "resource"); + CHECK(res_path == result); + free(result); + + char* path3 = (char*)malloc(9); + strcpy(path3, "resource"); + + M2MResource* res = new M2MResource(*m2mresource_stub::object_instance, + "resource", + "type", + M2MResourceInstance::INTEGER, + false, + path3); + + result = create_path(*res, 1); + CHECK(res_path_instance == result); + free(result); + + delete m2mresource_stub::object_instance; + delete object; + delete res; +} + +void Test_M2MBase::test_create_report_handler() +{ + M2MReportHandler* report_handler = create_report_handler(); + CHECK(report_handler != NULL); +} + +void Test_M2MBase::test_validate_string_length() +{ + String test = "stringlengthabc"; + CHECK(validate_string_length(test, 1, 20) == true); + CHECK(validate_string_length(test, 1, 2) == false); + CHECK(validate_string_length(test, 15, 15) == true); + CHECK(validate_string_length(test, 16, 15) == false); + + CHECK(validate_string_length(test.c_str(), 15, 15) == true); + CHECK(validate_string_length(test.c_str(), 16, 15) == false); +} + +void Test_M2MBase::test_is_integer() +{ + CHECK(is_integer("") == false); + CHECK(is_integer("-1a") == false); + CHECK(is_integer("10") == true); + CHECK(is_integer("+10") == true); + CHECK(is_integer("-10") == true); +} + +void Test_M2MBase::test_alloc_copy() +{ + uint8_t* test_ptr = (uint8_t *)malloc(10); + memset(test_ptr,'a', 10); + uint8_t* result = alloc_copy(test_ptr, 10); + CHECK(memcmp(test_ptr, result, 10) == 0); + free(test_ptr); + free(result); +} + +void Test_M2MBase::test_alloc_string_copy() +{ + char* test = "testi"; + char* result = alloc_string_copy(test); + STRCMP_EQUAL(test,result); + free(result); +} + +void Test_M2MBase::test_ctor() +{ + static sn_nsdl_static_resource_parameters_s params_static = { + (char*)"", // resource_type_ptr + (char*)"", // interface_description_ptr + (uint8_t*)"", // path + (uint8_t*)"", // resource + 0, // pathlen + 0, // resourcelen + false, // external_memory_block + SN_GRS_DYNAMIC, // mode + false // free_on_delete + }; + + static sn_nsdl_dynamic_resource_parameters_s params_dynamic = { + __nsdl_c_callback, + ¶ms_static, + {NULL, NULL}, // link + 0, // coap_content_type + M2MBase::PUT_ALLOWED, // access + 0, // registered + false, // publish_uri + false, // free_on_delete + true // observable + }; + + const static M2MBase::lwm2m_parameters params = { + 0, // max_age + 0, // instance_id + 0, // name_id + (char*)"", // name + ¶ms_dynamic, + M2MBase::Resource, // base_type + false // free_on_delete + }; + M2MBase* base = new M2MBase(¶ms); + delete base; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mbase/test_m2mbase.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_BASE_H +#define TEST_M2M_BASE_H +#include "m2mbase.h" +#include "m2mobservationhandler.h" + +class Handler : public M2MObservationHandler { + +public: + + Handler() : visited(false) {} + ~Handler(){} + void observation_to_be_sent(M2MBase *, uint16_t, m2m::Vector<uint16_t>, bool){ + visited = true; + } + void send_delayed_response(M2MBase *){} + void resource_to_be_deleted(M2MBase *){visited=true;} + void remove_object(M2MBase *){visited = true;} + void value_updated(M2MBase *,const String&){visited = true;} + + void clear() {visited = false;} + bool visited; +}; + +class Test_M2MBase : M2MBase +{ +public: + Test_M2MBase(char* path, Handler *handler); + + virtual ~Test_M2MBase(); + + void test_copy_constructor(); + + void test_set_operation(); + + void test_set_base_type(); + + void test_set_interface_description(); + + void test_uri_path(); + + void test_set_resource_type(); + + void test_set_coap_content_type(); + + void test_set_instance_id(); + + void test_set_observable(); + + void test_add_observation_level(); + + void test_remove_observation_level(); + + void test_set_under_observation(); + + void test_set_observation_token(); + + void test_observation_level(); + + void test_get_observation_token(); + + void test_mode(); + + void test_observation_number(); + + void test_name(); + + void test_name_id(); + + void test_coap_content_type(); + + void test_base_type(); + + void test_handle_observation_attribute(); + + void test_observation_to_be_sent(); + + void test_handle_get_request(); + + void test_handle_put_request(); + + void test_handle_post_request(); + + void test_memory_alloc(); + + void test_memory_free(); + + void test_report_handler(); + + void test_observation_handler(); + + void test_id_number(); + + void test_set_register_uri(); + + void test_set_observation_number(); + + void test_set_max_age(); + + void test_is_under_observation(); + + void test_value_updated_function(); + + void test_build_path(); + + void test_set_observation_handler(); + + void test_resource_type(); + + void test_resource_name_length(); + + void test_get_nsdl_resource(); + + void test_create_path(); + + void test_create_report_handler(); + + void test_validate_string_length(); + + void test_is_integer(); + + void test_alloc_copy(); + + void test_alloc_string_copy(); + + void test_ctor(); + + Handler *obsHandler; +}; + + +#endif // TEST_M2M_BASE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mblockmessage/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,20 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mblockmessage + "main.cpp" + "m2mblockmessagetest.cpp" + "test_m2mblockmessage.cpp" + "../../../../source/m2mblockmessage.cpp" +) + +target_link_libraries(m2mblockmessage + CppUTest + CppUTestExt +) +set_target_properties(m2mblockmessage +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mblockmessage") +add_test(m2mblockmessage ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mblockmessage/m2mblockmessagetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mblockmessage.h" + +TEST_GROUP(M2MBlockMessage) +{ + Test_M2MBlockMessage* block_message; + void setup() + { + block_message = new Test_M2MBlockMessage(); + } + void teardown() + { + delete block_message; + } +}; + +TEST(M2MBlockMessage, Create) +{ + CHECK(block_message->block_message != NULL); +} + +TEST(M2MBlockMessage, test_set_message_info) +{ + block_message->test_set_message_info(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mblockmessage/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MBlockMessage );
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mblockmessage/test_m2mblockmessage.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mblockmessage.h" +#include "sn_coap_header.h" +#include <string.h> +Test_M2MBlockMessage::Test_M2MBlockMessage() +{ + block_message = new M2MBlockMessage(); +} + +Test_M2MBlockMessage::~Test_M2MBlockMessage() +{ + delete block_message; +} + +void Test_M2MBlockMessage::test_set_message_info() +{ + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + block_message->set_message_info(NULL); + CHECK(block_message->is_block_message() == false); + CHECK(block_message->total_message_size() == 0); + + coap_header->options_list_ptr = (sn_coap_options_list_s *)malloc(sizeof(sn_coap_options_list_s)); + memset(coap_header->options_list_ptr, 0, sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->size1 = 0xffff; + coap_header->options_list_ptr->use_size1 = true; + coap_header->options_list_ptr->block1 = -1; + + block_message->set_message_info(coap_header); + CHECK(block_message->total_message_size() == 0xffff); + CHECK(!block_message->is_block_message()); + block_message->clear_values(); + + coap_header->options_list_ptr->size1 = 0xffffff; + + block_message->set_message_info(coap_header); + CHECK(block_message->error_code() == M2MBlockMessage::EntityTooLarge); + block_message->clear_values(); + + coap_header->options_list_ptr->size1 = 0xffff; + coap_header->options_list_ptr->block1 = 0x010101; + block_message->set_message_info(coap_header); + CHECK(block_message->is_block_message()); + CHECK(block_message->block_number() == 4112); + block_message->clear_values(); + + coap_header->options_list_ptr->block1 = 0x0101; + block_message->set_message_info(coap_header); + CHECK(block_message->is_block_message()); + CHECK(block_message->block_number() == 16); + block_message->clear_values(); + + coap_header->options_list_ptr->block1 = 0x01; + block_message->set_message_info(coap_header); + CHECK(block_message->is_block_message()); + CHECK(block_message->block_number() == 0); + block_message->clear_values(); + + coap_header->options_list_ptr->block1 = 0x010108; + block_message->set_message_info(coap_header); + CHECK(!block_message->is_last_block()); + block_message->clear_values(); + + coap_header->payload_len = 10; + coap_header->payload_ptr = (uint8_t *)malloc(10); + memset(coap_header->payload_ptr, 'x', 10); + block_message->set_message_info(coap_header); + CHECK(!block_message->is_last_block()); + CHECK(block_message->block_data_len() == 10); + CHECK(memcmp(coap_header->payload_ptr, block_message->block_data(),10) == 0); + block_message->clear_values(); + + free(coap_header->payload_ptr); + free(coap_header->options_list_ptr); + free(coap_header); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mblockmessage/test_m2mblockmessage.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_BLOCKMESSAGE_H +#define TEST_M2M_BLOCKMESSAGE_H + +#include "m2mblockmessage.h" + +class Test_M2MBlockMessage +{ +public: + Test_M2MBlockMessage(); + virtual ~Test_M2MBlockMessage(); + + void test_set_message_info(); + + M2MBlockMessage* block_message; + +}; + +#endif // TEST_M2M_BLOCKMESSAGE_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mdevice/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,27 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mdevice + "main.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "m2mdevicetest.cpp" + "test_m2mdevice.cpp" + "../../../../source/m2mdevice.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mdevice + CppUTest + CppUTestExt +) +set_target_properties(m2mdevice +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mdevice") +add_test(m2mdevice ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mdevice/m2mdevicetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mdevice.h" + +TEST_GROUP(M2MDevice) +{ + Test_M2MDevice* m2m_device; + + void setup() + { + m2m_device = new Test_M2MDevice(); + } + void teardown() + { + delete m2m_device; + } +}; + +TEST(M2MDevice, Create) +{ + CHECK(m2m_device != NULL); +} + +TEST(M2MDevice, create_resource_instance) +{ + m2m_device->test_create_resource_instance(); +} + +TEST(M2MDevice, create_resource_string) +{ + m2m_device->test_create_resource_string(); +} + +TEST(M2MDevice, create_resource_int) +{ + m2m_device->test_create_resource_int(); +} + +TEST(M2MDevice, create_resource_no_param) +{ + m2m_device->test_create_resource_no_param(); +} + +TEST(M2MDevice, delete_resource) +{ + m2m_device->test_delete_resource(); +} + +TEST(M2MDevice, delete_resource_instance) +{ + m2m_device->test_delete_resource_instance(); +} + +TEST(M2MDevice, set_resource_value_int) +{ + m2m_device->test_set_resource_value_int(); +} + +TEST(M2MDevice, set_resource_value_string) +{ + m2m_device->test_set_resource_value_string(); +} + +TEST(M2MDevice, resource_value_int) +{ + m2m_device->test_resource_value_int(); +} + +TEST(M2MDevice, resource_value_string) +{ + m2m_device->test_resource_value_string(); +} + +TEST(M2MDevice, is_resource_present) +{ + m2m_device->test_is_resource_present(); +} + +TEST(M2MDevice, per_resource_count) +{ + m2m_device->test_per_resource_count(); +} + +TEST(M2MDevice, total_resource_count) +{ + m2m_device->test_total_resource_count(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mdevice/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MDevice);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mdevice/test_m2mdevice.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mdevice.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mbase_stub.h" + +Test_M2MDevice::Test_M2MDevice() +{ + M2MObject* obj = new M2MObject("name", "name"); + m2mobject_stub::inst = new M2MObjectInstance(*obj, + "name", + "",""); + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::create_resource_instance= new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + m2mresource_stub::bool_value = true; + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + device = M2MDevice::get_instance(); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + delete m2mobjectinstance_stub::create_resource_instance; + m2mobjectinstance_stub::create_resource_instance = NULL; + + delete obj; +} + +Test_M2MDevice::~Test_M2MDevice() +{ + delete m2mobject_stub::inst; + m2mobject_stub::inst = NULL; + + M2MDevice::delete_instance(); + device = NULL; +} + +void Test_M2MDevice::test_create_resource_instance() +{ + m2mobjectinstance_stub::create_resource_instance = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(device->create_resource_instance(M2MDevice::ErrorCode,5,1) != NULL); + CHECK(device->create_resource_instance(M2MDevice::ErrorCode,-1,1) == NULL); + CHECK(device->create_resource_instance(M2MDevice::ErrorCode,9,1) == NULL); + + m2mbase_stub::void_value = malloc(20); + + CHECK(device->create_resource_instance(M2MDevice::AvailablePowerSources,-1,0) == NULL); + CHECK(device->create_resource_instance(M2MDevice::AvailablePowerSources,8,0) == NULL); + CHECK(device->create_resource_instance(M2MDevice::AvailablePowerSources,7,0) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + CHECK(device->create_resource_instance(M2MDevice::PowerSourceVoltage,10,0) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + CHECK(device->create_resource_instance(M2MDevice::PowerSourceCurrent,10,0) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::create_resource_instance; + m2mobjectinstance_stub::create_resource_instance = NULL; + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MDevice::test_create_resource_string() +{ + m2mresourceinstance_stub::value = NULL; + CHECK(device->create_resource(M2MDevice::Reboot,"test") == NULL); + CHECK(device->create_resource(M2MDevice::ErrorCode,"test") == NULL); + CHECK(device->create_resource(M2MDevice::SupportedBindingMode,"test") == NULL); + // Length 65, should fail + String max_lenght = "65656565656565656565656565656565656565656565656565656565656565656"; + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(device->create_resource(M2MDevice::Manufacturer,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + CHECK(device->create_resource(M2MDevice::Manufacturer,max_lenght) == NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + m2mresource_stub::bool_value = false; + //Duplicate resource + CHECK(device->create_resource(M2MDevice::Manufacturer,"test") == NULL); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + CHECK(device->create_resource(M2MDevice::DeviceType,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::DeviceType,"") != NULL); + CHECK(device->create_resource(M2MDevice::DeviceType,max_lenght) == NULL); + + CHECK(device->create_resource(M2MDevice::ModelNumber,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::ModelNumber,max_lenght) == NULL); + + + CHECK(device->create_resource(M2MDevice::SerialNumber,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::SerialNumber,max_lenght) == NULL); + + + CHECK(device->create_resource(M2MDevice::HardwareVersion,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::HardwareVersion,max_lenght) == NULL); + + + CHECK(device->create_resource(M2MDevice::FirmwareVersion,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::FirmwareVersion,max_lenght) == NULL); + + + CHECK(device->create_resource(M2MDevice::SoftwareVersion,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::SoftwareVersion,max_lenght) == NULL); + + + CHECK(device->create_resource(M2MDevice::UTCOffset,"test") != NULL); + CHECK(M2MBase::GET_PUT_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::UTCOffset,max_lenght) == NULL); + + + CHECK(device->create_resource(M2MDevice::Timezone,"test") != NULL); + CHECK(M2MBase::GET_PUT_ALLOWED == m2mbase_stub::operation); + CHECK(device->create_resource(M2MDevice::Timezone,max_lenght) == NULL); + + CHECK(device->create_resource(M2MDevice::BatteryLevel,"test") == NULL); + CHECK(device->create_resource(M2MDevice::BatteryStatus,"test") == NULL); + CHECK(device->create_resource(M2MDevice::MemoryFree,"test") == NULL); + CHECK(device->create_resource(M2MDevice::MemoryTotal,"test") == NULL); + CHECK(device->create_resource(M2MDevice::ResetErrorCode,"test") == NULL); + CHECK(device->create_resource(M2MDevice::CurrentTime,"test") == NULL); + CHECK(device->create_resource(M2MDevice::AvailablePowerSources,"test") == NULL); + CHECK(device->create_resource(M2MDevice::PowerSourceVoltage,"test") == NULL); + CHECK(device->create_resource(M2MDevice::PowerSourceCurrent,"test") == NULL); + CHECK(device->create_resource(M2MDevice::FactoryReset,"test") == NULL); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + +void Test_M2MDevice::test_create_resource_int() +{ + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(device->create_resource(M2MDevice::Reboot,10) == NULL); + CHECK(device->create_resource(M2MDevice::SupportedBindingMode,10) == NULL); + + CHECK(device->create_resource(M2MDevice::Manufacturer,10) == NULL); + CHECK(device->create_resource(M2MDevice::DeviceType,10) == NULL); + CHECK(device->create_resource(M2MDevice::ModelNumber,10) == NULL); + CHECK(device->create_resource(M2MDevice::SerialNumber,10) == NULL); + CHECK(device->create_resource(M2MDevice::HardwareVersion,10) == NULL); + CHECK(device->create_resource(M2MDevice::FirmwareVersion,10) == NULL); + CHECK(device->create_resource(M2MDevice::SoftwareVersion,10) == NULL); + CHECK(device->create_resource(M2MDevice::UTCOffset,10) == NULL); + CHECK(device->create_resource(M2MDevice::Timezone,10) == NULL); + CHECK(device->create_resource(M2MDevice::FactoryReset,10) == NULL); + + m2mbase_stub::void_value = malloc(20); + + CHECK(device->create_resource(M2MDevice::BatteryLevel,10) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + // Range is above 100 + CHECK(device->create_resource(M2MDevice::BatteryLevel,101) == NULL); + + CHECK(device->create_resource(M2MDevice::BatteryStatus,4) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + // Range is above 6 + CHECK(device->create_resource(M2MDevice::BatteryStatus,10) == NULL); + + CHECK(device->create_resource(M2MDevice::MemoryFree,10) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + CHECK(device->create_resource(M2MDevice::MemoryTotal,10) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + CHECK(device->create_resource(M2MDevice::CurrentTime,10) != NULL); + CHECK(M2MBase::GET_PUT_ALLOWED == m2mbase_stub::operation); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + +void Test_M2MDevice::test_create_resource_no_param() +{ + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + + CHECK(device->create_resource(M2MDevice::Reboot) == NULL); + CHECK(device->create_resource(M2MDevice::ErrorCode) == NULL); + CHECK(device->create_resource(M2MDevice::SupportedBindingMode) == NULL); + + CHECK(device->create_resource(M2MDevice::Manufacturer) == NULL); + CHECK(device->create_resource(M2MDevice::DeviceType) == NULL); + CHECK(device->create_resource(M2MDevice::ModelNumber) == NULL); + CHECK(device->create_resource(M2MDevice::SerialNumber) == NULL); + CHECK(device->create_resource(M2MDevice::HardwareVersion) == NULL); + CHECK(device->create_resource(M2MDevice::FirmwareVersion) == NULL); + CHECK(device->create_resource(M2MDevice::SoftwareVersion) == NULL); + CHECK(device->create_resource(M2MDevice::UTCOffset) == NULL); + CHECK(device->create_resource(M2MDevice::Timezone) == NULL); + + CHECK(device->create_resource(M2MDevice::BatteryLevel) == NULL); + CHECK(device->create_resource(M2MDevice::BatteryStatus) == NULL); + CHECK(device->create_resource(M2MDevice::MemoryFree) == NULL); + CHECK(device->create_resource(M2MDevice::MemoryTotal) == NULL); + CHECK(device->create_resource(M2MDevice::CurrentTime) == NULL); + CHECK(device->create_resource(M2MDevice::AvailablePowerSources) == NULL); + CHECK(device->create_resource(M2MDevice::PowerSourceVoltage) == NULL); + CHECK(device->create_resource(M2MDevice::PowerSourceCurrent) == NULL); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(device->create_resource(M2MDevice::ResetErrorCode) != NULL); + + CHECK(device->create_resource(M2MDevice::FactoryReset) != NULL); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + CHECK(M2MBase::POST_ALLOWED == m2mbase_stub::operation); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; + + +} + +void Test_M2MDevice::test_delete_resource() +{ + m2mobjectinstance_stub::bool_value = true; + + CHECK(device->delete_resource(M2MDevice::Reboot) == false); + CHECK(device->delete_resource(M2MDevice::ErrorCode) == false); + CHECK(device->delete_resource(M2MDevice::SupportedBindingMode) == false); + + CHECK(device->delete_resource(M2MDevice::Manufacturer) == true); + CHECK(device->delete_resource(M2MDevice::BatteryLevel) == true); + CHECK(device->delete_resource(M2MDevice::FactoryReset) == true); +} + +void Test_M2MDevice::test_delete_resource_instance() +{ + m2mobjectinstance_stub::bool_value = true; + + CHECK(device->delete_resource_instance(M2MDevice::Reboot,0) == false); + CHECK(device->delete_resource_instance(M2MDevice::ErrorCode,0) == false); + CHECK(device->delete_resource_instance(M2MDevice::SupportedBindingMode,0) == false); + + CHECK(device->delete_resource_instance(M2MDevice::AvailablePowerSources,0) == true); + CHECK(device->delete_resource_instance(M2MDevice::PowerSourceVoltage,0) == true); + CHECK(device->delete_resource_instance(M2MDevice::PowerSourceCurrent,0) == true); +} + +void Test_M2MDevice::test_set_resource_value_string() +{ + // Length 65, should fail + m2mresourceinstance_stub::value = NULL; + String max_lenght = "65656565656565656565656565656565656565656565656565656565656565656"; + m2mbase_stub::bool_value = true; + m2mresourceinstance_stub::bool_value = true; + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + m2mresource_stub::bool_value = false; + + m2mbase_stub::void_value = malloc(20); + + CHECK(device->set_resource_value(M2MDevice::Reboot,"test") == false); + CHECK(device->set_resource_value(M2MDevice::ErrorCode,"test") == false); + CHECK(device->set_resource_value(M2MDevice::SupportedBindingMode,"test") == false); + + CHECK(device->set_resource_value(M2MDevice::Manufacturer,"test") == true); + CHECK(device->set_resource_value(M2MDevice::Manufacturer,"") == true); + CHECK(device->set_resource_value(M2MDevice::Manufacturer,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::DeviceType,"test") == true); + CHECK(device->set_resource_value(M2MDevice::DeviceType,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::ModelNumber,"test") == true); + CHECK(device->set_resource_value(M2MDevice::ModelNumber,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::SerialNumber,"test") == true); + CHECK(device->set_resource_value(M2MDevice::SerialNumber,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::HardwareVersion,"test") == true); + CHECK(device->set_resource_value(M2MDevice::HardwareVersion,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::FirmwareVersion,"test") == true); + CHECK(device->set_resource_value(M2MDevice::FirmwareVersion,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::SoftwareVersion,"test") == true); + CHECK(device->set_resource_value(M2MDevice::SoftwareVersion,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::UTCOffset,"test") == true); + CHECK(device->set_resource_value(M2MDevice::UTCOffset,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::Timezone,"test") == true); + CHECK(device->set_resource_value(M2MDevice::Timezone,max_lenght) == false); + CHECK(device->set_resource_value(M2MDevice::Timezone,"") == true); + + CHECK(device->set_resource_value(M2MDevice::BatteryLevel,"test") == false); + CHECK(device->set_resource_value(M2MDevice::BatteryStatus,"test") == false); + CHECK(device->set_resource_value(M2MDevice::MemoryFree,"test") == false); + CHECK(device->set_resource_value(M2MDevice::MemoryTotal,"test") == false); + CHECK(device->set_resource_value(M2MDevice::ResetErrorCode,"test") == false); + CHECK(device->set_resource_value(M2MDevice::CurrentTime,"test") == false); + CHECK(device->set_resource_value(M2MDevice::AvailablePowerSources,"test") == false); + CHECK(device->set_resource_value(M2MDevice::PowerSourceVoltage,"test") == false); + CHECK(device->set_resource_value(M2MDevice::PowerSourceCurrent,"test") == false); + CHECK(device->set_resource_value(M2MDevice::FactoryReset,"test") == false); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MDevice::test_set_resource_value_int() +{ + m2mresourceinstance_stub::bool_value = true; + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + m2mresource_stub::bool_value = false; + + m2mbase_stub::void_value = malloc(20); + + CHECK(device->set_resource_value(M2MDevice::Reboot,10) == false); + CHECK(device->set_resource_value(M2MDevice::SupportedBindingMode,10) == false); + + CHECK(device->set_resource_value(M2MDevice::Manufacturer,10) == false); + CHECK(device->set_resource_value(M2MDevice::DeviceType,10) == false); + CHECK(device->set_resource_value(M2MDevice::ModelNumber,10) == false); + CHECK(device->set_resource_value(M2MDevice::SerialNumber,10) == false); + CHECK(device->set_resource_value(M2MDevice::HardwareVersion,10) == false); + CHECK(device->set_resource_value(M2MDevice::FirmwareVersion,10) == false); + CHECK(device->set_resource_value(M2MDevice::SoftwareVersion,10) == false); + CHECK(device->set_resource_value(M2MDevice::UTCOffset,10) == false); + CHECK(device->set_resource_value(M2MDevice::Timezone,10) == false); + + CHECK(device->set_resource_value(M2MDevice::BatteryLevel,-1) == false); + CHECK(device->set_resource_value(M2MDevice::BatteryLevel,10) == true); + CHECK(device->set_resource_value(M2MDevice::BatteryLevel,101) == false); + CHECK(device->set_resource_value(M2MDevice::BatteryStatus,6) == true); + CHECK(device->set_resource_value(M2MDevice::BatteryStatus,-1) == false); + CHECK(device->set_resource_value(M2MDevice::BatteryStatus,7) == false); + CHECK(device->set_resource_value(M2MDevice::MemoryFree,10) == true); + CHECK(device->set_resource_value(M2MDevice::MemoryTotal,10) == true); + CHECK(device->set_resource_value(M2MDevice::CurrentTime,10) == true); + CHECK(device->set_resource_value(M2MDevice::FactoryReset,10) == false); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MDevice::test_resource_value_int() +{ + uint8_t value[] = {"10"}; + uint8_t* ptr = (uint8_t*)malloc((uint32_t)sizeof(value)); + m2mresourceinstance_stub::value = ptr; + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint32_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mresourceinstance_stub::bool_value = true; + m2mresource_stub::bool_value = false; + m2mbase_stub::void_value = malloc(20); + + CHECK(device->resource_value_int(M2MDevice::BatteryLevel) == 10); + CHECK(device->resource_value_int(M2MDevice::BatteryStatus) == 10); + CHECK(device->resource_value_int(M2MDevice::MemoryFree) == 10); + CHECK(device->resource_value_int(M2MDevice::MemoryTotal) == 10); + CHECK(device->resource_value_int(M2MDevice::ErrorCode) == 10); + CHECK(device->resource_value_int(M2MDevice::CurrentTime) == 10); + CHECK(device->resource_value_int(M2MDevice::AvailablePowerSources) == 10); + CHECK(device->resource_value_int(M2MDevice::PowerSourceVoltage) == 10); + CHECK(device->resource_value_int(M2MDevice::PowerSourceCurrent) == 10); + CHECK(device->resource_value_int(M2MDevice::Manufacturer) == -1); + + m2mresource_stub::instance= new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + m2mresource_stub::bool_value = true; + CHECK(device->resource_value_int(M2MDevice::AvailablePowerSources,1) == 10); + + free(m2mbase_stub::void_value); + + delete m2mresource_stub::instance; + m2mresource_stub::instance = NULL; + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(ptr); +} + +void Test_M2MDevice::test_resource_value_string() +{ + String test = "string"; + uint8_t value[] = {"string"}; + m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint32_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mresourceinstance_stub::bool_value = true; + m2mresource_stub::bool_value = false; + m2mbase_stub::void_value = malloc(20); + + CHECK(device->resource_value_string(M2MDevice::Manufacturer) == test); + CHECK(device->resource_value_string(M2MDevice::DeviceType) == test); + CHECK(device->resource_value_string(M2MDevice::ModelNumber) == test); + CHECK(device->resource_value_string(M2MDevice::SerialNumber) == test); + CHECK(device->resource_value_string(M2MDevice::HardwareVersion) == test); + CHECK(device->resource_value_string(M2MDevice::FirmwareVersion) == test); + CHECK(device->resource_value_string(M2MDevice::SoftwareVersion) == test); + CHECK(device->resource_value_string(M2MDevice::UTCOffset) == test); + CHECK(device->resource_value_string(M2MDevice::Timezone) == test); + CHECK(device->resource_value_string(M2MDevice::BatteryLevel) == ""); + + free(m2mbase_stub::void_value); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MDevice::test_is_resource_present() +{ + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + m2mresource_stub::bool_value = false; + CHECK(device->is_resource_present(M2MDevice::Reboot) == true); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + CHECK(device->is_resource_present(M2MDevice::Manufacturer) == false); + CHECK(device->is_resource_present(M2MDevice::DeviceType) == false); +} + +void Test_M2MDevice::test_per_resource_count() +{ + m2mobjectinstance_stub::int_value = 1; + CHECK(device->per_resource_count(M2MDevice::Reboot) == 1); + + m2mobjectinstance_stub::int_value = 0; + + CHECK(device->per_resource_count(M2MDevice::Manufacturer) == 0); +} + +void Test_M2MDevice::test_total_resource_count() +{ + M2MResource res(*m2mobject_stub::inst,"test","test",M2MResourceInstance::STRING,false, "test"); + + m2mobjectinstance_stub::resource_list.push_back(&res); + M2MResource res2(*m2mobject_stub::inst,"test","test",M2MResourceInstance::STRING,false, "test"); + + m2mobjectinstance_stub::resource_list.push_back(&res2); + + CHECK(device->total_resource_count() == 2); + + m2mobjectinstance_stub::resource_list.clear(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mdevice/test_m2mdevice.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_DEVICE_H +#define TEST_M2M_DEVICE_H + + +#include <m2mdevice.h> + +class Callback; + +class Test_M2MDevice +{ +public: + Test_M2MDevice(); + virtual ~Test_M2MDevice(); + + void test_create_resource_instance(); + + void test_create_resource_string(); + + void test_create_resource_int(); + + void test_create_resource_no_param(); + + void test_delete_resource(); + + void test_delete_resource_instance(); + + void test_set_resource_value_int(); + + void test_set_resource_value_string(); + + void test_resource_value_int(); + + void test_resource_value_string(); + + void test_is_resource_present(); + + void test_per_resource_count(); + + void test_total_resource_count(); + + M2MDevice* device; +}; + +#endif // TEST_M2M_DEVICE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mfirmware/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,27 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mfirmware + "main.cpp" + "m2mfirmwaretest.cpp" + "test_m2mfirmware.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../../../../source/m2mfirmware.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mfirmware + CppUTest + CppUTestExt +) +set_target_properties(m2mfirmware +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mfirmware") +add_test(m2mfirmware ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mfirmware/m2mfirmwaretest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mfirmware.h" + +TEST_GROUP(M2MFirmware) +{ + Test_M2MFirmware* m2m_firmware; + + void setup() + { + m2m_firmware = new Test_M2MFirmware(); + } + void teardown() + { + delete m2m_firmware; + } +}; + +TEST(M2MFirmware, Create) +{ + CHECK(m2m_firmware != NULL); +} + +TEST(M2MFirmware, create_resource_string) +{ + m2m_firmware->test_create_resource_string(); +} + +TEST(M2MFirmware, create_resource_int) +{ + m2m_firmware->test_create_resource_int(); +} + +TEST(M2MFirmware, delete_resource) +{ + m2m_firmware->test_delete_resource(); +} + +TEST(M2MFirmware, set_resource_value_int) +{ + m2m_firmware->test_set_resource_value_int(); +} + +TEST(M2MFirmware, set_resource_value_string) +{ + m2m_firmware->test_set_resource_value_string(); +} + +TEST(M2MFirmware, resource_value_int) +{ + m2m_firmware->test_resource_value_int(); +} + +TEST(M2MFirmware, resource_value_string) +{ + m2m_firmware->test_resource_value_string(); +} + +TEST(M2MFirmware, is_resource_present) +{ + m2m_firmware->test_is_resource_present(); +} + +TEST(M2MFirmware, per_resource_count) +{ + m2m_firmware->test_per_resource_count(); +} + +TEST(M2MFirmware, total_resource_count) +{ + m2m_firmware->test_total_resource_count(); +} + +TEST(M2MFirmware, set_resource_value_buffer) +{ + m2m_firmware->test_set_resource_value_buffer(); +} + +TEST(M2MFirmware, resource_value_buffer) +{ + m2m_firmware->test_resource_value_buffer(); +} + +TEST(M2MFirmware, resource_name) +{ + m2m_firmware->test_resource_name(); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mfirmware/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MFirmware );
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mfirmware/test_m2mfirmware.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,440 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mfirmware.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mbase_stub.h" +#include "nsdlaccesshelper_stub.h" + +Test_M2MFirmware::Test_M2MFirmware() +{ + M2MObject* obj = new M2MObject("name", "name"); + m2mobject_stub::inst = new M2MObjectInstance(*obj, + "name","",""); + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::create_resource_instance= new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + m2mresource_stub::bool_value = true; + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + firmware = M2MFirmware::get_instance(); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + delete m2mobjectinstance_stub::create_resource_instance; + m2mobjectinstance_stub::create_resource_instance = NULL; + delete obj; +} + +Test_M2MFirmware::~Test_M2MFirmware() +{ + delete m2mobject_stub::inst; + m2mobject_stub::inst = NULL; + + M2MFirmware::delete_instance(); + firmware = NULL; +} + +void Test_M2MFirmware::test_create_resource_string() +{ + CHECK(firmware->create_resource(M2MFirmware::Package, "test") == NULL); + CHECK(firmware->create_resource(M2MFirmware::Update, "test") == NULL); + CHECK(firmware->create_resource(M2MFirmware::State, "test") == NULL); + + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + CHECK(firmware->create_resource(M2MFirmware::PackageName,"test") != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + CHECK(firmware->create_resource(M2MFirmware::PackageName,"") != NULL); + + // Check size limit + String test = ""; + for (int i = 0; i <= 255; i++) { + test.append("a", 1); + } + // 255 + null-termination + CHECK(firmware->create_resource(M2MFirmware::PackageVersion,test) == NULL); + + test = ""; + for (int i = 0; i <= 254; i++) { + test.append("a", 1); + } + // 254 + null-termination + CHECK(firmware->create_resource(M2MFirmware::PackageVersion,test) != NULL); + CHECK(M2MBase::GET_ALLOWED == m2mbase_stub::operation); + + + CHECK(firmware->create_resource(M2MFirmware::Package,"test") == NULL); + CHECK(firmware->create_resource(M2MFirmware::Update,"test") == NULL); + CHECK(firmware->create_resource(M2MFirmware::State,"test") == NULL); + CHECK(firmware->create_resource(M2MFirmware::UpdateSupportedObjects,"test") == NULL); + CHECK(firmware->create_resource(M2MFirmware::UpdateResult,"test") == NULL); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + +void Test_M2MFirmware::test_create_resource_int() +{ + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(firmware->create_resource(M2MFirmware::PackageVersion,10) == NULL); + CHECK(firmware->create_resource(M2MFirmware::PackageName,10) == NULL); + CHECK(firmware->create_resource(M2MFirmware::Package,10) == NULL); + CHECK(firmware->create_resource(M2MFirmware::Update,10) == NULL); + + m2mbase_stub::void_value = malloc(20); + + CHECK(firmware->create_resource(M2MFirmware::UpdateSupportedObjects,false) != NULL); + CHECK(firmware->create_resource(M2MFirmware::UpdateSupportedObjects,true) != NULL); + CHECK(firmware->create_resource(M2MFirmware::UpdateSupportedObjects,5) == NULL); + CHECK(M2MBase::GET_PUT_ALLOWED == m2mbase_stub::operation); + + CHECK(firmware->create_resource(M2MFirmware::Update,10) == NULL); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + + +void Test_M2MFirmware::test_delete_resource() +{ + m2mobjectinstance_stub::bool_value = true; + + CHECK(firmware->delete_resource(M2MFirmware::PackageName) == true); + CHECK(firmware->delete_resource(M2MFirmware::PackageVersion) == true); + CHECK(firmware->delete_resource(M2MFirmware::UpdateSupportedObjects) == true); + + CHECK(firmware->delete_resource(M2MFirmware::Package) == false); + CHECK(firmware->delete_resource(M2MFirmware::PackageUri) == false); + CHECK(firmware->delete_resource(M2MFirmware::State) == false); + CHECK(firmware->delete_resource(M2MFirmware::UpdateResult) == false); + CHECK(firmware->delete_resource(M2MFirmware::Update) == false); +} + +void Test_M2MFirmware::test_set_resource_value_string() +{ + m2mresourceinstance_stub::value = NULL; + m2mbase_stub::bool_value = true; + m2mresourceinstance_stub::bool_value = true; + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + m2mresource_stub::bool_value = false; + + m2mbase_stub::void_value = malloc(20); + + CHECK(firmware->set_resource_value(M2MFirmware::PackageName,"test") == true); + CHECK(firmware->set_resource_value(M2MFirmware::PackageVersion,"test") == true); + CHECK(firmware->set_resource_value(M2MFirmware::PackageUri,"test") == true); + CHECK(firmware->set_resource_value(M2MFirmware::PackageUri,"") == true); + + // Check size limit + String test = ""; + for (int i = 0; i <= 255; i++) { + test.append("a", 1); + } + CHECK(firmware->set_resource_value(M2MFirmware::PackageUri,test) == false); + + CHECK(firmware->set_resource_value(M2MFirmware::Package,"test") == false); + CHECK(firmware->set_resource_value(M2MFirmware::State,"test") == false); + CHECK(firmware->set_resource_value(M2MFirmware::UpdateResult,"test") == false); + CHECK(firmware->set_resource_value(M2MFirmware::UpdateSupportedObjects,"test") == false); + CHECK(firmware->set_resource_value(M2MFirmware::Update,"test") == false); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MFirmware::test_set_resource_value_int() +{ + m2mresourceinstance_stub::bool_value = true; + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + m2mresource_stub::bool_value = false; + + m2mbase_stub::void_value = malloc(20); + + CHECK(firmware->set_resource_value(M2MFirmware::PackageName,10) == false); + CHECK(firmware->set_resource_value(M2MFirmware::PackageVersion,10) == false); + CHECK(firmware->set_resource_value(M2MFirmware::PackageUri,10) == false); + + CHECK(firmware->set_resource_value(M2MFirmware::Package,10) == false); + CHECK(firmware->set_resource_value(M2MFirmware::State,2) == true); + CHECK(firmware->set_resource_value(M2MFirmware::State,1) == true); + CHECK(firmware->set_resource_value(M2MFirmware::State,3) == true); + CHECK(firmware->set_resource_value(M2MFirmware::State,4) == false); + CHECK(firmware->set_resource_value(M2MFirmware::State,0) == true); + CHECK(firmware->set_resource_value(M2MFirmware::UpdateResult,2) == true); + CHECK(firmware->set_resource_value(M2MFirmware::UpdateResult,20) == false); + CHECK(firmware->set_resource_value(M2MFirmware::UpdateSupportedObjects,true) == true); + CHECK(firmware->set_resource_value(M2MFirmware::Update,10) == false); + CHECK(firmware->check_value_range(M2MFirmware::Update,10) == false); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + + +void Test_M2MFirmware::test_resource_value_int() +{ + uint8_t value[] = {"10"}; + uint8_t* ptr = (uint8_t*)malloc((uint32_t)sizeof(value)); + m2mresourceinstance_stub::value = ptr; + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value, value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint32_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mresourceinstance_stub::bool_value = true; + m2mresource_stub::bool_value = false; + m2mbase_stub::void_value = malloc(20); + + CHECK(firmware->resource_value_int(M2MFirmware::State) == 10); + CHECK(firmware->resource_value_int(M2MFirmware::UpdateResult) == 10); + CHECK(firmware->resource_value_int(M2MFirmware::UpdateSupportedObjects) == 10); + CHECK(firmware->resource_value_int(M2MFirmware::PackageName) == -1); + CHECK(firmware->resource_value_int(M2MFirmware::Package) == -1); + CHECK(firmware->resource_value_int(M2MFirmware::PackageUri) == -1); + CHECK(firmware->resource_value_int(M2MFirmware::PackageVersion) == -1); + CHECK(firmware->resource_value_int(M2MFirmware::Update) == -1); + + free(m2mbase_stub::void_value); + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(ptr); +} + +void Test_M2MFirmware::test_resource_value_string() +{ + String test = "string"; + uint8_t value[] = {"string"}; + m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint32_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mresourceinstance_stub::bool_value = true; + m2mresource_stub::bool_value = false; + m2mbase_stub::void_value = malloc(20); + + CHECK(firmware->resource_value_string(M2MFirmware::PackageUri) == test); + CHECK(firmware->resource_value_string(M2MFirmware::PackageName) == test); + CHECK(firmware->resource_value_string(M2MFirmware::PackageVersion) == test); + CHECK(firmware->resource_value_string(M2MFirmware::Package) == ""); + CHECK(firmware->resource_value_string(M2MFirmware::Update) == ""); + CHECK(firmware->resource_value_string(M2MFirmware::UpdateResult) == ""); + CHECK(firmware->resource_value_string(M2MFirmware::UpdateSupportedObjects) == ""); + CHECK(firmware->resource_value_string(M2MFirmware::State) == ""); + + free(m2mbase_stub::void_value); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MFirmware::test_is_resource_present() +{ + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + m2mresource_stub::bool_value = false; + CHECK(firmware->is_resource_present(M2MFirmware::PackageUri) == true); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + CHECK(firmware->is_resource_present(M2MFirmware::PackageName) == false); + CHECK(firmware->is_resource_present(M2MFirmware::PackageVersion) == false); +} + +void Test_M2MFirmware::test_per_resource_count() +{ + m2mobjectinstance_stub::int_value = 1; + CHECK(firmware->per_resource_count(M2MFirmware::Package) == 1); + + m2mobjectinstance_stub::int_value = 0; + + CHECK(firmware->per_resource_count(M2MFirmware::PackageVersion) == 0); +} + + + +void Test_M2MFirmware::test_total_resource_count() +{ + M2MResource res(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::resource_list.push_back(&res); + M2MResource res2(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::resource_list.push_back(&res2); + + CHECK(firmware->total_resource_count() == 2); + + m2mobjectinstance_stub::resource_list.clear(); +} + +void Test_M2MFirmware::test_resource_value_buffer() +{ + m2mresourceinstance_stub::bool_value = true; + + uint8_t value[] = {"buffer"}; + uint8_t *out_value = NULL; + + m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint16_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(firmware->resource_value_buffer(M2MFirmware::Package,out_value) != 0); + + CHECK(firmware->resource_value_buffer(M2MFirmware::PackageName,out_value) == 0); + CHECK(firmware->resource_value_buffer(M2MFirmware::PackageUri,out_value) == 0); + CHECK(firmware->resource_value_buffer(M2MFirmware::PackageVersion,out_value) == 0); + CHECK(firmware->resource_value_buffer(M2MFirmware::Update,out_value) == 0); + CHECK(firmware->resource_value_buffer(M2MFirmware::State,out_value) == 0); + CHECK(firmware->resource_value_buffer(M2MFirmware::UpdateResult,out_value) == 0); + CHECK(firmware->resource_value_buffer(M2MFirmware::UpdateSupportedObjects,out_value) == 0); + + + free(out_value); + out_value = NULL; + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MFirmware::test_set_resource_value_buffer() +{ + m2mresourceinstance_stub::bool_value = true; + + uint8_t value[] = {"value"}; + uint16_t length = (uint16_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(firmware->set_resource_value(M2MFirmware::Package,value,length) == true); + CHECK(firmware->set_resource_value(M2MFirmware::PackageName,value,length) == false); + CHECK(firmware->set_resource_value(M2MFirmware::PackageUri,value,length) == false); + CHECK(firmware->set_resource_value(M2MFirmware::PackageVersion,value,length) == false); + CHECK(firmware->set_resource_value(M2MFirmware::State,value,length) == false); + CHECK(firmware->set_resource_value(M2MFirmware::Update,value,length) == false); + CHECK(firmware->set_resource_value(M2MFirmware::UpdateResult,value,length) == false); + CHECK(firmware->set_resource_value(M2MFirmware::UpdateSupportedObjects,value,length) == false); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MFirmware::test_resource_name() +{ + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::Package), "0"); + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::PackageUri), "1"); + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::Update), "2"); + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::State), "3"); + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::UpdateSupportedObjects), "4"); + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::UpdateResult), "5"); + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::PackageName), "6"); + STRCMP_EQUAL(firmware->resource_name(M2MFirmware::PackageVersion), "7"); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mfirmware/test_m2mfirmware.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_FIRMWARE_H +#define TEST_M2M_FIRMWARE_H + + +#include <m2mfirmware.h> + +class Callback; + +class Test_M2MFirmware +{ +public: + Test_M2MFirmware(); + virtual ~Test_M2MFirmware(); + + void test_create_resource_string(); + + void test_create_resource_int(); + + void test_delete_resource(); + + void test_set_resource_value_int(); + + void test_set_resource_value_string(); + + void test_resource_value_int(); + + void test_resource_value_string(); + + void test_is_resource_present(); + + void test_per_resource_count(); + + void test_total_resource_count(); + + void test_resource_value_buffer(); + + void test_set_resource_value_buffer(); + + void test_resource_name(); + + M2MFirmware* firmware; +}; + +#endif // TEST_M2M_FIRMWARE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfacefactory/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2minterfacefactorytest + "main.cpp" + "m2minterfacefactorytest.cpp" + "test_m2minterfacefactory.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mdevice_stub.cpp" + "../stub/m2mfirmware_stub.cpp" + "../stub/m2msecurity_stub.cpp" + "../stub/m2mserver_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/m2mnsdlinterface_stub.cpp" + "../stub/m2minterfaceimpl_stub.cpp" + "../stub/m2mconnectionhandler_stub.cpp" + "../stub/m2mconnectionsecurity_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../../../../source/m2minterfacefactory.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2minterfacefactorytest + CppUTest + CppUTestExt +) +set_target_properties(m2minterfacefactorytest +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2minterfacefactorytest") +add_test(m2minterfacefactorytest ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfacefactory/m2minterfacefactorytest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2minterfacefactory.h" + +TEST_GROUP(M2MInterfaceFactory) +{ + Test_M2MInterfaceFactory* m2m_factory; + + void setup() + { + m2m_factory = new Test_M2MInterfaceFactory(); + } + void teardown() + { + delete m2m_factory; + } +}; + + +TEST(M2MInterfaceFactory, create_interface) +{ + m2m_factory->test_create_interface(); +} + +TEST(M2MInterfaceFactory, create_device) +{ + m2m_factory->test_create_device(); +} + +TEST(M2MInterfaceFactory, create_security) +{ + m2m_factory->test_create_security(); +} + +TEST(M2MInterfaceFactory, create_server) +{ + m2m_factory->test_create_server(); +} + +TEST(M2MInterfaceFactory, create_object) +{ + m2m_factory->test_create_object(); +} + +TEST(M2MInterfaceFactory, create_firmware) +{ + m2m_factory->test_create_firmware(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfacefactory/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MInterfaceFactory);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfacefactory/test_m2minterfacefactory.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2minterfacefactory.h" +#include "m2minterfaceobserver.h" +#include "m2mserver.h" +#include "m2mdevice.h" +#include "m2mfirmware.h" + +class TestObserver : public M2MInterfaceObserver { + +public: + TestObserver(){} + void bootstrap_done(M2MSecurity */*server_object*/){} + void object_registered(M2MSecurity */*security_object*/, + const M2MServer &/*server_object*/) {} + + void object_unregistered(M2MSecurity */*server_object*/){} + + void registration_updated(M2MSecurity */*security_object*/, + const M2MServer &/*server_object*/){} + + void error(M2MInterface::Error /*error*/){} + + void value_updated(M2MBase */*base*/, M2MBase::BaseType /*type*/){} +}; + +Test_M2MInterfaceFactory::Test_M2MInterfaceFactory() +{ +} + +Test_M2MInterfaceFactory::~Test_M2MInterfaceFactory() +{ + +} + +void Test_M2MInterfaceFactory::test_create_interface() +{ + TestObserver test_obs; + M2MInterface *test = M2MInterfaceFactory::create_interface(test_obs, + "endpoint_name", + "endpoint_type", + 120, + 8000, + "domain"); + CHECK(test != NULL); + delete test; + test = NULL; + + // Endpoint name and type of length more than 64 characters + test = M2MInterfaceFactory::create_interface(test_obs, + "endpoint_name-very-long-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1", + "endpoint_type-very-long-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1", + 120, + 8000, + "domain"); + CHECK(test == NULL); + delete test; + + // Domain length more than 64 characters + test = M2MInterfaceFactory::create_interface(test_obs, + "endpoint_name", + "endpoint_type", + 120, + 8000, + "domaidomaindomaindomaindomaindomaindomaindomaindomaindomaindomaindomaindomaindomain"); + CHECK(test == NULL); + delete test; + +} + +void Test_M2MInterfaceFactory::test_create_security() +{ + M2MSecurity *test = M2MInterfaceFactory::create_security(M2MSecurity::Bootstrap); + CHECK(test != NULL); + delete test; + test = NULL; +} + +void Test_M2MInterfaceFactory::test_create_device() +{ + M2MDevice *test = M2MInterfaceFactory::create_device(); + CHECK(test != NULL); + delete test; + test = NULL; +} + +void Test_M2MInterfaceFactory::test_create_firmware() +{ + M2MFirmware *test = M2MInterfaceFactory::create_firmware(); + CHECK(test != NULL); + delete test; + test = NULL; +} + +void Test_M2MInterfaceFactory::test_create_server() +{ + M2MServer *test = M2MInterfaceFactory::create_server(); + CHECK(test != NULL); + delete test; + test = NULL; +} + +void Test_M2MInterfaceFactory::test_create_object() +{ + M2MObject *test = M2MInterfaceFactory::create_object("name"); + CHECK(test != NULL); + delete test; + test = NULL; + + // Length 65, should fail + String max_lenght = "65656565656565656565656565656565656565656565656565656565656565656"; + CHECK(M2MInterfaceFactory::create_object("") == NULL); + CHECK(M2MInterfaceFactory::create_object(max_lenght) == NULL); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfacefactory/test_m2minterfacefactory.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_INTERFACE_FACTORY_H +#define TEST_M2M_INTERFACE_FACTORY_H + +#include "m2minterfacefactory.h" + +class Test_M2MInterfaceFactory +{ + +public: + Test_M2MInterfaceFactory(); + virtual ~Test_M2MInterfaceFactory(); + + void test_create_interface(); + + void test_create_security(); + + void test_create_device(); + + void test_create_firmware(); + + void test_create_server(); + + void test_create_object(); +}; + +#endif // TEST_M2M_INTERFACE_FACTORY_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfaceimpl/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,34 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2minterfaceimpl + "main.cpp" + "m2minterfaceimpltest.cpp" + "test_m2minterfaceimpl.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2msecurity_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/m2mnsdlinterface_stub.cpp" + "../stub/m2mconnectionhandler_stub.cpp" + "../stub/m2mconnectionsecurity_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../stub/m2mserver_stub.cpp" + "../../../../source/m2minterfaceimpl.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2minterfaceimpl + CppUTest + CppUTestExt +) +set_target_properties(m2minterfaceimpl +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2minterfaceimpl") +add_test(m2minterfaceimpl ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfaceimpl/m2minterfaceimpltest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2minterfaceimpl.h" +#include "m2mnsdlinterface_stub.h" + +TEST_GROUP(M2MInterfaceImpl) +{ + Test_M2MInterfaceImpl* m2m_interface_impl; + + void setup() + { + m2mnsdlinterface_stub::string_value = new String(); + m2m_interface_impl = new Test_M2MInterfaceImpl(); + } + void teardown() + { + delete m2mnsdlinterface_stub::string_value; + delete m2m_interface_impl; + } +}; + +TEST(M2MInterfaceImpl, create) +{ + CHECK(m2m_interface_impl->impl != NULL); +} + +TEST(M2MInterfaceImpl, test_constructor) +{ + m2m_interface_impl->test_constructor(); +} + +TEST(M2MInterfaceImpl, bootstrap) +{ + m2m_interface_impl->test_bootstrap(); +} + +TEST(M2MInterfaceImpl, cancel_bootstrap) +{ + m2m_interface_impl->test_cancel_bootstrap(); +} + +TEST(M2MInterfaceImpl, register_object) +{ + m2m_interface_impl->test_register_object(); +} + +TEST(M2MInterfaceImpl, update_registration) +{ + m2m_interface_impl->test_update_registration(); +} + +TEST(M2MInterfaceImpl, unregister_object) +{ + m2m_interface_impl->test_unregister_object(); +} + +TEST(M2MInterfaceImpl, set_queue_sleep_handler) +{ + m2m_interface_impl->test_set_queue_sleep_handler(); +} + +TEST(M2MInterfaceImpl, test_set_random_number_callback) +{ + m2m_interface_impl->test_set_random_number_callback(); +} + +TEST(M2MInterfaceImpl, test_set_entropy_callback) +{ + m2m_interface_impl->test_set_entropy_callback(); +} + +TEST(M2MInterfaceImpl, test_set_platform_network_handler) +{ + m2m_interface_impl->test_set_platform_network_handler(); +} + +TEST(M2MInterfaceImpl, coap_message_ready) +{ + m2m_interface_impl->test_coap_message_ready(); +} + +TEST(M2MInterfaceImpl, client_registered) +{ + m2m_interface_impl->test_client_registered(); +} + +TEST(M2MInterfaceImpl, test_registration_updated) +{ + m2m_interface_impl->test_registration_updated(); +} + +TEST(M2MInterfaceImpl, registration_error) +{ + m2m_interface_impl->test_registration_error(); +} + +TEST(M2MInterfaceImpl, client_unregistered) +{ + m2m_interface_impl->test_client_unregistered(); +} + +TEST(M2MInterfaceImpl, bootstrap_wait) +{ + m2m_interface_impl->test_bootstrap_wait(); +} + +TEST(M2MInterfaceImpl, bootstrap_done) +{ + m2m_interface_impl->test_bootstrap_done(); +} + +TEST(M2MInterfaceImpl, bootstrap_error) +{ + m2m_interface_impl->test_bootstrap_error(); +} + +TEST(M2MInterfaceImpl, coap_data_processed) +{ + m2m_interface_impl->test_coap_data_processed(); +} + +TEST(M2MInterfaceImpl, test_value_updated) +{ + m2m_interface_impl->test_value_updated(); +} + +TEST(M2MInterfaceImpl, data_available) +{ + m2m_interface_impl->test_data_available(); +} + +TEST(M2MInterfaceImpl, socket_error) +{ + m2m_interface_impl->test_socket_error(); +} + +TEST(M2MInterfaceImpl, address_ready) +{ + m2m_interface_impl->test_address_ready(); +} + +TEST(M2MInterfaceImpl, data_sent) +{ + m2m_interface_impl->test_data_sent(); +} + +TEST(M2MInterfaceImpl, timer_expired) +{ + m2m_interface_impl->test_timer_expired(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfaceimpl/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MInterfaceImpl);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfaceimpl/test_m2minterfaceimpl.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,767 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2minterfaceimpl.h" +#include "m2minterfaceobserver.h" +#include "m2mconnectionhandler_stub.h" +#include "m2msecurity_stub.h" +#include "m2mnsdlinterface_stub.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mbase.h" + +entropy_cb ent_cb; + +class TestObserver : public M2MInterfaceObserver { + +public: + TestObserver() : val_updated(false), error_occured(false), + registered(false), unregistered(false), bootstrapped(false) + { + } + + virtual ~TestObserver(){} + void bootstrap_done(M2MSecurity */*server_object*/){ + bootstrapped = true; + } + + void object_registered(M2MSecurity */*security_object*/, + const M2MServer &/*server_object*/) { + registered = true; + } + + void object_unregistered(M2MSecurity */*server_object*/){ + unregistered = true; + } + + void registration_updated(M2MSecurity */*security_object*/, + const M2MServer &/*server_object*/){ + registered = true; + } + + void error(M2MInterface::Error /*error*/){ + error_occured = true; + } + + void value_updated(M2MBase *, M2MBase::BaseType ){ + val_updated = true; + } + + bool val_updated; + bool error_occured; + bool registered; + bool unregistered; + bool bootstrapped; +}; + +class M2MBaseTest : public M2MBase +{ +public: + M2MBaseTest() : M2MBase("a", M2MBase::Static, "type","a",false){} +}; + +Test_M2MInterfaceImpl::Test_M2MInterfaceImpl() +{ + observer = new TestObserver(); + impl = new M2MInterfaceImpl(*observer, + "endpoint_name", + "endpoint_type", + 120, + 8000, + "domain"); +} + +Test_M2MInterfaceImpl:: ~Test_M2MInterfaceImpl() +{ + delete observer; + delete impl; +} + +void Test_M2MInterfaceImpl::test_constructor() +{ + TestObserver obs; + + M2MInterfaceImpl* obj = new M2MInterfaceImpl(obs, + "endpoint_name", + "endpoint_type", + 120, + 8000, + "domain", + M2MInterface::TCP); + CHECK(obj->_current_state == 0); + //TODO: Check rest of variables + delete obj; + obj = new M2MInterfaceImpl(obs, + "endpoint_name", + "endpoint_type", + 120, + 8000, + "domain", + M2MInterface::TCP_QUEUE); + delete obj; +} + +void Test_M2MInterfaceImpl::test_bootstrap() +{ + M2MSecurity *sec = new M2MSecurity(M2MSecurity::Bootstrap); + m2msecurity_stub::int_value = 2; + String *val = new String("coaps://[2001:12:12:23::23:FF]:5685"); + + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + + + impl->bootstrap(NULL); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + impl->bootstrap(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP); + + delete val; + + val = new String("coaps://[10.45.3.83:5685"); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + impl->_security = NULL; + impl->bootstrap(sec); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + delete val; + + val = new String("coaps://10.45.3.83]:5685"); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + impl->_security = NULL; + impl->bootstrap(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + delete val; + + val = new String("coap://10.45.3.83:5685"); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + impl->_security = NULL; + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + impl->bootstrap(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP); + + delete val; + + val = new String("coap://10.45.3.83:5685"); + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + impl->bootstrap(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP); + + delete val; + + val = new String("coap://10.45.3.83:5685"); + m2msecurity_stub::string_value = val; + m2mconnectionhandler_stub::bool_value = true; + + impl->bootstrap(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + m2mconnectionhandler_stub::bool_value = false; + + // Ignore the event. + impl->_current_state = M2MInterfaceImpl::STATE_WAITING; + impl->bootstrap(sec); + + m2mconnectionhandler_stub::bool_value = true; + + impl->bootstrap(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + CHECK(observer->error_occured == true); + + delete val; + val = NULL; + + delete sec; +} + +void Test_M2MInterfaceImpl::test_cancel_bootstrap() +{ + // Check for coverage, currently no implementation + impl->cancel_bootstrap(); +} + +void Test_M2MInterfaceImpl::test_register_object() +{ + M2MSecurity *sec = new M2MSecurity(M2MSecurity::M2MServer); + m2msecurity_stub::int_value = 2; + + M2MObject *object = new M2MObject("test", "test"); + M2MObjectInstance *ins = object->create_object_instance(); + ins->create_dynamic_resource("test","type",M2MResourceInstance::STRING,false,false); + + M2MObjectList list; + list.push_back(object); + + String *val = new String("coaps://[2001:12:12:23::23:FF]:5685"); + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + + impl->register_object(NULL,list); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + impl->register_object(sec,list); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTER); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + impl->register_object(sec,list); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTER); + + delete val; + val = new String("coaps://[10.45.3.83:5685"); + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + + delete impl->_security; + impl->_security = NULL; + sec = new M2MSecurity(M2MSecurity::M2MServer); + impl->register_object(sec,list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + observer->error_occured = false; + delete val; + val = new String("coaps://10.45.3.83]:5685"); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + + delete impl->_security; + impl->_security = NULL; + sec = new M2MSecurity(M2MSecurity::M2MServer); + impl->register_object(sec,list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + observer->error_occured = false; + delete val; + val = new String("coaps://10.45.3.83:5685"); + delete impl->_security; + impl->_security = NULL; + sec = new M2MSecurity(M2MSecurity::M2MServer); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + + impl->register_object(sec,list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTER); + + observer->error_occured = false; + delete val; + val = new String("coap://10.45.3.83:5685"); + delete impl->_security; + impl->_security = NULL; + sec = new M2MSecurity(M2MSecurity::M2MServer); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + + m2msecurity_stub::string_value = val; + m2mnsdlinterface_stub::bool_value = true; + m2mconnectionhandler_stub::bool_value = true; + + impl->register_object(sec,list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTER); + + delete val; + val = new String("coap://10.45.3.83:5685"); + impl->register_object(sec,list); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTER); + + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + m2mconnectionhandler_stub::bool_value = true; + m2mnsdlinterface_stub::bool_value = false; + + delete impl->_security; + impl->_security = NULL; + sec = new M2MSecurity(M2MSecurity::M2MServer); + impl->register_object(sec,list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + impl->_current_state = M2MInterfaceImpl::STATE_BOOTSTRAP; + m2mconnectionhandler_stub::bool_value = true; + m2mnsdlinterface_stub::bool_value = true; + + impl->register_object(sec,list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP); + CHECK(observer->error_occured == true); + + impl->_current_state = M2MInterfaceImpl::STATE_BOOTSTRAP; + m2mconnectionhandler_stub::bool_value = true; + m2mnsdlinterface_stub::bool_value = true; + + impl->register_object(sec,list); + + CHECK(observer->error_occured == true); + + + delete val; + val = NULL; + + list.clear(); + delete object; + delete sec; +} + +void Test_M2MInterfaceImpl::test_update_registration() +{ + impl->_current_state = M2MInterfaceImpl::STATE_REGISTERED; + m2mnsdlinterface_stub::bool_value = true; + impl->update_registration(NULL,120); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_UPDATE_REGISTRATION); + + impl->_current_state = M2MInterfaceImpl::STATE_REGISTERED; + m2mnsdlinterface_stub::bool_value = false; + impl->update_registration(NULL,120); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_UPDATE_REGISTRATION); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + impl->update_registration(NULL,120); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + impl->_current_state = M2MInterfaceImpl::STATE_BOOTSTRAP; + impl->update_registration(NULL,120); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP); + CHECK(observer->error_occured == true); + + impl->update_registration(NULL,30); + CHECK(observer->error_occured == true); + + impl->update_registration(NULL,120); + CHECK(observer->error_occured == true); + + + M2MObject *object = new M2MObject("test", "test"); + M2MObjectInstance *ins = object->create_object_instance(); + ins->create_dynamic_resource("test","type",M2MResourceInstance::STRING,false,false); + + M2MObjectList list; + list.push_back(object); + impl->_current_state = M2MInterfaceImpl::STATE_REGISTERED; + m2mnsdlinterface_stub::bool_value = false; + impl->update_registration(NULL, list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_UPDATE_REGISTRATION); + list.clear(); + + impl->_current_state = M2MInterfaceImpl::STATE_REGISTERED; + m2mnsdlinterface_stub::bool_value = false; + impl->update_registration(NULL, list); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_UPDATE_REGISTRATION); + delete object; + +} + +void Test_M2MInterfaceImpl::test_unregister_object() +{ + impl->_current_state = M2MInterfaceImpl::STATE_REGISTERED; + m2mnsdlinterface_stub::bool_value = true; + + impl->unregister_object(NULL); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + impl->_current_state = M2MInterfaceImpl::STATE_REGISTERED; + m2mnsdlinterface_stub::bool_value = false; + + impl->unregister_object(NULL); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + impl->_current_state = M2MInterfaceImpl::STATE_IDLE; + + impl->unregister_object(NULL); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); +} + +void Test_M2MInterfaceImpl::test_set_queue_sleep_handler() +{ + callback_handler cb(this,&Test_M2MInterfaceImpl::test_callback_handler); + impl->set_queue_sleep_handler(cb); + CHECK(impl->_callback_handler != NULL); + + callback_handler cb1(NULL); + impl->set_queue_sleep_handler(cb1); + CHECK(impl->_callback_handler == NULL); +} + + +void Test_M2MInterfaceImpl::test_set_random_number_callback() +{ + random_number_cb cb(&test_random_callback); + impl->set_random_number_callback(cb); +} + +void Test_M2MInterfaceImpl::test_set_entropy_callback() +{ + impl->set_entropy_callback(ent_cb); +} + +void Test_M2MInterfaceImpl::test_set_platform_network_handler() +{ + void *test = NULL; + impl->set_platform_network_handler(test); +} + +void Test_M2MInterfaceImpl::test_coap_message_ready() +{ + m2mconnectionhandler_stub::bool_value = true; + uint8_t *data_ptr = (uint8_t *)malloc(sizeof(uint8_t)); + uint16_t data_len = sizeof(uint8_t); + sn_nsdl_addr_s *address_ptr = (sn_nsdl_addr_s*)malloc(sizeof(sn_nsdl_addr_s)); + + impl->coap_message_ready(data_ptr,data_len,address_ptr); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + impl->_current_state = M2MInterfaceImpl::STATE_WAITING; + impl->coap_message_ready(data_ptr,data_len,address_ptr); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + m2mconnectionhandler_stub::bool_value = false; + impl->coap_message_ready(data_ptr,data_len,address_ptr); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + free(address_ptr); + free(data_ptr); +} + +void Test_M2MInterfaceImpl::test_client_registered() +{ + impl->client_registered(NULL); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTERED); + CHECK(observer->registered == true); +} + +void Test_M2MInterfaceImpl::test_registration_updated() +{ + M2MServer *server = NULL; + impl->registration_updated(*server); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTERED); + CHECK(observer->registered == true); +} + +void Test_M2MInterfaceImpl::test_registration_error() +{ + impl->registration_error(1); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + observer->error_occured = false; + impl->registration_error(1, true); + CHECK(observer->error_occured == false); +} + +void Test_M2MInterfaceImpl::test_client_unregistered() +{ + impl->client_unregistered(); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->unregistered == true); +} + +void Test_M2MInterfaceImpl::test_bootstrap_wait() +{ + M2MSecurity *sec = new M2MSecurity(M2MSecurity::M2MServer); + impl->bootstrap_wait(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP_WAIT); + CHECK(impl->_security == sec); + CHECK(observer->bootstrapped == false); + + delete sec; +} + + +void Test_M2MInterfaceImpl::test_bootstrap_done() +{ + M2MSecurity *sec = new M2MSecurity(M2MSecurity::M2MServer); + impl->bootstrap_done(sec); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAPPED); + CHECK(observer->bootstrapped == true); + + delete sec; +} + +void Test_M2MInterfaceImpl::test_bootstrap_error() +{ + impl->bootstrap_error(); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); +} + +void Test_M2MInterfaceImpl::test_coap_data_processed() +{ + impl->coap_data_processed(); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); +} + +void Test_M2MInterfaceImpl::test_value_updated() +{ + impl->value_updated(NULL); + CHECK(observer->val_updated == false); + + M2MBaseTest b; + impl->value_updated(&b); + CHECK(observer->val_updated == true); +} + +void Test_M2MInterfaceImpl::test_data_available() +{ + uint8_t* data = (uint8_t*)malloc(sizeof(uint8_t)); + uint16_t data_size = sizeof(uint8_t); + M2MConnectionObserver::SocketAddress *address = (M2MConnectionObserver::SocketAddress*) + malloc(sizeof(M2MConnectionObserver::SocketAddress)); + + address->_stack = M2MInterface::LwIP_IPv4; + m2mnsdlinterface_stub::bool_value = true; + + impl->data_available(data,data_size,*address); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + address->_stack = M2MInterface::LwIP_IPv6; + m2mnsdlinterface_stub::bool_value = true; + + impl->data_available(data,data_size,*address); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + address->_stack = M2MInterface::LwIP_IPv4; + m2mnsdlinterface_stub::bool_value = false; + + impl->data_available(data,data_size,*address); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + CHECK(observer->error_occured == true); + + free(data); + free(address); +} + +void Test_M2MInterfaceImpl::test_socket_error() +{ + for (int i = 0; i <= MBED_CLIENT_RECONNECTION_COUNT; i++) { + impl->socket_error(M2MConnectionHandler::SSL_CONNECTION_ERROR); + impl->_retry_timer_expired = true; + } + CHECK(observer->error_occured == true); + + observer->error_occured = false; + impl->socket_error(M2MConnectionHandler::SOCKET_READ_ERROR, false); + CHECK(observer->error_occured == true); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + observer->error_occured = false; + impl->socket_error(M2MConnectionHandler::DNS_RESOLVING_ERROR, false); + CHECK(observer->error_occured == true); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + observer->error_occured = false; + impl->socket_error(M2MConnectionHandler::SOCKET_SEND_ERROR, false); + CHECK(observer->error_occured == true); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + observer->error_occured = false; + impl->socket_error(M2MConnectionHandler::SSL_HANDSHAKE_ERROR, false); + CHECK(observer->error_occured == true); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + observer->error_occured = false; + impl->socket_error(M2MConnectionHandler::SOCKET_ABORT, false); + CHECK(observer->error_occured == true); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + + observer->error_occured = false; + impl->socket_error(M2MConnectionHandler::ERROR_NONE, false); + CHECK(observer->error_occured == false); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); +} + +void Test_M2MInterfaceImpl::test_address_ready() +{ + M2MConnectionObserver::SocketAddress *address = + (M2MConnectionObserver::SocketAddress*) malloc(sizeof(M2MConnectionObserver::SocketAddress)); + M2MConnectionObserver::ServerType server_type = M2MConnectionObserver::Bootstrap; + uint16_t server_port = 5685; + + address->_stack = M2MInterface::LwIP_IPv6; + m2mnsdlinterface_stub::bool_value = true; + + impl->address_ready(*address,server_type,server_port); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP_RESOURCE_CREATED); + + address->_stack = M2MInterface::LwIP_IPv4; + m2mnsdlinterface_stub::bool_value = true; + + impl->address_ready(*address,server_type,server_port); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_BOOTSTRAP_RESOURCE_CREATED); + + + address->_stack = M2MInterface::LwIP_IPv6; + m2mnsdlinterface_stub::bool_value = false; + + impl->address_ready(*address,server_type,server_port); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + // Test for Address resolving for LWM2M server + server_type = M2MConnectionObserver::LWM2MServer; + + address->_stack = M2MInterface::LwIP_IPv4; + m2mnsdlinterface_stub::bool_value = true; + + impl->address_ready(*address,server_type,server_port); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTER_ADDRESS_RESOLVED); + + impl->address_ready(*address,server_type,server_port); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_REGISTER_ADDRESS_RESOLVED); + + address->_stack = M2MInterface::LwIP_IPv6; + m2mnsdlinterface_stub::bool_value = false; + + impl->address_ready(*address,server_type,server_port); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_IDLE); + CHECK(observer->error_occured == true); + + free(address); +} + +void Test_M2MInterfaceImpl::test_data_sent() +{ + m2mconnectionhandler_stub::bool_value = true; + + impl->data_sent(); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + m2mconnectionhandler_stub::bool_value = false; + + impl->data_sent(); + + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + CHECK(observer->error_occured == false); + + impl->_callback_handler = callback_handler(this, &Test_M2MInterfaceImpl::test_callback_handler); + + m2mconnectionhandler_stub::bool_value = true; + + impl->_binding_mode = M2MInterface::UDP_QUEUE; + impl->data_sent(); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + impl->_binding_mode = M2MInterface::TCP_QUEUE; + impl->data_sent(); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + impl->_binding_mode = M2MInterface::SMS_QUEUE; + impl->data_sent(); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); + + impl->_binding_mode = M2MInterface::UDP_SMS_QUEUE; + impl->data_sent(); + CHECK(impl->_current_state == M2MInterfaceImpl::STATE_WAITING); +} + +void Test_M2MInterfaceImpl::test_timer_expired() +{ + visited = false; + impl->_callback_handler = NULL; + impl->timer_expired(M2MTimerObserver::QueueSleep); + CHECK(visited == false); + + impl->_callback_handler = callback_handler(this, &Test_M2MInterfaceImpl::test_callback_handler); + + visited = false; + impl->timer_expired(M2MTimerObserver::QueueSleep); + CHECK(visited == true); + visited = false; + + impl->_bootstrapped = true; + impl->timer_expired(M2MTimerObserver::RetryTimer); + CHECK(impl->_retry_timer_expired == true); + + impl->_bootstrapped = false; + impl->timer_expired(M2MTimerObserver::RetryTimer); + CHECK(impl->_retry_timer_expired == true); + + observer->error_occured = false; + impl->timer_expired(M2MTimerObserver::BootstrapTimer); + CHECK(observer->error_occured == true); +} + +void Test_M2MInterfaceImpl::test_callback_handler() +{ + visited = true; +} + +uint32_t test_random_callback(void) +{ + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2minterfaceimpl/test_m2minterfaceimpl.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_INTERFACE_IMPL_H +#define TEST_M2M_INTERFACE_IMPL_H + +#include "m2minterfaceimpl.h" + +class TestObserver; + +uint32_t test_random_callback(void); + +class Test_M2MInterfaceImpl +{ +public: + Test_M2MInterfaceImpl(); + + virtual ~Test_M2MInterfaceImpl(); + + void test_constructor(); + + void test_bootstrap(); + + void test_cancel_bootstrap(); + + void test_register_object(); + + void test_update_registration(); + + void test_unregister_object(); + + void test_set_queue_sleep_handler(); + + void test_set_random_number_callback(); + + void test_set_entropy_callback(); + + void test_set_platform_network_handler(); + + void test_coap_message_ready(); + + void test_client_registered(); + + void test_registration_updated(); + + void test_registration_error(); + + void test_client_unregistered(); + + void test_bootstrap_done(); + + void test_bootstrap_wait(); + + void test_bootstrap_error(); + + void test_coap_data_processed(); + + void test_value_updated(); + + void test_data_available(); + + void test_socket_error(); + + void test_address_ready(); + + void test_data_sent(); + + void test_timer_expired(); + + void test_callback_handler(); + + M2MInterfaceImpl* impl; + TestObserver *observer; + bool visited; +}; + +#endif // TEST_M2M_INTERFACE_IMPL_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mnsdlinterface/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,35 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mnsdlinterface + "main.cpp" + "m2mnsdlinterfacetest.cpp" + "test_m2mnsdlinterface.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mserver_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2msecurity_stub.cpp" + "../stub/m2mconnectionsecurity_stub.cpp" + "../stub/m2mconnectionhandler_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/common_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../stub/m2mtlvserializer_stub.cpp" + "../stub/m2mtlvdeserializer_stub.cpp" + "../../../../source/m2mnsdlinterface.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mnsdlinterface + CppUTest + CppUTestExt +) +set_target_properties(m2mnsdlinterface +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mnsdlinterface") +add_test(m2mnsdlinterface ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mnsdlinterface/m2mnsdlinterfacetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mnsdlinterface.h" + +TEST_GROUP(M2MNsdlInterface) +{ + Test_M2MNsdlInterface* m2m_nsdl_interface; + + void setup() + { + m2m_nsdl_interface = new Test_M2MNsdlInterface(); + } + void teardown() + { + delete m2m_nsdl_interface; + m2m_nsdl_interface = NULL; + } +}; + +TEST(M2MNsdlInterface, create) +{ + CHECK(m2m_nsdl_interface->nsdl != NULL); +} + +TEST(M2MNsdlInterface, memory_free) +{ + m2m_nsdl_interface->test_memory_free(); +} + +TEST(M2MNsdlInterface, memory_alloc) +{ + m2m_nsdl_interface->test_memory_alloc(); +} + +TEST(M2MNsdlInterface, send_unregister_message) +{ + m2m_nsdl_interface->test_send_unregister_message(); +} + +TEST(M2MNsdlInterface, send_update_registration) +{ + m2m_nsdl_interface->test_send_update_registration(); +} + +TEST(M2MNsdlInterface, send_register_message) +{ + m2m_nsdl_interface->test_send_register_message(); +} + +TEST(M2MNsdlInterface, create_bootstrap_resource) +{ + m2m_nsdl_interface->test_create_bootstrap_resource(); +} + +TEST(M2MNsdlInterface, delete_nsdl_resource) +{ + m2m_nsdl_interface->test_delete_nsdl_resource(); +} + +TEST(M2MNsdlInterface, delete_endpoint) +{ + m2m_nsdl_interface->test_delete_endpoint(); +} + +TEST(M2MNsdlInterface, create_endpoint) +{ + m2m_nsdl_interface->test_create_endpoint(); +} + +TEST(M2MNsdlInterface, send_to_server_callback) +{ + m2m_nsdl_interface->test_send_to_server_callback(); +} + +TEST(M2MNsdlInterface, received_from_server_callback) +{ + m2m_nsdl_interface->test_received_from_server_callback(); +} + +TEST(M2MNsdlInterface, create_nsdl_list_structure) +{ + m2m_nsdl_interface->test_create_nsdl_list_structure(); +} + +TEST(M2MNsdlInterface, resource_callback) +{ + m2m_nsdl_interface->test_resource_callback(); +} + +TEST(M2MNsdlInterface, resource_callback_get) +{ + m2m_nsdl_interface->test_resource_callback_get(); +} + +TEST(M2MNsdlInterface, resource_callback_post) +{ + m2m_nsdl_interface->test_resource_callback_post(); +} + +TEST(M2MNsdlInterface, resource_callback_delete) +{ + m2m_nsdl_interface->test_resource_callback_delete(); +} + +TEST(M2MNsdlInterface, process_received_data) +{ + m2m_nsdl_interface->test_process_received_data(); +} + +TEST(M2MNsdlInterface, timer_expired) +{ + m2m_nsdl_interface->test_timer_expired(); +} + +TEST(M2MNsdlInterface, stop_timers) +{ + m2m_nsdl_interface->test_stop_timers(); +} + +TEST(M2MNsdlInterface, observation_to_be_sent) +{ + m2m_nsdl_interface->test_observation_to_be_sent(); +} + +TEST(M2MNsdlInterface, resource_to_be_deleted) +{ + m2m_nsdl_interface->test_resource_to_be_deleted(); +} + +TEST(M2MNsdlInterface, value_updated) +{ + m2m_nsdl_interface->test_value_updated(); +} + +TEST(M2MNsdlInterface, find_resource) +{ + m2m_nsdl_interface->test_find_resource(); +} + +TEST(M2MNsdlInterface, remove_object) +{ + m2m_nsdl_interface->test_remove_object(); +} + +TEST(M2MNsdlInterface, add_object_to_list) +{ + m2m_nsdl_interface->test_add_object_to_list(); +} + +TEST(M2MNsdlInterface, test_send_delayed_response) +{ + m2m_nsdl_interface->test_send_delayed_response(); +} + +TEST(M2MNsdlInterface, resource_callback_put) +{ + m2m_nsdl_interface->test_resource_callback_put(); +} + +TEST(M2MNsdlInterface, get_nsdl_handle) +{ + m2m_nsdl_interface->test_get_nsdl_handle(); +} + +TEST(M2MNsdlInterface, endpoint_name) +{ + m2m_nsdl_interface->test_endpoint_name(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mnsdlinterface/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MNsdlInterface);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mnsdlinterface/test_m2mnsdlinterface.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1799 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mnsdlinterface.h" +#include "common_stub.h" +#include "m2msecurity_stub.h" +#include "m2mnsdlobserver.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mresource.h" +#include "m2mbase_stub.h" +#include "m2mserver.h" +#include "m2msecurity.h" +#include "m2mtlvdeserializer_stub.h" +class TestObserver : public M2MNsdlObserver { + +public: + TestObserver(){} + virtual ~TestObserver(){} + void coap_message_ready(uint8_t *, + uint16_t, + sn_nsdl_addr_s *){ + message_ready = true; + } + + void client_registered(M2MServer *){ + registered = true; + } + + void registration_updated(const M2MServer &){ + register_updated = true; + } + + void registration_error(uint8_t, bool retry = false){ + register_error = true; + } + + void client_unregistered(){ + unregistered = true; + } + + void bootstrap_done(M2MSecurity *sec){ + if(sec) { + boot_done = true; + delete sec; + sec = NULL; + } + } + + void bootstrap_wait(M2MSecurity *sec){ + if(sec) { + boot_wait = true; + delete sec; + sec = NULL; + } + } + + void bootstrap_error(){ + boot_error = true; + } + + void coap_data_processed(){ + data_processed = true; + } + + void value_updated(M2MBase *){ + value_update = true; + } + + bool register_error; + bool boot_error; + bool boot_wait; + bool boot_done; + bool registered; + bool register_updated; + bool data_processed; + bool unregistered; + bool message_ready; + bool value_update; +}; + +struct nsdl_s { + uint16_t update_register_msg_id; + uint16_t register_msg_len; + uint16_t update_register_msg_len; + + uint16_t register_msg_id; + uint16_t unregister_msg_id; + + uint16_t bootstrap_msg_id; + uint16_t oma_bs_port; /* Bootstrap port */ + uint8_t oma_bs_address_len; /* Bootstrap address length */ + unsigned int sn_nsdl_endpoint_registered:1; + bool handle_bootstrap_msg:1; + + struct grs_s *grs; + uint8_t *oma_bs_address_ptr; /* Bootstrap address pointer. If null, no bootstrap in use */ + sn_nsdl_ep_parameters_s *ep_information_ptr; // Endpoint parameters, Name, Domain etc.. + sn_nsdl_oma_server_info_t *nsp_address_ptr; // NSP server address information + + void (*sn_nsdl_oma_bs_done_cb)(sn_nsdl_oma_server_info_t *server_info_ptr); /* Callback to inform application when bootstrap is done */ + void *(*sn_nsdl_alloc)(uint16_t); + void (*sn_nsdl_free)(void *); + uint8_t (*sn_nsdl_tx_callback)(struct nsdl_s *, sn_nsdl_capab_e , uint8_t *, uint16_t, sn_nsdl_addr_s *); + uint8_t (*sn_nsdl_rx_callback)(struct nsdl_s *, sn_coap_hdr_s *, sn_nsdl_addr_s *); + void (*sn_nsdl_oma_bs_done_cb_handle)(sn_nsdl_oma_server_info_t *server_info_ptr, + struct nsdl_s *handle); /* Callback to inform application when bootstrap is done with nsdl handle */ +}; + +Test_M2MNsdlInterface::Test_M2MNsdlInterface() +{ + observer = new TestObserver(); + nsdl = new M2MNsdlInterface(*observer); + //nsdl->_server = new M2MServer(); +} + +Test_M2MNsdlInterface:: ~Test_M2MNsdlInterface() +{ + delete nsdl; + nsdl = NULL; + delete observer; + observer = NULL; +} + +void Test_M2MNsdlInterface::test_create_endpoint() +{ + u_int8_t value[] = {"120"}; + if( nsdl->_endpoint == NULL){ + nsdl->_endpoint = (sn_nsdl_ep_parameters_s*)nsdl->memory_alloc(sizeof(sn_nsdl_ep_parameters_s)); + } + + nsdl->create_endpoint("name", "type",120,"domain",100,"context"); + CHECK(nsdl->_endpoint->lifetime_len == 3); + CHECK(*nsdl->_endpoint->lifetime_ptr == *value); +} + +void Test_M2MNsdlInterface::test_delete_endpoint() +{ + if( nsdl->_endpoint == NULL){ + nsdl->_endpoint = (sn_nsdl_ep_parameters_s*)nsdl->memory_alloc(sizeof(sn_nsdl_ep_parameters_s)); + } + nsdl->_endpoint->lifetime_ptr = (uint8_t*)malloc(sizeof(uint8_t)); + + nsdl->delete_endpoint(); + CHECK(nsdl->_endpoint == NULL); +} + +void Test_M2MNsdlInterface::test_create_nsdl_list_structure() +{ + String *name = new String("name"); + common_stub::int_value = 0; + m2mbase_stub::int_value = 0; + M2MObject *object = new M2MObject(*name, (char*)name->c_str()); + M2MObjectInstance* instance = new M2MObjectInstance(*object,*name, "", "name/0"); + + M2MResource* create_resource = new M2MResource(*instance, + *name, + *name, + M2MResourceInstance::INTEGER, + false, + "name"); + + M2MResourceInstance* res_instance = new M2MResourceInstance(*create_resource, *name, *name, + M2MResourceInstance::INTEGER, 0, (char*)name->c_str(), false); + + m2mobject_stub::instance_list.clear(); + m2mobject_stub::instance_list.push_back(instance); + + m2mobjectinstance_stub::resource_list.clear(); + m2mobjectinstance_stub::resource_list.push_back(create_resource); + + M2MObjectList list; + list.push_back(object); + + m2mbase_stub::string_value = name->c_str(); + m2mbase_stub::mode_value = M2MBase::Static; + + + CHECK(nsdl->create_nsdl_list_structure(list)== true); + + m2mresource_stub::bool_value = true; + m2mbase_stub::mode_value = M2MBase::Dynamic; + + m2mresource_stub::list.push_back(res_instance); + m2mresourceinstance_stub::base_type = M2MBase::Resource; + + CHECK(nsdl->create_nsdl_list_structure(list)== true); + + m2mbase_stub::mode_value = M2MBase::Directory; + CHECK(nsdl->create_nsdl_list_structure(list)== true); + + list.clear(); + delete object; + delete name; + name = NULL; + m2mobject_stub::instance_list.clear(); + delete instance; + instance = NULL; + m2mobjectinstance_stub::resource_list.clear(); + delete create_resource; + create_resource = NULL; + + m2mresource_stub::list.clear(); + delete res_instance; + res_instance = NULL; +} + +void Test_M2MNsdlInterface::test_delete_nsdl_resource() +{ + common_stub::int_value = 0; + M2MObject *object = new M2MObject("name", "name"); + + CHECK(nsdl->remove_nsdl_resource(object) == false); + + common_stub::int_value = 1; + + CHECK(nsdl->remove_nsdl_resource(object) == true); + delete object; +} + +void Test_M2MNsdlInterface::test_create_bootstrap_resource() +{ + common_stub::uint_value = 11; + CHECK(nsdl->create_bootstrap_resource(NULL, "") == true); + + common_stub::uint_value = 0; + CHECK(nsdl->create_bootstrap_resource(NULL, "") == false); +} + +void Test_M2MNsdlInterface::test_send_register_message() +{ + common_stub::uint_value = 12; + common_stub::int_value = 0; + CHECK(nsdl->send_register_message(NULL,4,100,SN_NSDL_ADDRESS_TYPE_IPV6) == true); + + common_stub::uint_value = 0; + CHECK(nsdl->send_register_message(NULL,4,100,SN_NSDL_ADDRESS_TYPE_IPV6) == false); +} + +void Test_M2MNsdlInterface::test_send_update_registration() +{ + common_stub::uint_value = 23; + nsdl->_nsdl_handle = (nsdl_s*)malloc(sizeof(1)); + CHECK(nsdl->send_update_registration(120) == true); + + // Update lifetime value + common_stub::uint_value = 1; + CHECK(nsdl->send_update_registration(100) == true); + + // Lifetime value is 0, don't change the existing lifetime value + common_stub::uint_value = 1; + CHECK(nsdl->send_update_registration(0) == true); + + free(nsdl->_nsdl_handle); +} + +void Test_M2MNsdlInterface::test_send_unregister_message() +{ + common_stub::uint_value = 22; + CHECK(nsdl->send_unregister_message() == true); + + // Unreg already in progress + common_stub::uint_value = 0; + CHECK(nsdl->send_unregister_message() == true); +} + +void Test_M2MNsdlInterface::test_memory_alloc() +{ + CHECK(nsdl->memory_alloc(0) == 0); + uint8_t *ptr = 0; + ptr = (uint8_t*)nsdl->memory_alloc(sizeof(uint8_t)); + CHECK(ptr != NULL); + nsdl->memory_free(ptr); +} + +void Test_M2MNsdlInterface::test_memory_free() +{ + uint8_t *ptr = (uint8_t*)nsdl->memory_alloc(sizeof(uint8_t)); + nsdl->memory_free((void*)ptr); + //memory leak test will fail, if there is a leak, so no need for CHECK +} + +void Test_M2MNsdlInterface::test_send_to_server_callback() +{ + uint8_t *data_ptr = (uint8_t*)malloc(sizeof(uint8_t)); + uint16_t data_len = sizeof(uint8_t); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + + nsdl->send_to_server_callback(NULL, SN_NSDL_PROTOCOL_COAP, data_ptr,data_len,address); + CHECK(observer->message_ready == true); + + free(data_ptr); + free(address); +} + +void Test_M2MNsdlInterface::test_received_from_server_callback() +{ + nsdl_s* handle = (nsdl_s*)malloc(sizeof(nsdl_s)); + memset(handle,0,sizeof(nsdl_s)); + + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_CREATED; + + + coap_header->options_list_ptr = (sn_coap_options_list_s *)malloc(sizeof(sn_coap_options_list_s)); + memset(coap_header->options_list_ptr, 0, sizeof(sn_coap_options_list_s)); + + coap_header->options_list_ptr->max_age = 2; + + coap_header->options_list_ptr->location_path_len = 2; + coap_header->options_list_ptr->location_path_ptr = (uint8_t *)malloc(sizeof(coap_header->options_list_ptr->location_path_len)); + memset(coap_header->options_list_ptr->location_path_ptr, 0, sizeof(coap_header->options_list_ptr->location_path_len)); + + observer->data_processed = false; + observer->registered = false; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->registered == true); + + free(nsdl->_endpoint->lifetime_ptr); + nsdl->_endpoint->lifetime_ptr = NULL; + + free(nsdl->_endpoint->location_ptr); + nsdl->_endpoint->location_ptr = NULL; + + uint8_t life1[] = {"120"}; + nsdl->_endpoint->lifetime_ptr = (uint8_t*)malloc(sizeof(life1)); + memcpy(nsdl->_endpoint->lifetime_ptr,life1,sizeof(life1)); + nsdl->_endpoint->lifetime_len = (uint8_t)sizeof(life1); + + observer->data_processed = false; + observer->registered = false; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->registered == true); + + free(coap_header->options_list_ptr->location_path_ptr); + coap_header->options_list_ptr->location_path_ptr = NULL; + + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + + free(nsdl->_endpoint->lifetime_ptr); + nsdl->_endpoint->lifetime_ptr = NULL; + + uint8_t life[] = {"120"}; + nsdl->_endpoint->lifetime_ptr = (uint8_t*)malloc(sizeof(life)); + memcpy(nsdl->_endpoint->lifetime_ptr,life,sizeof(life)); + nsdl->_endpoint->lifetime_len = (uint8_t)sizeof(life); + + observer->data_processed = false; + observer->registered = false; + + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->registered == true); + free(nsdl->_endpoint->lifetime_ptr); + nsdl->_endpoint->lifetime_ptr = NULL; + + uint8_t big_life[] = {"4000"}; + nsdl->_endpoint->lifetime_ptr = (uint8_t*)malloc(sizeof(big_life)); + memcpy(nsdl->_endpoint->lifetime_ptr,big_life,sizeof(big_life)); + nsdl->_endpoint->lifetime_len = (uint8_t)sizeof(big_life); + observer->data_processed = false; + observer->registered = false; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->registered == true); + + free(nsdl->_endpoint->lifetime_ptr); + nsdl->_endpoint->lifetime_ptr = NULL; + + observer->data_processed = false; + observer->registered = false; + + uint8_t less_life[] = {"30"}; + nsdl->_endpoint->lifetime_ptr = (uint8_t*)malloc(sizeof(less_life)); + memcpy(nsdl->_endpoint->lifetime_ptr,less_life,sizeof(less_life)); + nsdl->_endpoint->lifetime_len = (uint8_t)sizeof(less_life); + + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->registered == true); + + observer->data_processed = false; + observer->registered = false; + observer->unregistered = false; + observer->register_error = false; + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_OPTION; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_INCOMPLETE; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_PRECONDITION_FAILED; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_UNAUTHORIZED; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_FORBIDDEN; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_NOT_FOUND; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_GATEWAY; + coap_header->coap_status = COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->data_processed == true); + CHECK(observer->register_error == true); + + + coap_header->msg_id = 8; + handle->unregister_msg_id = 8; + + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_DELETED; + observer->register_error = false; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->unregistered == true); + + observer->register_error = false; + handle->unregister_msg_id = 8; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_CREATED; + + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->register_error == true); + + observer->register_error = false; + handle->unregister_msg_id = 8; + coap_header->coap_status = COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->register_error == true); + + observer->register_error = false; + handle->unregister_msg_id = 8; + coap_header->coap_status = COAP_STATUS_PARSER_ERROR_IN_HEADER; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->register_error == true); + + observer->register_error = false; + handle->unregister_msg_id = 8; + coap_header->coap_status = COAP_STATUS_PARSER_ERROR_IN_HEADER; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_GATEWAY_TIMEOUT; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->register_error == true); + + // Receive initial bs message with error + handle->unregister_msg_id = 0; + observer->boot_error = false; + nsdl->_bootstrap_id = 8; + handle->bootstrap_msg_id = 8; + coap_header->coap_status = COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->boot_error == true); + + //_update_id == msg_id + handle->update_register_msg_id = 10; + coap_header->msg_id = 10; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->register_updated == true); + + coap_header->msg_id = 10; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_FORBIDDEN; + coap_header->coap_status = COAP_STATUS_OK; + nsdl->received_from_server_callback(handle,coap_header,NULL); + CHECK(observer->register_error == true); + + coap_header->msg_id = 11; + CHECK( 0== nsdl->received_from_server_callback(handle,coap_header,NULL) ); + + handle->update_register_msg_id = 0; + handle->register_msg_id = 0; + handle->unregister_msg_id = 0; + coap_header->msg_id = 10; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + uint8_t object[] = {"name"}; + + coap_header->uri_path_ptr = object; + coap_header->uri_path_len = sizeof(object); + + CHECK(0== nsdl->received_from_server_callback(handle,coap_header,NULL)); + + //Test methods that are not allowed + coap_header->msg_code = COAP_MSG_CODE_REQUEST_GET; + nsdl->received_from_server_callback(handle,coap_header,NULL); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + nsdl->received_from_server_callback(handle,coap_header,NULL); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_DELETE; + nsdl->received_from_server_callback(handle,coap_header,NULL); + + //Continue testing with post method + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + uint8_t object_instance[] = {"name/0"}; + + coap_header->uri_path_ptr = object_instance; + coap_header->uri_path_len = sizeof(object_instance); + + coap_header->payload_ptr = (uint8_t*)malloc(1); + m2mobjectinstance_stub::bool_value = true; + CHECK(0== nsdl->received_from_server_callback(handle,coap_header,NULL)); + + M2MObject *obj = new M2MObject("name", "name"); + + m2mbase_stub::string_value = "name"; + m2mbase_stub::nsdl_resource = + (sn_nsdl_dynamic_resource_parameters_s*) malloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*) malloc(sizeof(sn_nsdl_static_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters->path = (uint8_t*)malloc(5); + m2mbase_stub::nsdl_resource->static_resource_parameters->path[0] = 'n'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[1] = 'a'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[2] = 'm'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[3] = 'e'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[4] = '\0'; + m2mbase_stub::nsdl_resource->static_resource_parameters->pathlen = 5; + + nsdl->_object_list.push_back(obj); + + m2mobject_stub::inst = new M2MObjectInstance(*obj, "name", "", ""); + + m2mobject_stub::header = (sn_coap_hdr_s*) malloc(sizeof(sn_coap_hdr_s)); + memset(m2mobject_stub::header,0,sizeof(sn_coap_hdr_s)); + + m2mobjectinstance_stub::header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(m2mobjectinstance_stub::header, 0, sizeof(sn_coap_hdr_s)); + m2mobjectinstance_stub::header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + common_stub::coap_header = NULL; + m2mobjectinstance_stub::base_type = M2MBase::ObjectInstance; + + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,NULL)); + m2mobjectinstance_stub::header = NULL; + + m2mobjectinstance_stub::header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(m2mobjectinstance_stub::header, 0, sizeof(sn_coap_hdr_s)); + + m2mobjectinstance_stub::header->msg_code = COAP_MSG_CODE_RESPONSE_CREATED; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,NULL)); + m2mobjectinstance_stub::header = NULL; + + free(coap_header->payload_ptr); + coap_header->payload_ptr = NULL; + + CHECK(0== nsdl->received_from_server_callback(handle,coap_header,NULL)); + + delete m2mobject_stub::inst; + nsdl->_object_list.clear(); + delete obj; + + free(coap_header->payload_ptr); + free(m2mobject_stub::header); + m2mobject_stub::header = NULL; + + uint8_t object_instance1[] = {"name/65536"}; + + coap_header->uri_path_ptr = object_instance1; + coap_header->uri_path_len = sizeof(object_instance1); + + obj = new M2MObject("name", "name"); + + nsdl->_object_list.push_back(obj); + + m2mobject_stub::inst = new M2MObjectInstance(*obj, "name", "", ""); + + m2mobject_stub::header = (sn_coap_hdr_s*) malloc(sizeof(sn_coap_hdr_s)); + memset(m2mobject_stub::header,0,sizeof(sn_coap_hdr_s)); + + CHECK(0== nsdl->received_from_server_callback(handle,coap_header,NULL)); + + delete m2mobject_stub::inst; + nsdl->_object_list.clear(); + delete obj; + + free(m2mobject_stub::header); + + uint8_t resource[] = {"name/0/resource"}; + + coap_header->uri_path_ptr = resource; + coap_header->uri_path_len = sizeof(resource); + + CHECK(0== nsdl->received_from_server_callback(handle,coap_header,NULL)); + + // Test EMPTY ACK + coap_header->msg_code = COAP_MSG_CODE_EMPTY; + obj = new M2MObject("0", "0"); + m2mbase_stub::string_value = "0"; + nsdl->_object_list.push_back(obj); + m2mobject_stub::inst = new M2MObjectInstance(*obj, "name", "", ""); + + uint8_t *token = (uint8_t*) malloc(4); + token[0] = 't'; + token[1] = 'o'; + token[2] = 'k'; + token[3] = 'e'; + coap_header->token_ptr = token; + coap_header->token_len = 4; + + M2MResource res2(*m2mobject_stub::inst, "test","test",M2MResourceInstance::STRING,false, "test"); + m2mbase_stub::object_token = token; + m2mbase_stub::object_token_len = 4; + m2mobject_stub::base_type = M2MBase::Resource; + res2.set_observation_token(token, 4); + + m2mobjectinstance_stub::resource_list.push_back(&res2); + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,NULL)); + + // Test RESET message + coap_header->msg_type = COAP_MSG_TYPE_RESET; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,NULL)); + m2mobject_stub::base_type = M2MBase::Object; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,NULL)); + m2mobject_stub::base_type = M2MBase::ObjectInstance; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,NULL)); + m2mobject_stub::base_type = M2MBase::ResourceInstance; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,NULL)); + free(token); + delete m2mobject_stub::inst; + delete obj; + nsdl->_object_list.clear(); + + + // Bootstrap cases start from here + // handle_bootstrap_put_message() invalid object name + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + memset(address, 0, sizeof(sn_nsdl_addr_s)); + address->addr_len = 1; + address->addr_ptr = (uint8_t *)malloc(1); + address->addr_ptr[0] = 1; + address->port = 5683; + handle->oma_bs_address_len = 1; + handle->oma_bs_port = 5683; + handle->oma_bs_address_ptr = (uint8_t *)malloc(1); + handle->oma_bs_address_ptr[0] = 1; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + observer->boot_error = false; + CHECK(0== nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + + // handle_bootstrap_put_message() invalid content type + obj = new M2MObject("0", "0"); + m2mbase_stub::string_value = "0"; + nsdl->_object_list.push_back(obj); + m2mobject_stub::inst = new M2MObjectInstance(*obj, "name", "", ""); + uint8_t security[] = {"0"}; + coap_header->uri_path_ptr = security; + coap_header->uri_path_len = sizeof(security); + M2MResource res(*m2mobject_stub::inst,"test","test",M2MResourceInstance::STRING,false,"test"); + m2mobjectinstance_stub::resource_list.push_back(&res); + observer->boot_error = false; + m2msecurity_stub::resource = new M2MResource(*m2mobject_stub::inst,"1","type",M2MResourceInstance::STRING,false,"1"); + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + + // handle_bootstrap_put_message() success + coap_header->token_ptr = String::convert_integer_to_array(1,coap_header->token_len); + observer->boot_error = false; + m2mtlvdeserializer_stub::is_object_bool_value = true; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + coap_header->content_format = sn_coap_content_format_e(99); + observer->boot_error = false; + observer->boot_done = false; + m2mtlvdeserializer_stub::is_object_bool_value = true; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == false); + + // handle_bootstrap_put_message() TLV parsing fails + observer->boot_error = false; + observer->boot_done = false; + m2mtlvdeserializer_stub::is_object_bool_value = false; + m2mtlvdeserializer_stub::bool_value = true; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotAllowed; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + delete m2mobject_stub::inst; + nsdl->_object_list.clear(); + delete obj; + + // handle_bootstrap_put_message() TLV object instance + obj = new M2MObject("1", "1"); + m2mbase_stub::string_value = "1"; + nsdl->_object_list.push_back(obj); + m2mobject_stub::inst = new M2MObjectInstance(*obj, "name","", ""); + uint8_t server[] = {"1"}; + coap_header->uri_path_ptr = server; + coap_header->uri_path_len = 1; + + observer->boot_error = false; + observer->boot_done = false; + m2mtlvdeserializer_stub::is_object_bool_value = false; + m2mtlvdeserializer_stub::bool_value = true; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == false); + + // handle_bootstrap_put_message() TLV server object + observer->boot_error = false; + observer->boot_done = false; + m2mtlvdeserializer_stub::is_object_bool_value = true; + m2mtlvdeserializer_stub::bool_value = false; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == false); + + // handle_bootstrap_put_message() TLV not resource + observer->boot_error = false; + observer->boot_done = false; + m2mtlvdeserializer_stub::is_object_bool_value = false; + m2mtlvdeserializer_stub::bool_value = false; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(nsdl->_security == NULL); + + // handle_bootstrap_delete() object name not match + observer->boot_error = false; + nsdl->_bootstrap_id = 8; + handle->bootstrap_msg_id = 8; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + coap_header->msg_id = 8; + nsdl->received_from_server_callback(handle,coap_header,NULL); + coap_header->msg_id = 18; + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_DELETE; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + + free(common_stub::coap_header); + common_stub::coap_header = NULL; + + // handle_bootstrap_delete() _identity_accepted false + observer->boot_error = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_DELETE; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(nsdl->_security == NULL); + + free(common_stub::coap_header); + common_stub::coap_header = NULL; + + // handle_bootstrap_delete() object name not match + observer->boot_error = false; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + coap_header->msg_id = 8; + nsdl->received_from_server_callback(handle,coap_header,NULL); + coap_header->msg_id = 18; + uint8_t object_name[] = {"0/0"}; + coap_header->uri_path_ptr = object_name; + coap_header->uri_path_len = 3; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_DELETE; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(nsdl->_security == NULL); + + free(common_stub::coap_header); + common_stub::coap_header = NULL; + + // handle_bootstrap_delete() object name not match + observer->boot_error = false; + coap_header->msg_code = COAP_MSG_CODE_RESPONSE_CHANGED; + coap_header->msg_id = 8; + nsdl->received_from_server_callback(handle,coap_header,NULL); + coap_header->msg_id = 18; + uint8_t invalid[] = {"0/0/1"}; + coap_header->uri_path_ptr = invalid; + coap_header->uri_path_len = 5; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_DELETE; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(nsdl->_security == NULL); + + //handle_bootstrap_finished() path does not match + coap_header->uri_path_ptr = server; + coap_header->uri_path_len = 1; + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + observer->boot_error = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(nsdl->_security == NULL); + + //handle_bootstrap_finished() send coap response + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + m2msecurity_stub::string_value = new String("coaps://"); + observer->boot_error = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(nsdl->_security == NULL); + + //handle_bootstrap_finished() success no security + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + m2msecurity_stub::sec_mode = M2MSecurity::NoSecurity; + m2msecurity_stub::int_value = true; + m2msecurity_stub::bool_value = false; + observer->boot_error = false; + observer->boot_wait = false; + observer->boot_done = false; + coap_header->uri_path_ptr = (uint8_t*)malloc(2); + coap_header->uri_path_len = 2; + coap_header->uri_path_ptr[0] = 'b'; + coap_header->uri_path_ptr[1] = 's'; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == false); + CHECK(observer->boot_wait == true); + CHECK(observer->boot_done == false); + + //handle_bootstrap_finished() success certificate + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + m2msecurity_stub::sec_mode = M2MSecurity::Certificate; + m2mresourceinstance_stub::int_value = 10; + m2msecurity_stub::int_value = true; + m2msecurity_stub::bool_value = false; + observer->boot_error = false; + observer->boot_wait = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == false); + CHECK(observer->boot_wait == true); + CHECK(observer->boot_done == false); + + //handle_bootstrap_finished() fail, Psk not supported + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + m2msecurity_stub::sec_mode = M2MSecurity::Psk; + m2msecurity_stub::int_value = true; + m2msecurity_stub::bool_value = false; + observer->boot_error = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(observer->boot_done == false); + + //handle_bootstrap_finished() fail, Bootstrap server + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + m2msecurity_stub::sec_mode = M2MSecurity::Certificate; + m2msecurity_stub::int_value = true; + m2msecurity_stub::bool_value = true; + observer->boot_error = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(observer->boot_done == false); + + //handle_bootstrap_finished() fail, key size 0 + nsdl->_security = new M2MSecurity(M2MSecurity::M2MServer); + m2msecurity_stub::sec_mode = M2MSecurity::Certificate; + m2msecurity_stub::int_value = false; + m2msecurity_stub::bool_value = false; + m2mresourceinstance_stub::int_value = 0; + observer->boot_error = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(observer->boot_done == false); + + //handle_bootstrap_finished() fail, _security null + m2msecurity_stub::sec_mode = M2MSecurity::Certificate; + m2msecurity_stub::int_value = false; + m2msecurity_stub::bool_value = false; + m2mresourceinstance_stub::int_value = 0; + observer->boot_error = false; + observer->boot_done = false; + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + CHECK(0 == nsdl->received_from_server_callback(handle,coap_header,address)); + CHECK(observer->boot_error == true); + CHECK(observer->boot_done == false); + + delete m2mobject_stub::inst; + //delete m2mbase_stub::string_value; + //m2mbase_stub::string_value = NULL; + nsdl->_object_list.clear(); + m2mobjectinstance_stub::resource_list.clear(); + delete obj; + delete m2msecurity_stub::string_value; + delete m2msecurity_stub::resource; + + free(m2mbase_stub::nsdl_resource->static_resource_parameters->path); + free(m2mbase_stub::nsdl_resource->static_resource_parameters); + free(m2mbase_stub::nsdl_resource); + + free(common_stub::coap_header); + free(address->addr_ptr); + free(address); + free(coap_header->token_ptr); + free(coap_header->uri_path_ptr); + free(coap_header); + free(handle->oma_bs_address_ptr); + free(handle); +} + +void Test_M2MNsdlInterface::test_resource_callback() +{ + uint8_t value[] = {"name"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header,0,sizeof(sn_coap_hdr_s)); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + memset(address,0,sizeof(sn_nsdl_addr_s)); + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + common_stub::coap_header->payload_ptr =(uint8_t*)malloc(1); + common_stub::coap_header->payload_len = 1; + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + common_stub::int_value = 0; + + common_stub::coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + M2MObject *object = new M2MObject("name", "name"); + m2mbase_stub::int_value = 0; + m2mobject_stub::int_value = 1; + m2mbase_stub::nsdl_resource = + (sn_nsdl_dynamic_resource_parameters_s*) malloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*) malloc(sizeof(sn_nsdl_static_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters->path = (uint8_t*)malloc(5); + m2mbase_stub::nsdl_resource->static_resource_parameters->path[0] = 'n'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[1] = 'a'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[2] = 'm'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[3] = 'e'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[4] = '\0'; + m2mbase_stub::nsdl_resource->static_resource_parameters->pathlen = 5; + + nsdl->_object_list.push_back(object); + + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_COAP) ==0); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + m2mobject_stub::bool_value = true; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_COAP) ==0); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_COAP) ==0); + m2mobject_stub::base_type = M2MBase::ResourceInstance; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_COAP) ==0); + + delete object; + free(m2mbase_stub::nsdl_resource->static_resource_parameters->path); + free(m2mbase_stub::nsdl_resource->static_resource_parameters); + free(m2mbase_stub::nsdl_resource); + + free(common_stub::coap_header); + free(address); + free(coap_header); +} + + +void Test_M2MNsdlInterface::test_resource_callback_get() +{ +} + +void Test_M2MNsdlInterface::test_resource_callback_put() +{ + uint8_t value[] = {"name/0/resource"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header,0,sizeof(sn_coap_hdr_s)); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + memset(address,0,sizeof(sn_nsdl_addr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + M2MObject *object = new M2MObject("name", "name"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"name","", ""); + + M2MResource* create_resource = new M2MResource(*instance, + "res", + "res", + M2MResourceInstance::INTEGER, + false, + "res"); + m2mobject_stub::int_value = 2; + m2mobject_stub::instance_list.push_back(instance); + + m2mobjectinstance_stub::resource_list.push_back(create_resource); + m2mobjectinstance_stub::int_value = 1; + + nsdl->_object_list.push_back(object); + + m2mbase_stub::operation = M2MBase::PUT_ALLOWED; + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + + uint8_t query[] = {"pmax=200&pmin=120"}; + coap_header->options_list_ptr->uri_query_ptr = (uint8_t*)malloc(sizeof(query)); + coap_header->options_list_ptr->uri_query_len = sizeof(query); + + m2mbase_stub::bool_value = true; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + common_stub::coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mobject_stub::base_type = M2MBase::Resource; + m2mbase_stub::base_type = M2MBase::Resource; + m2mobject_stub::bool_value = true; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mobject_stub::base_type = M2MBase::ObjectInstance; + m2mbase_stub::base_type = M2MBase::ObjectInstance; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mbase_stub::base_type = M2MBase::Object; + m2mbase_stub::bool_value = false; + + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + delete object; + m2mobject_stub::instance_list.clear(); + delete instance; +// m2mobjectinstance_stub::resource_list.clear(); + delete create_resource; + + free(coap_header->options_list_ptr->uri_query_ptr); + free(coap_header->options_list_ptr); + if(common_stub::coap_header){ + if( common_stub::coap_header->options_list_ptr){ + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + free(common_stub::coap_header); + common_stub::coap_header = NULL; + } + free(coap_header); + free(address); + + m2mbase_stub::clear(); + common_stub::clear(); + m2mobject_stub::clear(); + m2mobjectinstance_stub::clear(); +} + +void Test_M2MNsdlInterface::test_resource_callback_post() +{ + uint8_t value[] = {"name/0/name"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header,0,sizeof(sn_coap_hdr_s)); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + memset(address,0,sizeof(sn_nsdl_addr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + m2mbase_stub::bool_value = false; + M2MObject *object = new M2MObject("name", "name"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"name","",""); + M2MResource* create_resource = new M2MResource(*instance, + "name", + "name", + M2MResourceInstance::INTEGER, + false, + "name"); + m2mobject_stub::int_value = 2; + m2mobject_stub::instance_list.push_back(instance); + + m2mobjectinstance_stub::resource_list.push_back(create_resource); + m2mobjectinstance_stub::int_value = 1; + + nsdl->_object_list.push_back(object); + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + + uint8_t query[] = {"pmax=200&pmin=120"}; + coap_header->options_list_ptr->uri_query_ptr = (uint8_t*)malloc(sizeof(query)); + coap_header->options_list_ptr->uri_query_len = sizeof(query); + + m2mbase_stub::bool_value = true; + + m2mbase_stub::nsdl_resource = + (sn_nsdl_dynamic_resource_parameters_s*) malloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*) malloc(sizeof(sn_nsdl_static_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters->path = (uint8_t*)malloc(5); + m2mbase_stub::nsdl_resource->static_resource_parameters->path[0] = 'n'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[1] = 'a'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[2] = 'm'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[3] = 'e'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[4] = '\0'; + m2mbase_stub::nsdl_resource->static_resource_parameters->pathlen = 5; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + common_stub::coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mobject_stub::base_type = M2MBase::Resource; + m2mbase_stub::base_type = M2MBase::Resource; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mobject_stub::base_type = M2MBase::ResourceInstance; + m2mbase_stub::base_type = M2MBase::ResourceInstance; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mobject_stub::base_type = M2MBase::ObjectInstance; + m2mbase_stub::base_type = M2MBase::ObjectInstance; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mbase_stub::base_type = M2MBase::Object; + m2mbase_stub::bool_value = false; + + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + delete object; + m2mobject_stub::instance_list.clear(); + delete instance; + m2mobjectinstance_stub::resource_list.clear(); + delete create_resource; + + free(coap_header->options_list_ptr->uri_query_ptr); + free(coap_header->options_list_ptr); + if(common_stub::coap_header){ + if( common_stub::coap_header->options_list_ptr){ + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + free(common_stub::coap_header); + common_stub::coap_header = NULL; + } + free(coap_header); + free(address); + free(m2mbase_stub::nsdl_resource->static_resource_parameters->path); + free(m2mbase_stub::nsdl_resource->static_resource_parameters); + free(m2mbase_stub::nsdl_resource); + + m2mbase_stub::clear(); + common_stub::clear(); + m2mobject_stub::clear(); + m2mobjectinstance_stub::clear(); +} + +void Test_M2MNsdlInterface::test_resource_callback_delete() +{ + uint8_t value[] = {"name/0"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header,0,sizeof(sn_coap_hdr_s)); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + memset(address,0,sizeof(sn_nsdl_addr_s)); + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_DELETE; + common_stub::coap_header->msg_code = COAP_MSG_CODE_RESPONSE_BAD_REQUEST; + common_stub::int_value = 0; + + m2mbase_stub::nsdl_resource = + (sn_nsdl_dynamic_resource_parameters_s*) malloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*) malloc(sizeof(sn_nsdl_static_resource_parameters_s)); + + m2mbase_stub::nsdl_resource->static_resource_parameters->path = (uint8_t*)malloc(7); + m2mbase_stub::nsdl_resource->static_resource_parameters->path[0] = 'n'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[1] = 'a'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[2] = 'm'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[3] = 'e'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[4] = '/'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[5] = '0'; + m2mbase_stub::nsdl_resource->static_resource_parameters->path[6] = '\0'; + m2mbase_stub::nsdl_resource->static_resource_parameters->pathlen = 7; + + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name/0"; + M2MObject *object = new M2MObject("name", "name"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"name", "", "name/0"); + m2mbase_stub::int_value = 0; + m2mobject_stub::int_value = 1; + m2mobject_stub::bool_value = true; + m2mobject_stub::instance_list.push_back(instance); + m2mobject_stub::base_type = M2MBase::ObjectInstance; + nsdl->_object_list.push_back(object); + + m2mbase_stub::operation = M2MBase::DELETE_ALLOWED; + + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + m2mobject_stub::base_type = M2MBase::Object; + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) ==0); + + delete instance; + delete object; + free(m2mbase_stub::nsdl_resource->static_resource_parameters->path); + free(m2mbase_stub::nsdl_resource->static_resource_parameters); + free(m2mbase_stub::nsdl_resource); + free(common_stub::coap_header); + free(address); + free(coap_header); + m2mobject_stub::instance_list.clear(); +} + +/* +void Test_M2MNsdlInterface::test_resource_callback_reset() +{ + uint8_t value[] = {"name"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header,0,sizeof(sn_coap_hdr_s)); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + memset(address,0,sizeof(sn_nsdl_addr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_type = COAP_MSG_TYPE_RESET; + m2mobjectinstance_stub::base_type = M2MBase::Object; + String *name = new String("name"); + common_stub::int_value = 0; + m2mbase_stub::string_value = name; + M2MObject *object = new M2MObject(*name); + M2MObjectInstance* instance = new M2MObjectInstance(*name,*object); + M2MResource* create_resource = new M2MResource(*instance, + *name, + *name, + M2MResourceInstance::INTEGER, + M2MResource::Dynamic,false); + m2mobject_stub::int_value = 2; + m2mobject_stub::instance_list.push_back(instance); + + m2mobjectinstance_stub::resource_list.push_back(create_resource); + m2mobjectinstance_stub::int_value = 1; + + nsdl->_object_list.push_back(object); + // No response for RESET message + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) == 1); + + + m2mobject_stub::base_type = M2MBase::ObjectInstance; + // No response for RESET message + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) == 1); + + m2mobject_stub::base_type = M2MBase::Resource; + // No response for RESET message + CHECK(nsdl->resource_callback(NULL,coap_header,address,SN_NSDL_PROTOCOL_HTTP) == 1); + + delete instance; + delete object; + delete name; + delete create_resource; + free(address); + free(coap_header); + m2mobject_stub::instance_list.clear(); + m2mobjectinstance_stub::resource_list.clear(); + //nsdl->_object_list.clear(); +} +*/ +void Test_M2MNsdlInterface::test_process_received_data() +{ + uint8_t *data = (uint8_t*)malloc(sizeof(uint8_t)); + uint16_t data_size = sizeof(uint16_t); + sn_nsdl_addr_s *address = (sn_nsdl_addr_s *)malloc(sizeof(sn_nsdl_addr_s)); + + common_stub::int_value = 0; + + CHECK(nsdl->process_received_data(data,data_size,address) == true); + + common_stub::int_value = -1; + + CHECK(nsdl->process_received_data(data,data_size,address) == false); + + free(address); + free(data); + common_stub::clear(); +} + +void Test_M2MNsdlInterface::test_stop_timers() +{ + // Check if there is no memory leak or crash + nsdl->stop_timers(); +} + +void Test_M2MNsdlInterface::test_timer_expired() +{ + nsdl->timer_expired(M2MTimerObserver::NsdlExecution); + CHECK(nsdl->_counter_for_nsdl == 1); + + if( nsdl->_endpoint == NULL){ + nsdl->_endpoint = (sn_nsdl_ep_parameters_s*)nsdl->memory_alloc(sizeof(sn_nsdl_ep_parameters_s)); + } + nsdl->_endpoint->lifetime_ptr = (uint8_t*)malloc(sizeof(uint8_t)); + + // For checking the registration update + nsdl->timer_expired(M2MTimerObserver::Registration); + + nsdl->delete_endpoint(); + CHECK(nsdl->_endpoint == NULL); +} + +void Test_M2MNsdlInterface::test_observation_to_be_sent() +{ + Vector<uint16_t> instance_list_ids; + m2mbase_stub::clear(); + M2MObject *object = new M2MObject("name", "name"); + M2MObjectInstance* instance = new M2MObjectInstance(*object, "name", "", ""); + M2MResource *res = new M2MResource(*instance,"res", "res", M2MResourceInstance::INTEGER,false, "res"); + M2MResource *res2 = new M2MResource(*instance,"res2", "res2", M2MResourceInstance::INTEGER,false, "res2"); + + + M2MResourceInstance* res_instance = new M2MResourceInstance(*res, + "res", "res", + M2MResourceInstance::INTEGER,0,"",false); + M2MResourceInstance* res_instance_1 = new M2MResourceInstance(*res2, + "res2", "res2", + M2MResourceInstance::INTEGER,0,"",false); + m2mresource_stub::list.clear(); + m2mresource_stub::list.push_back(res_instance); + m2mresource_stub::list.push_back(res_instance_1); + m2mresource_stub::int_value = 2; + instance_list_ids.push_back(0); + + uint8_t value[] = {"value"}; + m2mresourceinstance_stub::value = (uint8_t *)malloc(sizeof(value)); + memset( m2mresourceinstance_stub::value, 0, sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = sizeof(value); + + m2mbase_stub::uint16_value = 321; + m2mbase_stub::string_value = "token"; + + m2mresourceinstance_stub::base_type = M2MBase::Resource; + + nsdl->_nsdl_handle = (nsdl_s*)malloc(sizeof(nsdl_s)); + memset(nsdl->_nsdl_handle,0,sizeof(nsdl_s)); + sn_nsdl_oma_server_info_t * nsp_address = (sn_nsdl_oma_server_info_t *)malloc(sizeof(sn_nsdl_oma_server_info_t)); + memset(nsp_address,0,sizeof(sn_nsdl_oma_server_info_t)); + sn_nsdl_addr_s* address = (sn_nsdl_addr_s*)malloc(sizeof(sn_nsdl_addr_s)); + memset(address,0,sizeof(sn_nsdl_addr_s)); + + nsdl->_nsdl_handle->nsp_address_ptr = nsp_address; + memset(nsdl->_nsdl_handle->nsp_address_ptr,0,sizeof(sn_nsdl_oma_server_info_t)); + nsdl->_nsdl_handle->nsp_address_ptr->omalw_address_ptr = address; + + //CHECK if nothing crashes + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + nsdl->observation_to_be_sent(res2, 1, instance_list_ids); + free(common_stub::coap_header); + + m2mresourceinstance_stub::resource_type = M2MResource::OPAQUE; + + //CHECK if nothing crashes + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + nsdl->observation_to_be_sent(res2, 1, instance_list_ids); + free(common_stub::coap_header); + + m2mresource_stub::list.clear(); + m2mresource_stub::int_value = 0; + + //CHECK if nothing crashes + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + nsdl->observation_to_be_sent(res, 500, instance_list_ids); + free(common_stub::coap_header); + + M2MObjectInstance *object_instance = new M2MObjectInstance(*object, "name", "",""); + m2mobject_stub::int_value = 1; + m2mobject_stub::base_type = M2MBase::Object; + m2mobject_stub::inst = object_instance; + m2mobjectinstance_stub::resource_list.push_back(res); + nsdl->_object_list.push_back(object); + instance_list_ids.push_back(1); + //CHECK if nothing crashes + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + nsdl->observation_to_be_sent(object, 1, instance_list_ids); + free(common_stub::coap_header); + + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + nsdl->observation_to_be_sent(object, 500, instance_list_ids, true); + free(common_stub::coap_header); + + //CHECK if nothing crashes + m2mobjectinstance_stub::base_type = M2MBase::ObjectInstance; + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + nsdl->observation_to_be_sent(object_instance, 1, instance_list_ids); + free(common_stub::coap_header); + + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + nsdl->observation_to_be_sent(object_instance, 500, instance_list_ids); + free(common_stub::coap_header); + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + m2mbase_stub::clear(); + m2mresourceinstance_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); + m2mresource_stub::list.clear(); + delete res; + res = NULL; + + delete res2; + res2 = NULL; + + delete res_instance; + res_instance = NULL; + + delete res_instance_1; + res_instance_1 = NULL; + + delete object_instance; + object_instance = NULL; + + delete object; + object = NULL; + + delete instance; + instance = NULL; + + free(nsp_address); + free(address); + free(nsdl->_nsdl_handle); +} + +void Test_M2MNsdlInterface::test_resource_to_be_deleted() +{ + //Checking coverage for the code + M2MObject *object = new M2MObject("name", "name"); + nsdl->resource_to_be_deleted(object); + delete object; +} + +void Test_M2MNsdlInterface::test_value_updated() +{ + M2MObject *object = new M2MObject("name", "name"); + M2MObjectInstance *object_instance = new M2MObjectInstance(*object, "name", "", ""); + M2MResource *resource = new M2MResource(*object_instance, + "resource_name", + "resource_type", + M2MResourceInstance::INTEGER, + false, + "resource_name"); + + M2MResourceInstance *resource_instance = new M2MResourceInstance(*resource, + "resource_name", + "resource_type", + M2MResourceInstance::INTEGER, + 0,"",false); + + m2mobject_stub::base_type = M2MBase::Object; + m2mbase_stub::string_value = "name"; + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + nsdl->value_updated(object,"name"); + CHECK(observer->value_update == true); + observer->value_update = false; + + m2mobjectinstance_stub::base_type = M2MBase::ObjectInstance; + + nsdl->value_updated(object_instance,"name/0"); + CHECK(observer->value_update == true); + observer->value_update = false; + + common_stub::resource = (sn_nsdl_dynamic_resource_parameters_s*)malloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + memset(common_stub::resource,0, sizeof(sn_nsdl_dynamic_resource_parameters_s)); + + common_stub::resource->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*)malloc(sizeof(sn_nsdl_static_resource_parameters_s)); + memset(common_stub::resource->static_resource_parameters,0, sizeof(sn_nsdl_static_resource_parameters_s)); + + common_stub::resource->static_resource_parameters->resource = (uint8_t*)malloc(2); + memset(common_stub::resource->static_resource_parameters->resource,0, 2); + + common_stub::resource->static_resource_parameters->mode = SN_GRS_STATIC; + m2mbase_stub::mode_value = M2MBase::Static; + + common_stub::resource->observable = false; + m2mbase_stub::bool_value = true; + + m2mresourceinstance_stub::int_value = 2; + uint8_t value[] = "1"; + m2mresourceinstance_stub::value = value; + + m2mresourceinstance_stub::base_type = M2MBase::Resource; + + nsdl->value_updated(resource,"name/0/name"); + CHECK(observer->value_update == true); + observer->value_update = false; + + m2mresourceinstance_stub::clear(); + free(common_stub::resource->static_resource_parameters->resource); + free(common_stub::resource->static_resource_parameters); + free(common_stub::resource); + common_stub::resource = NULL; + common_stub::clear(); + + m2mresourceinstance_stub::base_type = M2MBase::ResourceInstance; + + common_stub::resource = (sn_nsdl_dynamic_resource_parameters_s*)malloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + memset(common_stub::resource,0, sizeof(sn_nsdl_dynamic_resource_parameters_s)); + + common_stub::resource->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*)malloc(sizeof(sn_nsdl_static_resource_parameters_s)); + memset(common_stub::resource->static_resource_parameters,0, sizeof(sn_nsdl_static_resource_parameters_s)); + + common_stub::resource->static_resource_parameters->resource = (uint8_t*)malloc(2); + memset(common_stub::resource->static_resource_parameters->resource,0, 2); + + common_stub::resource->static_resource_parameters->mode = SN_GRS_STATIC; + m2mbase_stub::mode_value = M2MBase::Static; + + m2mresourceinstance_stub::int_value = 2; + m2mresourceinstance_stub::value = value; + + nsdl->value_updated(resource_instance,"name/0/name/0"); + CHECK(observer->value_update == true); + observer->value_update = false; + + m2mbase_stub::is_value_updated_function_set = true; + nsdl->value_updated(resource_instance,"name/0/name/0"); + CHECK(observer->value_update == false); + observer->value_update = false; + + m2mobject_stub::clear(); + m2mobjectinstance_stub::clear(); + + m2mresourceinstance_stub::clear(); + + free(common_stub::resource->static_resource_parameters->resource); + free(common_stub::resource->static_resource_parameters); + free(common_stub::resource); + + common_stub::resource = NULL; + common_stub::clear(); + + delete resource_instance; + delete resource; + delete object_instance; + delete object; +} + + +void Test_M2MNsdlInterface::test_find_resource() +{ + m2mbase_stub::string_value = "name"; + m2mbase_stub::object_instance_name = "name/0"; + m2mbase_stub::resource_name_inst = "name/0/resource_name/0"; + m2mbase_stub::resource_name = "name/0/resource_name"; + m2mbase_stub::find_resource = true; + uint8_t *token = (uint8_t*) malloc(4); + token[0] = 't'; + token[1] = 'o'; + token[2] = 'k'; + token[3] = 'e'; + m2mbase_stub::object_token = token; + m2mbase_stub::object_token_len = 4; + + uint8_t *inst_token = (uint8_t*) malloc(4); + inst_token[0] = 't'; + inst_token[1] = 'o'; + inst_token[2] = 'k'; + inst_token[3] = 'k'; + m2mbase_stub::object_inst_token = inst_token; + m2mbase_stub::object_inst_token_len = 4; + + uint8_t *resource_token = (uint8_t*) malloc(4); + resource_token[0] = 't'; + resource_token[1] = 'k'; + resource_token[2] = 'k'; + resource_token[3] = 'k'; + m2mbase_stub::resource_token = resource_token; + m2mbase_stub::resource_token_len = 4; + + M2MObject *object = new M2MObject("name", "name"); + M2MObjectInstance *object_instance = new M2MObjectInstance(*object,"name/0", "","name/0"); + M2MResource *resource = new M2MResource(*object_instance, + "resource_name", + "resource_type", + M2MResourceInstance::INTEGER, + false, + "resource_name"); + + M2MResourceInstance *resource_instance = new M2MResourceInstance(*resource, + "0", + "resource_type", + M2MResourceInstance::INTEGER,0,"0",false); + + m2mobjectinstance_stub::base_type = M2MBase::ObjectInstance; + m2mobject_stub::instance_list.push_back(object_instance); + m2mobjectinstance_stub::resource_list.push_back(resource); + m2mresource_stub::list.push_back(resource_instance); + m2mobject_stub::base_type = M2MBase::Object; + nsdl->_object_list.push_back(object); + m2mresource_stub::bool_value = true; + CHECK(nsdl->find_resource("name") == object); + CHECK(nsdl->find_resource("name1") == NULL); + CHECK(nsdl->find_resource("name", token, 4) == object); + CHECK(nsdl->find_resource("name", token, 5) == NULL); + + m2mbase_stub::ret_counter = 0; + CHECK(nsdl->find_resource("name/0") == object_instance); + m2mbase_stub::ret_counter = 0; + CHECK(nsdl->find_resource("name/0", inst_token, 4) == object_instance); + m2mbase_stub::ret_counter = 0; + + CHECK(nsdl->find_resource("name/0/resource_name") == resource); + m2mbase_stub::ret_counter = 0; + CHECK(nsdl->find_resource("name/0/resource_name", resource_token, 4) == resource); + + m2mbase_stub::ret_counter = 0; + CHECK(nsdl->find_resource("name/0/resource_name/0") == resource_instance); + + free(token); + free(inst_token); + free(resource_token); + + m2mobject_stub::clear(); + m2mobjectinstance_stub::clear(); + + m2mresourceinstance_stub::clear(); + m2mresource_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); + + delete resource_instance; + delete resource; + delete object_instance; + delete object; +} + +void Test_M2MNsdlInterface::test_remove_object() +{ + M2MObject *obj = new M2MObject("name", "name"); + nsdl->_object_list.push_back(obj); + + nsdl->remove_object((M2MBase*)obj); + + CHECK(nsdl->_object_list.empty() == true); + + nsdl->_object_list.clear(); + delete obj; +} + +void Test_M2MNsdlInterface::test_add_object_to_list() +{ + M2MObject *obj = new M2MObject("name", "name"); + nsdl->_object_list.push_back(obj); + + nsdl->add_object_to_list(obj); + CHECK(nsdl->_object_list.size() == 1); + + nsdl->_object_list.clear(); + delete obj; +} + +void Test_M2MNsdlInterface::test_send_delayed_response() +{ + common_stub::int_value = 0; + m2mbase_stub::int_value = 0; + + M2MObject *object = new M2MObject("name", "name"); + M2MObjectInstance* instance = new M2MObjectInstance(*object, "name", "", ""); + nsdl->_nsdl_handle = (nsdl_s*)malloc(sizeof(nsdl_s)); + memset(nsdl->_nsdl_handle,0,sizeof(nsdl_s)); + + sn_nsdl_oma_server_info_t * nsp_address = (sn_nsdl_oma_server_info_t *)malloc(sizeof(sn_nsdl_oma_server_info_t)); + memset(nsp_address,0,sizeof(sn_nsdl_oma_server_info_t)); + sn_nsdl_addr_s* address = (sn_nsdl_addr_s*)malloc(sizeof(sn_nsdl_addr_s)); + memset(address,0,sizeof(sn_nsdl_addr_s)); + + M2MResource* resource = new M2MResource(*instance, + "name", + "name", + M2MResourceInstance::INTEGER, + false, + "name"); + + uint8_t val[] = {"name"}; + m2mresource_stub::delayed_token = (uint8_t*)malloc(sizeof(val)); + memcpy(m2mresource_stub::delayed_token,val,sizeof(val)); + m2mresource_stub::delayed_token_len = sizeof(val); + + m2mresourceinstance_stub::base_type = M2MBase::Resource; + + nsdl->_nsdl_handle->nsp_address_ptr = nsp_address; + memset(nsdl->_nsdl_handle->nsp_address_ptr,0,sizeof(sn_nsdl_oma_server_info_t)); + nsdl->_nsdl_handle->nsp_address_ptr->omalw_address_ptr = address; + + nsdl->send_delayed_response(resource); + + free(nsp_address); + free(address); + free(nsdl->_nsdl_handle); + + delete object; + delete instance; + delete resource; + free(m2mresource_stub::delayed_token); + m2mresource_stub::delayed_token = NULL; + m2mresource_stub::delayed_token_len = 0; +} + +void Test_M2MNsdlInterface::test_get_nsdl_handle() +{ + CHECK(nsdl->get_nsdl_handle() == nsdl->_nsdl_handle); +} + +void Test_M2MNsdlInterface::test_endpoint_name() +{ + String endpoint = "test"; + nsdl->_endpoint_name = endpoint; + CHECK(nsdl->endpoint_name() == endpoint); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mnsdlinterface/test_m2mnsdlinterface.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_NSDL_INTERFACE_H +#define TEST_M2M_NSDL_INTERFACE_H + +#include "m2mnsdlinterface.h" +#include "common_stub.h" + +class TestObserver; + +class Test_M2MNsdlInterface +{ +public: + Test_M2MNsdlInterface(); + + virtual ~Test_M2MNsdlInterface(); + + void test_create_endpoint(); + + void test_delete_endpoint(); + + void test_create_nsdl_list_structure(); + + void test_delete_nsdl_resource(); + + void test_create_bootstrap_resource(); + + void test_send_register_message(); + + void test_send_update_registration(); + + void test_send_unregister_message(); + + void test_memory_alloc(); + + void test_memory_free(); + + void test_send_to_server_callback(); + + void test_received_from_server_callback(); + + void test_resource_callback(); + + void test_resource_callback_get(); + + void test_resource_callback_put(); + + void test_resource_callback_post(); + + void test_resource_callback_delete(); + + void test_process_received_data(); + + void test_stop_timers(); + + void test_timer_expired(); + + void test_observation_to_be_sent(); + + void test_resource_to_be_deleted(); + + void test_value_updated(); + + void test_find_resource(); + + void test_remove_object(); + + void test_add_object_to_list(); //Special: Would be too difficult to test in normal ways + + void test_send_delayed_response(); + + void test_get_nsdl_handle(); + + void test_endpoint_name(); + + M2MNsdlInterface* nsdl; + + TestObserver *observer; +}; + +#endif // TEST_M2M_NSDL_INTERFACE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobject/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mobject + "main.cpp" + "m2mobjecttest.cpp" + "test_m2mobject.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mtlvserializer_stub.cpp" + "../stub/m2mtlvdeserializer_stub.cpp" + "../stub/m2mreporthandler_stub.cpp" + "../stub/common_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mtlvserializer_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../../../../source/m2mobject.cpp" + "../stub/m2mtimer_stub.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mobject + CppUTest + CppUTestExt +) +set_target_properties(m2mobject +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") + +set(binary "m2mobject") +add_test(m2mobject ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobject/m2mobjecttest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mobject.h" + +TEST_GROUP(M2MObject) +{ + Test_M2MObject* m2m_object; + + void setup() + { + m2m_object = new Test_M2MObject(); + } + void teardown() + { + delete m2m_object; + } +}; + +TEST(M2MObject, Create) +{ + CHECK(m2m_object != NULL); +} + +TEST(M2MObject, base_type) +{ + m2m_object->test_base_type(); +} + +TEST(M2MObject, create_object_instance) +{ + m2m_object->test_create_object_instance(); +} + +TEST(M2MObject, remove_object_instance) +{ + m2m_object->test_remove_object_instance(); +} + +TEST(M2MObject, object_instance) +{ + m2m_object->test_object_instance(); +} + +TEST(M2MObject, instance_count) +{ + m2m_object->test_instance_count(); +} + +TEST(M2MObject, instances) +{ + m2m_object->test_instances(); +} + +TEST(M2MObject, handle_get_request) +{ + m2m_object->test_handle_get_request(); +} + +TEST(M2MObject, handle_put_request) +{ + m2m_object->test_handle_put_request(); +} + +TEST(M2MObject, handle_post_request) +{ + m2m_object->test_handle_post_request(); +} + +TEST(M2MObject, notification_update) +{ + m2m_object->test_notification_update(); +} + +TEST(M2MObject, test_ctor) +{ + m2m_object->test_ctor(); +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobject/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MObject);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobject/test_m2mobject.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,618 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mobject.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mbase_stub.h" +#include "common_stub.h" +#include "m2mtlvdeserializer_stub.h" +#include "m2mtlvserializer_stub.h" +#include "m2mreporthandler_stub.h" +#include "nsdlaccesshelper_stub.h" + +class TestReportObserver : public M2MReportObserver{ +public : + TestReportObserver() {} + ~TestReportObserver() {} + void observation_to_be_sent(m2m::Vector<uint16_t>,bool){ } +}; + +class Handler : public M2MObservationHandler { + +public: + + Handler(){} + ~Handler(){} + void observation_to_be_sent(M2MBase *, uint16_t, m2m::Vector<uint16_t>,bool){ + visited = true; + } + void send_delayed_response(M2MBase *){} + void resource_to_be_deleted(M2MBase *){visited=true;} + void remove_object(M2MBase *){visited = true;} + void value_updated(M2MBase *,const String&){visited = true;} + + void clear() {visited = false;} + bool visited; +}; + +Test_M2MObject::Test_M2MObject() +{ + handler = new Handler(); + object = new M2MObject("name", "name"); +} + +Test_M2MObject::~Test_M2MObject() +{ + m2mobjectinstance_stub::clear(); + m2mresource_stub::clear(); + m2mbase_stub::clear(); + m2mtlvdeserializer_stub::clear(); + m2mtlvserializer_stub::clear(); + delete object; + delete handler; +} + +void Test_M2MObject::test_ctor() +{ + M2MObject *object = new M2MObject(¶ms); + delete object; +} + +void Test_M2MObject::test_create_object_instance() +{ + m2mbase_stub::name_id_value = 1; + m2mbase_stub::string_value = "name"; + CHECK(object->create_object_instance() != NULL); + CHECK(object->create_object_instance(¶ms) != NULL); +} + +void Test_M2MObject::test_remove_object_instance() +{ + m2mbase_stub::string_value = "name"; + + M2MObjectInstance *ins = new M2MObjectInstance(*object,"name","type", ""); + object->set_instance_id(0); + object->_instance_list.push_back(ins); + + CHECK(true == object->remove_object_instance(0)); + + CHECK(false == object->remove_object_instance(0)); +} + +void Test_M2MObject::test_object_instance() +{ + M2MObjectInstance *ins = new M2MObjectInstance(*object, "name", "type", ""); + object->set_instance_id(0); + object->_instance_list.push_back(ins); + + m2mbase_stub::string_value = "name"; + + M2MObjectInstance *obj = object->object_instance(0); + + CHECK(obj != NULL); + STRCMP_EQUAL(obj->name(), "name"); + //CHECK(0 == obj->name().compare(0,test->size(),*test)); +} + +void Test_M2MObject::test_instances() +{ + + M2MObjectInstance *ins = new M2MObjectInstance(*object, "name", "type", ""); + ins->set_instance_id(0); + object->_instance_list.push_back(ins); + + M2MObjectInstance *ins1 = new M2MObjectInstance(*object, "name","type", ""); + ins1->set_instance_id(1); + object->_instance_list.push_back(ins1); + + m2mbase_stub::string_value = "name"; + + M2MObjectInstanceList list = object->instances(); + + M2MObjectInstance *obj = list[0]; + CHECK(2 == list.size()); + STRCMP_EQUAL(obj->name(), "name"); + //CHECK(0 == obj->name().compare(0,test->size(),*test)); +} + +void Test_M2MObject::test_instance_count() +{ + M2MObjectInstance *ins = new M2MObjectInstance(*object, "name", "type", ""); + object->set_instance_id(0); + object->_instance_list.push_back(ins); + + M2MObjectInstance *ins1 = new M2MObjectInstance(*object, "name", "type", ""); + object->set_instance_id(1); + object->_instance_list.push_back(ins1); + + CHECK(2 == object->instance_count()); + + object->_instance_list.clear(); + delete ins; + delete ins1; +} + +void Test_M2MObject::test_base_type() +{ + CHECK(M2MBase::Object == object->base_type()); +} + +void Test_M2MObject::test_handle_get_request() +{ + M2MObjectInstance *ins = new M2MObjectInstance(*object, "name", "type", ""); + object->set_instance_id(0); + object->_instance_list.push_back(ins); + + uint8_t value[] = {"name"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_GET; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + m2mtlvserializer_stub::uint8_value = (uint8_t*)malloc(1); + + coap_header->token_ptr = (uint8_t*)malloc(sizeof(value)); + memcpy(coap_header->token_ptr, value, sizeof(value)); + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->observe = 0; + + coap_header->content_format = sn_coap_content_format_e(110); + + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + // Not OMA TLV or JSON + m2mbase_stub::uint8_value = 110; + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + // Content type set CT_NONE + m2mbase_stub::uint8_value = 99; + coap_header->content_format = sn_coap_content_format_e(-1); + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + common_stub::coap_header->content_format = sn_coap_content_format_e(-1); // CT_NONE + m2mbase_stub::uint8_value = 100; + coap_header->content_format = sn_coap_content_format_e(-1); + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + // OMA TLV + coap_header->content_format = sn_coap_content_format_e(99); + m2mbase_stub::uint8_value = 99; + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + // OMA JSON + coap_header->content_format = sn_coap_content_format_e(100); + m2mbase_stub::uint8_value = 100; + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 0; + m2mbase_stub::uint16_value = 0x1c1c; + m2mbase_stub::uint8_value = 99; + m2mbase_stub::bool_value = true; + coap_header->content_format = sn_coap_content_format_e(99); + + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::uint16_value = 10; + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + // Not observable + m2mbase_stub::bool_value = false; + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::bool_value = true; + coap_header->options_list_ptr->observe = 0; + + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 1; + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + CHECK(object->handle_get_request(NULL,coap_header,handler) != NULL); + + CHECK(object->handle_get_request(NULL,NULL,handler) != NULL); + + if(coap_header->token_ptr) { + free(coap_header->token_ptr); + coap_header->token_ptr = NULL; + } + if(coap_header->options_list_ptr) { + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + } + + if(common_stub::coap_header){ + if(common_stub::coap_header->options_list_ptr) { + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + free(common_stub::coap_header); + common_stub::coap_header = NULL; + } + free(coap_header); + coap_header = NULL; + + if(m2mtlvserializer_stub::uint8_value) { + free(m2mtlvserializer_stub::uint8_value); + } + m2mtlvserializer_stub::clear(); + + m2mbase_stub::clear(); + common_stub::clear(); + + object->_instance_list.clear(); + delete ins; +} + +void Test_M2MObject::test_handle_put_request() +{ + uint8_t value[] = {"name"}; + bool execute_value_updated = false; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + sn_coap_hdr_s * coap_response = NULL; + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::PUT_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + coap_header->payload_ptr = (uint8_t*)malloc(1); + + CHECK(object->handle_put_request(NULL,coap_header,handler,execute_value_updated) != NULL); + free(coap_header->payload_ptr); + coap_header->payload_ptr = NULL; + + CHECK(object->handle_put_request(NULL,coap_header,handler,execute_value_updated) != NULL); + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->uri_query_ptr = value; + coap_header->options_list_ptr->uri_query_len = sizeof(value); + + coap_header->content_format = sn_coap_content_format_e(99); + m2mtlvdeserializer_stub::bool_value = true; + + m2mbase_stub::bool_value = false; + + CHECK(object->handle_put_request(NULL,coap_header,handler,execute_value_updated) != NULL); + + m2mtlvdeserializer_stub::bool_value = false; + + CHECK(object->handle_put_request(NULL,coap_header,handler, execute_value_updated) != NULL); + + coap_header->content_format = sn_coap_content_format_e(100); + + CHECK(object->handle_put_request(NULL,coap_header,handler, execute_value_updated) != NULL); + + m2mbase_stub::bool_value = true; + + CHECK(object->handle_put_request(NULL,coap_header,handler, execute_value_updated) != NULL); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + CHECK(object->handle_put_request(NULL,coap_header,handler, execute_value_updated) != NULL); + + CHECK(object->handle_put_request(NULL,NULL,handler, execute_value_updated) != NULL); + + m2mbase_stub::operation = M2MBase::PUT_ALLOWED; + + free(coap_header->payload_ptr); + coap_header->payload_ptr = NULL; + coap_response = object->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK(coap_response != NULL); + CHECK(coap_response->msg_code == COAP_MSG_CODE_RESPONSE_CHANGED); + + m2mbase_stub::bool_value = false; + coap_response = object->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK(coap_response != NULL); + CHECK(coap_response->msg_code == COAP_MSG_CODE_RESPONSE_BAD_REQUEST); + + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + coap_response = object->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK(coap_response != NULL); + CHECK(coap_response->msg_code == COAP_MSG_CODE_RESPONSE_BAD_REQUEST); + + free(coap_header->options_list_ptr); + free(common_stub::coap_header); + free(coap_header); + + m2mtlvdeserializer_stub::clear(); + common_stub::clear(); + m2mbase_stub::clear(); +} + +void Test_M2MObject::test_handle_post_request() +{ + uint8_t value[] = {"name"}; + bool execute_value_updated = false; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + + m2mbase_stub::bool_value = false; + + sn_coap_hdr_s * coap_response = NULL; + m2mbase_stub::uint8_value = 99; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + + m2mbase_stub::uint8_value = 100; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + coap_header->payload_ptr = (uint8_t*)malloc(1); + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mbase_stub::uint8_value = 99; + + object->_max_instance_count = 0; + + M2MObjectInstance *ins = new M2MObjectInstance(*object, "name", "type", ""); + ins->set_instance_id(0); + object->_instance_list.push_back(ins); + coap_header->content_format = sn_coap_content_format_e(-1); + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + object->remove_object_instance(0); + + + object->_max_instance_count = 65535; + + m2mbase_stub::uint8_value = 0; + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->uri_query_ptr = value; + coap_header->options_list_ptr->uri_query_len = sizeof(value); + + coap_header->content_format = sn_coap_content_format_e(99); + m2mtlvdeserializer_stub::is_object_bool_value = true; + m2mtlvdeserializer_stub::bool_value = false; + m2mbase_stub::bool_value = false; + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// if (coap_response->options_list_ptr) { +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; +// } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::is_object_bool_value = true; + m2mtlvdeserializer_stub::bool_value = false; + m2mtlvdeserializer_stub::int_value = 10; + m2mbase_stub::bool_value = false; + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotAllowed; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::is_object_bool_value = false; + m2mtlvdeserializer_stub::bool_value = true; + m2mbase_stub::bool_value = false; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::is_object_bool_value = false; + m2mtlvdeserializer_stub::bool_value = true; + m2mbase_stub::bool_value = false; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotFound; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::bool_value = false; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + + coap_header->content_format = sn_coap_content_format_e(100); + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + + m2mbase_stub::bool_value = true; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + coap_response = object->handle_post_request(NULL,NULL,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::int_value = 0; + m2mtlvdeserializer_stub::is_object_bool_value = true; + coap_header->content_format = sn_coap_content_format_e(99); + coap_response = object->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } +// free(coap_response->options_list_ptr); +// coap_response->options_list_ptr = NULL; + } + } + + free(coap_header->options_list_ptr); + free(coap_header->payload_ptr); + free(common_stub::coap_header->options_list_ptr); + free(common_stub::coap_header); + free(coap_header); + + m2mtlvdeserializer_stub::clear(); + common_stub::clear(); + m2mbase_stub::clear(); +} + +void Test_M2MObject::test_notification_update() +{ + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + m2mbase_stub::bool_value = true; + + object->notification_update(0); + + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobject/test_m2mobject.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_OBJECT_H +#define TEST_M2M_OBJECT_H + +#include "m2mobject.h" + +class Handler; + +class Test_M2MObject +{ +public: + Test_M2MObject(); + virtual ~Test_M2MObject(); + + void test_create_object_instance(); + + void test_remove_object_instance(); + + void test_object_instance(); + + void test_instances(); + + void test_instance_count(); + + void test_base_type(); + + void test_handle_get_request(); + + void test_handle_put_request(); + + void test_handle_post_request(); + + void test_notification_update(); + + void test_ctor(); + + M2MObject* object; + + Handler* handler; +}; + +#endif // TEST_M2M_OBJECT_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobjectinstance/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mobjectinstance + "main.cpp" + "m2mobjectinstancetest.cpp" + "test_m2mobjectinstance.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/common_stub.cpp" + "../stub/m2mtlvserializer_stub.cpp" + "../stub/m2mtlvdeserializer_stub.cpp" + "../stub/m2mreporthandler_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../../../../source/m2mobjectinstance.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mobjectinstance + CppUTest + CppUTestExt +) +set_target_properties(m2mobjectinstance +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mobjectinstance") +add_test(m2mobjectinstance ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobjectinstance/m2mobjectinstancetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mobjectinstance.h" + +TEST_GROUP(M2MObjectInstance) +{ + Test_M2MObjectInstance* m2m_object_instance; + + void setup() + { + m2m_object_instance = new Test_M2MObjectInstance(); + } + void teardown() + { + delete m2m_object_instance; + } +}; + +TEST(M2MObjectInstance, Create) +{ + CHECK(m2m_object_instance != NULL); +} + +TEST(M2MObjectInstance, create_static_resource) +{ + m2m_object_instance->test_create_static_resource(); +} + +TEST(M2MObjectInstance, create_static_resource_instance) +{ + m2m_object_instance->test_create_static_resource_instance(); +} + +TEST(M2MObjectInstance, create_dynamic_resource) +{ + m2m_object_instance->test_create_dynamic_resource(); +} + +TEST(M2MObjectInstance, create_dynamic_resource_instance) +{ + m2m_object_instance->test_create_dynamic_resource_instance(); +} + +TEST(M2MObjectInstance, remove_resource) +{ + m2m_object_instance->test_remove_resource(); +} + +TEST(M2MObjectInstance, remove_resource_instance) +{ + m2m_object_instance->test_remove_resource_instance(); +} + +TEST(M2MObjectInstance, resource) +{ + m2m_object_instance->test_resource(); +} + +TEST(M2MObjectInstance, resources) +{ + m2m_object_instance->test_resources(); +} + +TEST(M2MObjectInstance, resource_count) +{ + m2m_object_instance->test_resource_count(); +} + +TEST(M2MObjectInstance, total_resource_count) +{ + m2m_object_instance->test_total_resource_count(); +} + +TEST(M2MObjectInstance, base_type) +{ + m2m_object_instance->test_base_type(); +} + +TEST(M2MObjectInstance, handle_get_request) +{ + m2m_object_instance->test_handle_get_request(); +} + +TEST(M2MObjectInstance, handle_put_request) +{ + m2m_object_instance->test_handle_put_request(); +} + +TEST(M2MObjectInstance, handle_post_request) +{ + m2m_object_instance->test_handle_post_request(); +} + +TEST(M2MObjectInstance, notification_update) +{ + m2m_object_instance->test_notification_update(); +} + +TEST(M2MObjectInstance, test_ctor) +{ + m2m_object_instance->test_ctor(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobjectinstance/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MObjectInstance);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobjectinstance/test_m2mobjectinstance.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,867 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mobjectinstance.h" +#include "m2mresource_stub.h" +#include "common_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mbase_stub.h" +#include "m2mtlvdeserializer_stub.h" +#include "m2mtlvserializer_stub.h" +#include "m2mreporthandler_stub.h" +#include "m2mobject_stub.h" + +class Handler : public M2MObservationHandler { + +public: + + Handler(){} + ~Handler(){} + void observation_to_be_sent(M2MBase *, uint16_t, m2m::Vector<uint16_t>,bool){ + visited = true; + } + void send_delayed_response(M2MBase *){} + void resource_to_be_deleted(M2MBase *){visited=true;} + void remove_object(M2MBase *){visited = true;} + void value_updated(M2MBase *,const String&){visited = true;} + + void clear() {visited = false;} + bool visited; +}; + +class TestReportObserver : public M2MReportObserver{ +public : + TestReportObserver() {} + ~TestReportObserver() {} + void observation_to_be_sent(m2m::Vector<uint16_t>,bool){ } +}; + +Test_M2MObjectInstance::Test_M2MObjectInstance() +{ + handler = new Handler(); + object = new M2MObject("name", "name"); + object_instance = new M2MObjectInstance(*object, "name", "type", ""); +} + +Test_M2MObjectInstance::~Test_M2MObjectInstance() +{ + delete object; + delete object_instance; + delete handler; + m2mresource_stub::clear(); + m2mbase_stub::clear(); + m2mtlvdeserializer_stub::clear(); + m2mtlvserializer_stub::clear(); +} + +void Test_M2MObjectInstance::test_ctor() +{ + M2MObject* obj = new M2MObject("name", "name"); + M2MObjectInstance *instance = new M2MObjectInstance(*obj,¶ms); + delete instance; + delete obj; +} + +void Test_M2MObjectInstance::test_create_static_resource() +{ + m2mbase_stub::string_value = "name"; + u_int8_t value[] = {"value"}; + + m2mbase_stub::bool_value = true; + + m2mbase_stub::uint8_value = 99; + M2MResource * res = object_instance->create_static_resource("name","type",M2MResourceInstance::STRING,value,(u_int32_t)sizeof(value),false); + + CHECK(res != NULL); + res = object_instance->create_static_resource("name2","type",M2MResourceInstance::STRING,value,(u_int32_t)sizeof(value),true); + + CHECK(res != NULL); + CHECK(2 == object_instance->_resource_list.size()); + + m2mbase_stub::bool_value = false; + res = object_instance->create_static_resource("","type",M2MResourceInstance::STRING,value,(u_int32_t)sizeof(value)); + CHECK(res == NULL); + + m2mbase_stub::bool_value = true; + res = object_instance->create_static_resource(¶ms,M2MResourceInstance::STRING); + CHECK(res != NULL); + + m2mbase_stub::bool_value = false; + res = object_instance->create_static_resource(¶ms,M2MResourceInstance::STRING); + CHECK(res == NULL); + +} + +void Test_M2MObjectInstance::test_create_static_resource_instance() +{ + m2mbase_stub::string_value = "name"; + u_int8_t value[] = {"value"}; + + m2mbase_stub::bool_value = true; + m2mresource_stub::bool_value = true; + m2mbase_stub::uint8_value = 99; + M2MResourceInstance *ins = object_instance->create_static_resource_instance("name","type", + M2MResourceInstance::STRING, + value,(u_int32_t)sizeof(value), + 0); + + CHECK(ins != NULL); + CHECK(1 == object_instance->_resource_list.size()); + + delete ins; + + ins = object_instance->create_static_resource_instance("name","type", + M2MResourceInstance::STRING, + value,(u_int32_t)sizeof(value), + 1); + + CHECK(ins != NULL); + CHECK(1 == object_instance->_resource_list.size()); + + delete ins; + + m2mbase_stub::bool_value = false; + ins = object_instance->create_static_resource_instance("","type", + M2MResourceInstance::STRING,value, + (u_int32_t)sizeof(value),0); + CHECK(ins == NULL); + delete ins; +} + +void Test_M2MObjectInstance::test_create_dynamic_resource_instance() +{ + m2mbase_stub::string_value = "name"; + + m2mresource_stub::bool_value = true; + m2mbase_stub::uint8_value = 99; + m2mbase_stub::bool_value = true; + M2MResourceInstance * ins = object_instance->create_dynamic_resource_instance("name","type", + M2MResourceInstance::STRING, + false,0); + CHECK(ins != NULL); + CHECK(1 == object_instance->_resource_list.size()); + + delete ins; + + ins = object_instance->create_dynamic_resource_instance("name","type", + M2MResourceInstance::STRING, + false,1); + CHECK(ins != NULL); + CHECK(1 == object_instance->_resource_list.size()); + + delete ins; + + // Name empty, validate returns false + m2mbase_stub::bool_value = false; + ins = object_instance->create_dynamic_resource_instance("","type", + M2MResourceInstance::STRING, + false,1); + + CHECK(ins == NULL); +} + +void Test_M2MObjectInstance::test_create_dynamic_resource() +{ + m2mbase_stub::string_value = "name"; + m2mbase_stub::uint8_value = 99; + m2mbase_stub::bool_value = true; + M2MResource * res = object_instance->create_dynamic_resource("name","type",M2MResourceInstance::STRING,false,false); + CHECK(res != NULL); + CHECK(1 == object_instance->_resource_list.size()); + + res = object_instance->create_dynamic_resource("multiple","type",M2MResourceInstance::STRING,false,true); + CHECK(res != NULL); + CHECK(2 == object_instance->_resource_list.size()); + + M2MResource * res1 = object_instance->create_dynamic_resource("name1","type",M2MResourceInstance::STRING,false,false); + CHECK(res1 != NULL); + CHECK(3 == object_instance->_resource_list.size()); + + m2mbase_stub::bool_value = false; + M2MResource * res2 = object_instance->create_dynamic_resource("","type",M2MResourceInstance::STRING,false,false); + CHECK(res2 == NULL); + + m2mbase_stub::bool_value = true; + M2MResource * res3 = object_instance->create_dynamic_resource(¶ms,M2MResourceInstance::STRING,false); + CHECK(res3 != NULL); + + m2mbase_stub::bool_value = false; + res3 = object_instance->create_dynamic_resource(¶ms,M2MResourceInstance::STRING,false); + CHECK(res3 == NULL); +} + +void Test_M2MObjectInstance::test_remove_resource() +{ + CHECK(false == object_instance->remove_resource("name")); + M2MResource *res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + object_instance->_resource_list.push_back(res); + + m2mbase_stub::string_value = "name"; + m2mbase_stub::int_value = 0; + m2mbase_stub::void_value = malloc(20); + + m2mresource_stub::bool_value = true; + CHECK(true == object_instance->remove_resource("name")); + CHECK(0 == object_instance->_resource_list.size()); + + free(m2mbase_stub::void_value); +} + +void Test_M2MObjectInstance::test_remove_resource_instance() +{ + CHECK(false == object_instance->remove_resource_instance("name",0)); + + M2MResource *res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + object_instance->_resource_list.push_back(res); + + m2mbase_stub::string_value = "name"; + m2mbase_stub::int_value = 0; + m2mbase_stub::void_value = malloc(20); + + m2mresource_stub::bool_value = true; + M2MResourceInstance *ins = new M2MResourceInstance(*res,"name","type",M2MResourceInstance::STRING,0,"name",false); + + m2mresource_stub::list.push_back(ins); + + CHECK(true == object_instance->remove_resource_instance("name",0)); + CHECK(0 == object_instance->_resource_list.size()); + + free(m2mbase_stub::void_value); + + delete ins; + ins = NULL; +} + + +void Test_M2MObjectInstance::test_resource() +{ + M2MResource *res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + object_instance->_resource_list.push_back(res); + + m2mbase_stub::string_value = "name"; + m2mbase_stub::int_value = 0; + + M2MResource *result = object_instance->resource("name"); + CHECK(result != NULL); + + res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + object_instance->_resource_list.push_back(res); + + m2mbase_stub::int_value = 1; + + result = object_instance->resource("name"); + CHECK(result != NULL); +} + +void Test_M2MObjectInstance::test_resources() +{ + M2MResource *res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + m2mbase_stub::string_value = "name"; + object_instance->_resource_list.push_back(res); + + res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + object_instance->_resource_list.push_back(res); + + M2MResourceList resources =object_instance->resources(); + + CHECK(2 == resources.size()); +} + +void Test_M2MObjectInstance::test_resource_count() +{ + M2MResource *res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + m2mbase_stub::string_value = "name"; + object_instance->_resource_list.push_back(res); + + res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + object_instance->_resource_list.push_back(res); + + + m2mbase_stub::int_value = 0; + m2mresource_stub::bool_value = true; + m2mresource_stub::int_value = 1; + + CHECK(2 == object_instance->resource_count("name")); + + m2mresource_stub::bool_value = false; + + CHECK(2 == object_instance->resource_count("name")); +} + +void Test_M2MObjectInstance::test_total_resource_count() +{ + M2MResource *res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + m2mbase_stub::string_value = "name"; + object_instance->_resource_list.push_back(res); + + res = new M2MResource(*object_instance,"name","type",M2MResourceInstance::STRING,false, "name"); + object_instance->_resource_list.push_back(res); + + m2mresource_stub::bool_value = true; + m2mresource_stub::int_value = 1; + + CHECK(2 == object_instance->resource_count()); + + m2mresource_stub::bool_value = false; + + CHECK(2 == object_instance->resource_count()); +} + +void Test_M2MObjectInstance::test_base_type() +{ + m2mbase_stub::base_type = M2MBase::ObjectInstance; + CHECK(M2MBase::ObjectInstance == object_instance->base_type()); +} + +void Test_M2MObjectInstance::test_handle_get_request() +{ + M2MResource *res = new M2MResource(*object_instance,"name1","type1",M2MResourceInstance::STRING,false, "name1"); + object_instance->_resource_list.push_back(res); + m2mbase_stub::string_value = "name1"; + uint8_t value[] = {"name"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_GET; + + common_stub::int_value = 0; + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + m2mtlvserializer_stub::uint8_value = (uint8_t*)malloc(1); + + coap_header->token_ptr = (uint8_t*)malloc(sizeof(value)); + memcpy(coap_header->token_ptr, value, sizeof(value)); + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->observe = 0; + coap_header->content_format = sn_coap_content_format_e(110); + + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + if(common_stub::coap_header->options_list_ptr) { + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + + // Not OMA TLV or JSON + m2mbase_stub::uint8_value = 110; + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + if(common_stub::coap_header->options_list_ptr) { + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + + // Content type set CT_NONE + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + m2mbase_stub::uint8_value = 99; + coap_header->content_format = sn_coap_content_format_e(-1); + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + common_stub::coap_header->content_format = sn_coap_content_format_e(-1); // CT_NONE + m2mbase_stub::uint8_value = 100; + coap_header->content_format = sn_coap_content_format_e(-1); + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + // OMA TLV + m2mbase_stub::uint8_value = 99; + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + // OMA JSON + m2mbase_stub::uint8_value = 100; + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 0; + m2mbase_stub::uint16_value = 0x1c1c; + m2mbase_stub::uint8_value = 99; + m2mbase_stub::bool_value = true; + + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::uint16_value = 10; + + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + // Not observable + m2mbase_stub::bool_value = false; + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::bool_value = true; + coap_header->options_list_ptr->observe = 0; + + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + coap_header->options_list_ptr->observe = 1; + m2mbase_stub::uint8_value = 99; + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + CHECK(object_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + CHECK(object_instance->handle_get_request(NULL,NULL,handler) != NULL); + + if(coap_header->token_ptr) { + free(coap_header->token_ptr); + coap_header->token_ptr = NULL; + } + if(coap_header->options_list_ptr) { + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + } + + if(common_stub::coap_header){ + if(common_stub::coap_header->options_list_ptr) { + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + free(common_stub::coap_header); + common_stub::coap_header = NULL; + } + free(coap_header); + coap_header = NULL; + + if(m2mtlvserializer_stub::uint8_value) { + free(m2mtlvserializer_stub::uint8_value); + } + m2mtlvserializer_stub::clear(); + common_stub::clear(); +} + +void Test_M2MObjectInstance::test_handle_put_request() +{ + uint8_t value[] = {"name"}; + bool execute_value_updated = false; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::PUT_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + coap_header->payload_ptr = (uint8_t*)malloc(1); + coap_header->content_format = sn_coap_content_format_e(-1); + sn_coap_hdr_s *coap_response = NULL; + m2mbase_stub::uint8_value = 99; + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mbase_stub::uint8_value = 0; + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->uri_query_ptr = value; + coap_header->options_list_ptr->uri_query_len = sizeof(value); + + coap_header->content_format = sn_coap_content_format_e(99); + m2mtlvdeserializer_stub::bool_value = true; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + + m2mbase_stub::bool_value = false; + + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mbase_stub::bool_value = true; + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + + m2mbase_stub::bool_value = false; + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotFound; + + m2mbase_stub::bool_value = false; + + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotValid; + + m2mbase_stub::bool_value = false; + + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotAllowed; + + m2mbase_stub::bool_value = false; + + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::bool_value = false; + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + coap_header->content_format = sn_coap_content_format_e(100); + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + free(coap_header->payload_ptr); + coap_header->payload_ptr = NULL; + + m2mbase_stub::bool_value = true; + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mbase_stub::bool_value = false; + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + coap_response = object_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + coap_response = object_instance->handle_put_request(NULL,NULL,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + //free(coap_header->options_list_ptr); + free(common_stub::coap_header); + free(coap_header); + + m2mtlvdeserializer_stub::clear(); + common_stub::clear(); + m2mbase_stub::clear(); +} + +void Test_M2MObjectInstance::test_handle_post_request() +{ + uint8_t value[] = {"name"}; + bool execute_value_updated = false; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + m2mbase_stub::bool_value = false; + + sn_coap_hdr_s * coap_response = NULL; + m2mbase_stub::uint8_value = 99; + + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->content_format = sn_coap_content_format_e(-1); + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::uint8_value = 100; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + coap_header->payload_ptr = (uint8_t*)malloc(1); + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + m2mbase_stub::uint8_value = 99; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::uint8_value = 0; + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->uri_query_ptr = value; + coap_header->options_list_ptr->uri_query_len = sizeof(value); + + coap_header->content_format = sn_coap_content_format_e(99); + m2mtlvdeserializer_stub::is_object_bool_value = true; + m2mtlvdeserializer_stub::bool_value = false; + m2mbase_stub::bool_value = false; + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::is_object_bool_value = true; + m2mtlvdeserializer_stub::bool_value = false; + m2mbase_stub::bool_value = false; + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotAllowed; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotValid; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::is_object_bool_value = false; + m2mtlvdeserializer_stub::bool_value = true; + m2mbase_stub::bool_value = false; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::None; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::is_object_bool_value = false; + m2mtlvdeserializer_stub::bool_value = true; + m2mbase_stub::bool_value = false; + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotFound; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mtlvdeserializer_stub::bool_value = false; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + + coap_header->content_format = sn_coap_content_format_e(100); + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + + m2mbase_stub::bool_value = true; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + coap_response = object_instance->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + coap_response = object_instance->handle_post_request(NULL,NULL,handler,execute_value_updated); + + CHECK( coap_response != NULL); + if(coap_response) { + if (coap_response->options_list_ptr) { + if (coap_response->options_list_ptr->location_path_ptr) { + free(coap_response->options_list_ptr->location_path_ptr); + coap_response->options_list_ptr->location_path_ptr = NULL; + } + free(coap_response->options_list_ptr); + coap_response->options_list_ptr = NULL; + } + } + + free(coap_header->options_list_ptr); + free(coap_header->payload_ptr); + free(common_stub::coap_header); + free(coap_header); + m2mtlvdeserializer_stub::clear(); + common_stub::clear(); + m2mbase_stub::clear(); + +} + +void Test_M2MObjectInstance::test_notification_update() +{ + M2MBase::Observation obs_level = M2MBase::O_Attribute; + + object_instance->notification_update(obs_level); + //CHECK(callback->visited == true); + + obs_level = M2MBase::OI_Attribute; + + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + m2mbase_stub::bool_value = true; + + object_instance->notification_update(obs_level); + + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mobjectinstance/test_m2mobjectinstance.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_OBJECT_INSTANCE_H +#define TEST_M2M_OBJECT_INSTANCE_H + +#include "m2mobjectinstance.h" + +class Handler; +class Callback; + +class Test_M2MObjectInstance +{ +public: + Test_M2MObjectInstance(); + + virtual ~Test_M2MObjectInstance(); + + void test_create_static_resource(); + + void test_create_static_resource_instance(); + + void test_create_dynamic_resource(); + + void test_create_dynamic_resource_instance(); + + void test_remove_resource(); + + void test_remove_resource_instance(); + + void test_resource(); + + void test_resources(); + + void test_resource_count(); + + void test_total_resource_count(); + + void test_base_type(); + + void test_handle_get_request(); + + void test_handle_put_request(); + + void test_handle_post_request(); + + void test_notification_update(); + + void test_ctor(); + + M2MObjectInstance* object_instance; + + Handler* handler; + + M2MObject* object; +}; + +#endif // TEST_M2M_OBJECT_INSTANCE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mreporthandler/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") + + +add_executable(m2mreporthandler + "main.cpp" + "m2mreporthandlertest.cpp" + "test_m2mreporthandler.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../../../../source/m2mreporthandler.cpp" + +) +target_link_libraries(m2mreporthandler + CppUTest + CppUTestExt +) + +set_target_properties(m2mreporthandler +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mreporthandler") +add_test(m2mreporthandler ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mreporthandler/m2mreporthandlertest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "CppUTestExt/MockSupport.h" +#include "test_m2mreporthandler.h" + + +TEST_GROUP(M2MReportHandler) +{ + Test_M2MReportHandler* m2m_reporthandler; + + void setup() + { + m2m_reporthandler = new Test_M2MReportHandler(); + } + void teardown() + { + delete m2m_reporthandler; + mock().clear(); + } +}; + +TEST(M2MReportHandler, Create) +{ + CHECK(m2m_reporthandler != NULL); +} + +TEST(M2MReportHandler, test_set_under_observation) +{ + m2m_reporthandler->test_set_under_observation(); +} + +TEST(M2MReportHandler, test_parse_notification_attribute) +{ + m2m_reporthandler->test_parse_notification_attribute(); +} + +TEST(M2MReportHandler, test_timer_expired) +{ + m2m_reporthandler->test_timer_expired(); +} + +TEST(M2MReportHandler, test_set_value) +{ + m2m_reporthandler->test_set_value(); +} + +TEST(M2MReportHandler, test_trigger_object_notification) +{ + m2m_reporthandler->test_trigger_object_notification(); +} + +TEST(M2MReportHandler, test_set_string_notification_trigger) +{ + m2m_reporthandler->test_set_string_notification_trigger(); +} + +TEST(M2MReportHandler, test_timers) +{ + m2m_reporthandler->test_timers(); +} + +TEST(M2MReportHandler, test_attribute_flags) +{ + m2m_reporthandler->test_attribute_flags(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mreporthandler/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MReportHandler);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mreporthandler/test_m2mreporthandler.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,456 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "CppUTestExt/MockSupport.h" +#include "m2mtimer_stub.h" +#include "test_m2mreporthandler.h" +#include "m2mobservationhandler.h" +#include "m2mtimer.h" +#include "m2mtimerobserver.h" +#include "m2mbase.h" + +class Observer : public M2MReportObserver{ + +public: + + Observer() : visited(false) {} + virtual ~Observer(){} + void observation_to_be_sent(m2m::Vector<uint16_t>,bool){ + visited = true; + } + bool visited; +}; + +class TimerObserver : public M2MTimerObserver +{ +public: + TimerObserver() : visited(false) {} + virtual ~TimerObserver(){} + + virtual void timer_expired(M2MTimerObserver::Type ){ + visited = true; + } + + bool visited; +}; + +Test_M2MReportHandler::Test_M2MReportHandler() +{ + _observer = new Observer(); + M2MReportHandler handler(*_observer); + _handler = new M2MReportHandler(*_observer); +} + +Test_M2MReportHandler::~Test_M2MReportHandler() +{ + delete _handler; + delete _observer; + m2mtimer_stub::clear(); +} + +void Test_M2MReportHandler::test_set_under_observation() +{ + m2mtimer_stub::enable_mock = true; + + _observer->visited = false; + + mock().clear(); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmin_timer); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmax_timer); + _handler->set_under_observation(true); + CHECK(false == _observer->visited); + + mock().expectOneCall("stop_timer").onObject(&_handler->_pmin_timer); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmax_timer); + _observer->visited = false; + _handler->set_under_observation(false); + CHECK(false == _observer->visited); + mock().checkExpectations(); + + m2mtimer_stub::enable_mock = false; +} + +void Test_M2MReportHandler::test_parse_notification_attribute() +{ + char* val = {"value"}; + CHECK(false == _handler->parse_notification_attribute(val, M2MBase::ObjectInstance )); + + char* val2 = {"value&eval"}; + CHECK(false == _handler->parse_notification_attribute(val2, M2MBase::ObjectInstance )); + + char* val3 = {"toolongvaluevaluevaluevaluevalue&toolongvaluevaluevaluevaluevalue"}; + CHECK(false == _handler->parse_notification_attribute(val3, M2MBase::ObjectInstance )); + + char* val_real = {"st=6&pmax=3<=1>=100"}; + CHECK(true == _handler->parse_notification_attribute(val_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* val_real1 = {"a=1&pmin=2&pmax=3>=4<=5&st=6"}; + CHECK(false == _handler->parse_notification_attribute(val_real1, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* val2_real = {"st=6<=50>=1"}; + CHECK(false == _handler->parse_notification_attribute(val2_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* val3_real = {"gt=40<=5&st=6"}; + CHECK(true == _handler->parse_notification_attribute(val3_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + _handler->set_default_values(); + + char* val5_real = {"pmin=10"}; + CHECK(true == _handler->parse_notification_attribute(val5_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* val6_real = {"pmin=100&pmax=5"}; + CHECK(false == _handler->parse_notification_attribute(val6_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* val7_real = {"st=6&pmax=30<=1>=100&pmin=0"}; + CHECK(true == _handler->parse_notification_attribute(val7_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* val8_real = {"pmax=30<=10>=5&pmin=1"}; + CHECK(false == _handler->parse_notification_attribute(val8_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + // low = lt + 2 * st = 18 + char* val9_real = {"pmax=30<=10>=17&pmin=1&st=4"}; + CHECK(false == _handler->parse_notification_attribute(val9_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + // low = lt + 2 * st = 18 + char* val10_real = {"pmax=30<=10>=19&pmin=1&st=4"}; + CHECK(true == _handler->parse_notification_attribute(val10_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* val11_real = {"pmax=30&pmin=30"}; + CHECK(true == _handler->parse_notification_attribute(val11_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + _handler->set_default_values(); + + char* inst_real = {"st=6&pmax=3<=1>=100"}; + CHECK(true == _handler->parse_notification_attribute(inst_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst1_real1 = {"a=1&pmin=2&pmax=3>=4<=5&st=6"}; + CHECK(false == _handler->parse_notification_attribute(inst1_real1, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst2_real = {"st=6<=50>=1"}; + CHECK(false == _handler->parse_notification_attribute(inst2_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst3_real = {"gt=40<=5&st=6"}; + CHECK(true == _handler->parse_notification_attribute(inst3_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + _handler->set_default_values(); + char* inst5_real = {"pmin=10"}; + CHECK(true == _handler->parse_notification_attribute(inst5_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst6_real = {"pmin=100&pmax=5"}; + CHECK(false == _handler->parse_notification_attribute(inst6_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst7_real = {"st=6&pmax=30<=1>=100&pmin=0"}; + CHECK(true == _handler->parse_notification_attribute(inst7_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst8_real = {"pmax=30<=10>=5&pmin=1"}; + CHECK(false == _handler->parse_notification_attribute(inst8_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + // low = lt + 2 * st = 18 + char* inst9_real = {"pmax=30<=10>=17&pmin=1&st=4"}; + CHECK(false == _handler->parse_notification_attribute(inst9_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + // low = lt + 2 * st = 18 + char* inst10_real = {"pmax=30<=10>=19&pmin=1&st=4"}; + CHECK(true == _handler->parse_notification_attribute(inst10_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst11_real = {"pmax=30&pmin=30"}; + CHECK(true == _handler->parse_notification_attribute(inst11_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + char* inst12_real = {"pmax=&pmin=30"}; + CHECK(false == _handler->parse_notification_attribute(inst12_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + char* inst13_real = {"st="}; + CHECK(false == _handler->parse_notification_attribute(inst13_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + _handler->set_default_values(); + + char* inst14_real = {"stp=10"}; + CHECK(true == _handler->parse_notification_attribute(inst14_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + char* inst15_real = {"stp=10&st=15"}; + CHECK(true == _handler->parse_notification_attribute(inst15_real, M2MBase::Resource, + M2MResourceInstance::INTEGER )); + + _handler->set_default_values(); + + DOUBLES_EQUAL(0,_handler->_lt,0); + DOUBLES_EQUAL(0,_handler->_gt,0); + DOUBLES_EQUAL(-1,_handler->_pmax,0); + DOUBLES_EQUAL(1,_handler->_pmin,0); + DOUBLES_EQUAL(0,_handler->_st,0); + DOUBLES_EQUAL(0,_handler->_high_step,0); + DOUBLES_EQUAL(0,_handler->_low_step,0); + DOUBLES_EQUAL(-1,_handler->_last_value,0); + DOUBLES_EQUAL(0,_handler->_attribute_state,0); + CHECK_FALSE(_handler->_pmin_exceeded); + CHECK_FALSE(_handler->_pmax_exceeded); +} + +void Test_M2MReportHandler::test_timer_expired() +{ + _handler->timer_expired(M2MTimerObserver::Notdefined); + CHECK(_observer->visited == false); + + _handler->_notify = true; + _handler->_pmin_exceeded = true; + _handler->timer_expired(M2MTimerObserver::PMaxTimer); + CHECK(_observer->visited == true); + + _handler->_pmin_exceeded = false; + _handler->_notify = false; + _handler->_attribute_state = M2MReportHandler::Pmax; + _handler->_current_value = 100; + _handler->timer_expired(M2MTimerObserver::PMinTimer); + CHECK(_handler->_pmin_exceeded == true); + + _observer->visited = false; + _handler->_notify = true; + _handler->timer_expired(M2MTimerObserver::PMinTimer); + CHECK(_observer->visited == true); + + _handler->_notify = true; + _handler->_pmin_exceeded = true; + _handler->timer_expired(M2MTimerObserver::PMinTimer); + CHECK(_handler->_pmin_exceeded == true); + + _handler->_notify = true; + _handler->_pmin_exceeded = false; + _handler->_attribute_state = M2MReportHandler::Pmax; + _handler->timer_expired(M2MTimerObserver::PMaxTimer); + CHECK(_handler->_pmax_exceeded == true); +} + +void Test_M2MReportHandler::test_set_value() +{ + _handler->_notify = true; + _handler->_pmin_exceeded = false; + _observer->visited = false; + + _handler->set_value(1); + _handler->set_value(10); + CHECK(_observer->visited == true); + + char* query = {"st=6"}; + _handler->_attribute_state = 0; + CHECK(true == _handler->parse_notification_attribute(query, + M2MBase::Resource, + M2MResourceInstance::INTEGER)); + _observer->visited = false; + _handler->set_value(15); + CHECK(_observer->visited == false); + + _observer->visited = false; + _handler->set_value(21); + CHECK(_observer->visited == true); + + _handler->set_value(10); + char* query2 = {"st=3<=10>=100"}; + _handler->_attribute_state = 0; + CHECK(true == _handler->parse_notification_attribute(query2, + M2MBase::Resource, + M2MResourceInstance::INTEGER)); + + _observer->visited = false; + _handler->set_value(12); + CHECK(_observer->visited == false); + + _observer->visited = false; + _handler->set_value(15); + CHECK(_observer->visited == true); + + _observer->visited = false; + _handler->set_value(5); + CHECK(_observer->visited == true); + + _observer->visited = false; + _handler->set_value(4); + CHECK(_observer->visited == true); + + _observer->visited = false; + _handler->set_value(101); + CHECK(_observer->visited == true); + + _observer->visited = false; + _handler->set_value(102); + CHECK(_observer->visited == true); + + char* query3 = {"lt=10"}; + _handler->set_default_values(); + CHECK(true == _handler->parse_notification_attribute(query3, M2MBase::Resource, M2MResourceInstance::INTEGER)); + _observer->visited = false; + _handler->set_value(9); + CHECK(_observer->visited == true); + + _observer->visited = false; + _handler->set_value(15); + CHECK(_observer->visited == false); + + char* query4 = {"gt=10"}; + _handler->set_default_values(); + CHECK(true == _handler->parse_notification_attribute(query4, M2MBase::Resource, M2MResourceInstance::INTEGER)); + + // Instantiate timers + _handler->_attribute_state |= M2MReportHandler::Pmin; + _handler->handle_timers(); + _observer->visited = false; + _handler->set_value(9); + CHECK(_observer->visited == false); + // Stop timers and reset flag to previous state + _handler->stop_timers(); + _handler->_attribute_state = M2MReportHandler::Gt; + + _observer->visited = false; + _handler->set_value(15); + CHECK(_observer->visited == true); + + _observer->visited = false; + _handler->set_value(16); + CHECK(_observer->visited == true); + + _observer->visited = false; + char* query5 = {"gt=10"}; + _handler->set_default_values(); + CHECK(false == _handler->parse_notification_attribute(query5, M2MBase::Resource, M2MResourceInstance::STRING)); + + _observer->visited = false; + char* query6 = {"pmin=10"}; + _handler->set_default_values(); + CHECK(true == _handler->parse_notification_attribute(query6, M2MBase::Resource, M2MResourceInstance::STRING)); + + _observer->visited = false; + char* query7 = {"pmin=10&pmax=20"}; + _handler->set_default_values(); + CHECK(true == _handler->parse_notification_attribute(query7, M2MBase::Resource, M2MResourceInstance::OPAQUE)); + + _observer->visited = false; + _handler->handle_timers(); + _handler->set_value(26); + _handler->_pmin_exceeded = true; + _handler->timer_expired(M2MTimerObserver::PMaxTimer); + CHECK(_observer->visited == true); +} + +void Test_M2MReportHandler::test_trigger_object_notification() +{ + _handler->_notify = true; + _handler->_pmin_exceeded = true; + _handler->set_notification_trigger(); + CHECK(_handler->_pmin_exceeded == false); + CHECK(_observer->visited == true); + + _handler->_changed_instance_ids.push_back(0); + _handler->_changed_instance_ids.push_back(1); + _handler->_changed_instance_ids.push_back(2); + + _handler->set_notification_trigger(); + CHECK(_handler->_pmin_exceeded == false); + CHECK(_observer->visited == true); + +} + +void Test_M2MReportHandler::test_set_string_notification_trigger() +{ + _handler->_notify = true; + _handler->_pmin_exceeded = true; + _handler->set_notification_trigger(); + CHECK(_handler->_pmin_exceeded == false); +} + +void Test_M2MReportHandler::test_timers() +{ + m2mtimer_stub::enable_mock = true; + // No timers should start when _attribute_state == 0 + _handler->handle_timers(); + mock().checkExpectations(); + + // pmin starts when _attribute_state |= pmin + mock().clear(); + mock().expectOneCall("start_timer").onObject(&_handler->_pmin_timer); + _handler->_attribute_state |= M2MReportHandler::Pmin; + _handler->handle_timers(); + mock().checkExpectations(); + + // pmin gets stopped + mock().clear(); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmin_timer); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmax_timer); + _handler->stop_timers(); + mock().checkExpectations(); + + // pmin starts when _attribute_state |= pmin & pmax but _pmax value is default -1 + // pmax should not start + mock().clear(); + mock().expectOneCall("start_timer").onObject(&_handler->_pmin_timer); + _handler->_attribute_state |= M2MReportHandler::Pmax; + _handler->handle_timers(); + mock().checkExpectations(); + + // pmin and pmax get stopped + mock().clear(); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmin_timer); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmax_timer); + _handler->stop_timers(); + mock().checkExpectations(); + + // max timer is started when pmax == pmin + mock().clear(); + mock().expectOneCall("start_timer").onObject(&_handler->_pmax_timer); + _handler->_pmax = 2; + _handler->_pmin = 2; + _handler->handle_timers(); + mock().checkExpectations(); + CHECK(_handler->_pmin_exceeded == true); + + /* + mock().clear(); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmin_timer); + mock().expectOneCall("stop_timer").onObject(&_handler->_pmax_timer); + _handler->stop_timers(); + mock().checkExpectations(); +*/ + m2mtimer_stub::enable_mock = false; +} + +void Test_M2MReportHandler::test_attribute_flags() +{ + CHECK(_handler->attribute_flags() == 0); + _handler->_attribute_state = M2MReportHandler::Pmax | M2MReportHandler::Pmin | + M2MReportHandler::St | M2MReportHandler::Gt | M2MReportHandler::Lt | M2MReportHandler::Cancel; + CHECK(_handler->attribute_flags() == (1 << 6) - 1); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mreporthandler/test_m2mreporthandler.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_REPORT_HANDLER_H +#define TEST_M2M_REPORT_HANDLER_H + +#include "m2mreporthandler.h" + +class Observer; + +class Test_M2MReportHandler +{ +public: + Test_M2MReportHandler(); + + virtual ~Test_M2MReportHandler(); + + void test_set_under_observation(); + + void test_parse_notification_attribute(); + + void test_timer_expired(); + + void test_set_value(); + + void test_trigger_object_notification(); + + void test_set_string_notification_trigger(); + + void test_timers(); + + void test_attribute_flags(); + + M2MReportHandler *_handler; + Observer * _observer; +}; + + +#endif // TEST_M2M_BASE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresource/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mresource + "../../../../source/m2mresource.cpp" + "main.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/m2mreporthandler_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mtlvdeserializer_stub.cpp" + "../stub/m2mtlvserializer_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../stub/common_stub.cpp" + "m2mresourcetest.cpp" + "test_m2mresource.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mresource + CppUTest + CppUTestExt +) +set_target_properties(m2mresource +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mresource") +add_test(m2mresource ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresource/m2mresourcetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mresource.h" + +TEST_GROUP(M2MResource) +{ + Test_M2MResource* m2m_resource; + + void setup() + { + m2m_resource = new Test_M2MResource(); + } + void teardown() + { + delete m2m_resource; + } +}; + +TEST(M2MResource, Create) +{ + CHECK(m2m_resource != NULL); +} + +TEST(M2MResource, static_resource) +{ + m2m_resource->test_static_resource(); +} + +TEST(M2MResource, base_type) +{ + m2m_resource->test_base_type(); +} + +TEST(M2MResource, muliptle_instances) +{ + m2m_resource->test_muliptle_instances(); +} + +TEST(M2MResource, test_handle_observation_attribute) +{ + m2m_resource->test_handle_observation_attribute(); +} + +TEST(M2MResource, test_add_resource_instance) +{ + m2m_resource->test_add_resource_instance(); +} + +TEST(M2MResource, test_remove_resource_instance) +{ + m2m_resource->test_remove_resource_instance(); +} + +TEST(M2MResource, test_resource_instance_count) +{ + m2m_resource->test_resource_instance_count(); +} + +TEST(M2MResource, test_resource_instances) +{ + m2m_resource->test_resource_instances(); +} + +TEST(M2MResource, test_resource_instance) +{ + m2m_resource->test_resource_instance(); +} + +TEST(M2MResource, test_add_observation_level) +{ + m2m_resource->test_add_observation_level(); +} + +TEST(M2MResource, test_remove_observation_level) +{ + m2m_resource->test_remove_observation_level(); +} + +TEST(M2MResource, test_handle_get_request) +{ + m2m_resource->test_handle_get_request(); +} + +TEST(M2MResource, test_handle_put_request) +{ + m2m_resource->test_handle_put_request(); +} + +TEST(M2MResource, test_handle_post_request) +{ + m2m_resource->test_handle_post_request(); +} + +TEST(M2MResource, test_notification_update) +{ + m2m_resource->test_notification_update(); +} + +TEST(M2MResource, test_set_delayed_response) +{ + m2m_resource->test_set_delayed_response(); +} + +TEST(M2MResource, test_send_delayed_post_response) +{ + m2m_resource->test_send_delayed_post_response(); +} + +TEST(M2MResource, test_get_delayed_token) +{ + m2m_resource->test_get_delayed_token(); +} + +TEST(M2MResource, test_delayed_response) +{ + m2m_resource->test_delayed_response(); +} + +TEST(M2MResource, test_execute_params) +{ + m2m_resource->test_execute_params(); +} + +TEST(M2MResource, test_ctor) +{ + m2m_resource->test_ctor(); +} + +TEST(M2MResource, test_get_parent_object_instance) +{ + m2m_resource->test_get_parent_object_instance(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresource/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MResource);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresource/test_m2mresource.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,632 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mresource.h" +#include "CppUTest/MemoryLeakDetectorMallocMacros.h" +#include "m2mbase_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mtlvdeserializer_stub.h" +#include "m2mreporthandler_stub.h" +#include "m2mobject_stub.h" +#include "common_stub.h" +#include "m2mreporthandler.h" + +class TestReportObserver : public M2MReportObserver{ +public : + TestReportObserver() {} + ~TestReportObserver() {} + void observation_to_be_sent(m2m::Vector<uint16_t>,bool){ } +}; + +class Handler : public M2MObservationHandler { + +public: + + Handler(){} + ~Handler(){} + void observation_to_be_sent(M2MBase *, uint16_t,m2m::Vector<uint16_t>,bool){ + visited = true; + } + void send_delayed_response(M2MBase *){} + void resource_to_be_deleted(M2MBase *){visited=true;} + void remove_object(M2MBase *){visited = true;} + void value_updated(M2MBase *,const String&){visited = true;} + + void clear() {visited = false;} + bool visited; +}; + +Test_M2MResource::Test_M2MResource() +{ + handler = new Handler(); + object = new M2MObject("name", "name"); + object_instance = new M2MObjectInstance(*object, "name", "type", ""); + resource = new M2MResource(*object_instance, + "name","resource_type", + M2MResourceInstance::INTEGER,false, "name"); +} + +Test_M2MResource::~Test_M2MResource() +{ + delete object; + delete object_instance; + delete resource; + delete handler; + m2mtlvdeserializer_stub::clear(); +} + +void Test_M2MResource::test_static_resource() +{ + u_int8_t value[] = {"value"}; + M2MResource *res = new M2MResource(*m2mobject_stub::inst, + "name", + "resource_type", + M2MResourceInstance::INTEGER, + value, + (uint32_t)sizeof(value),"name"); + + CHECK(res != NULL); + delete res; + +} + +void Test_M2MResource::test_base_type() +{ + m2mresourceinstance_stub::base_type = M2MBase::Resource; + CHECK(M2MBase::Resource == resource->base_type()); +} + +void Test_M2MResource::test_muliptle_instances() +{ + CHECK(false == resource->supports_multiple_instances()); +} + +void Test_M2MResource::test_handle_observation_attribute() +{ + char *d = "s"; + + m2mresourceinstance_stub::resource_type = M2MResourceInstance::INTEGER; + CHECK(false == resource->handle_observation_attribute(d)); + + m2mresourceinstance_stub::resource_type = M2MResourceInstance::FLOAT; + CHECK(false == resource->handle_observation_attribute(d)); + + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::INTEGER, + 0, + "name", + false); + + resource->add_resource_instance(res); + + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + + m2mbase_stub::bool_value = true; + CHECK(false == resource->handle_observation_attribute(d)); + + resource->_resource_type = M2MResourceInstance::INTEGER; + m2mreporthandler_stub::bool_return = true; + CHECK(true == resource->handle_observation_attribute(d)); + + m2mbase_stub::bool_value = false; + CHECK(true == resource->handle_observation_attribute(d)); + + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; +} + +void Test_M2MResource::test_add_resource_instance() +{ + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::INTEGER, + 0, + "name", + false); + resource->add_resource_instance(res); + CHECK(resource->_resource_instance_list.size() == 1); +} + +void Test_M2MResource::test_remove_resource_instance() +{ + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + resource->_resource_instance_list.push_back(res); + CHECK(resource->remove_resource_instance(0) == true); +} + +void Test_M2MResource::test_resource_instance() +{ + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + resource->_resource_instance_list.push_back(res); + CHECK(resource->resource_instance(0) != NULL); +} + +void Test_M2MResource::test_resource_instances() +{ + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + resource->_resource_instance_list.push_back(res); + M2MResourceInstanceList list = resource->resource_instances(); + CHECK(list.size() ==1); +} + +void Test_M2MResource::test_resource_instance_count() +{ + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + resource->_resource_instance_list.push_back(res); + CHECK(resource->resource_instance_count() ==1); +} + +void Test_M2MResource::test_add_observation_level() +{ + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + resource->_resource_instance_list.push_back(res); + + M2MBase::Observation obs_level = M2MBase::R_Attribute; + + resource->add_observation_level(obs_level); +} + +void Test_M2MResource::test_remove_observation_level() +{ + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "type", + M2MResourceInstance::STRING, + 0, + "name", + false); + resource->_resource_instance_list.push_back(res); + + M2MBase::Observation obs_level = M2MBase::R_Attribute; + + resource->remove_observation_level(obs_level); +} + +void Test_M2MResource::test_handle_get_request() +{ + uint8_t value[] = {"name"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_GET; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + + coap_header->token_ptr = (uint8_t*)malloc(sizeof(value)); + memcpy(coap_header->token_ptr, value, sizeof(value)); + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->observe = 0; + + coap_header->content_format = sn_coap_content_format_e(110); + + m2mresourceinstance_stub::header = NULL; + + M2MResourceInstance *res_instance = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "res2", + M2MResourceInstance::STRING, + 0, + "name", + false); + + M2MResourceInstance *res_instance_1 = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "res2", + M2MResourceInstance::STRING, + 0, + "name", + false); + CHECK(resource->handle_get_request(NULL,coap_header,handler) == NULL); + + resource->_has_multiple_instances = true; + resource->add_resource_instance(res_instance); + resource->add_resource_instance(res_instance_1); + + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + // Not OMA TLV or JSON + common_stub::coap_header->content_format = sn_coap_content_format_e(-1); + m2mbase_stub::uint8_value = 110; + coap_header->content_format = sn_coap_content_format_e(-1); + + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + // OMA TLV + m2mbase_stub::uint8_value = 99; + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + // OMA JSON + m2mbase_stub::uint8_value = 100; + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 0; + m2mbase_stub::uint16_value = 0x1c1c; + m2mbase_stub::bool_value = true; + + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::uint16_value = 10; + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 0; + + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 1; + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + // Not observable + m2mbase_stub::bool_value = false; + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + CHECK(resource->handle_get_request(NULL,coap_header,handler) != NULL); + + CHECK(resource->handle_get_request(NULL,NULL,handler) != NULL); + + if(coap_header->token_ptr) { + free(coap_header->token_ptr); + coap_header->token_ptr = NULL; + } + if(coap_header->options_list_ptr) { + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + } + + if(common_stub::coap_header){ + if(common_stub::coap_header->options_list_ptr) { + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + free(common_stub::coap_header); + common_stub::coap_header = NULL; + } + free(coap_header); + coap_header = NULL; + + m2mbase_stub::clear(); + common_stub::clear(); +} + +void Test_M2MResource::test_handle_put_request() +{ + uint8_t value[] = {"name"}; + bool execute_value_updated = false; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::PUT_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + coap_header->payload_ptr = (uint8_t*)malloc(1); + + sn_coap_hdr_s *coap_response = NULL; + + m2mresourceinstance_stub::header = NULL; + + CHECK(resource->handle_put_request(NULL,coap_header,handler,execute_value_updated) == NULL); + + resource->_has_multiple_instances = true; + m2mbase_stub::uint8_value = 99; + coap_header->content_format = sn_coap_content_format_e(-1); + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mbase_stub::uint8_value = 0; + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->uri_query_ptr = value; + coap_header->options_list_ptr->uri_query_len = sizeof(value); + + coap_header->content_format = sn_coap_content_format_e(99); + m2mtlvdeserializer_stub::bool_value = true; + + m2mbase_stub::bool_value = false; + + + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::bool_value = false; + + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotFound; + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotValid; + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::error = M2MTLVDeserializer::NotAllowed; + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + coap_header->content_format = sn_coap_content_format_e(100); + + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + m2mbase_stub::bool_value = true; + + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + coap_response = resource->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + coap_response = resource->handle_put_request(NULL,NULL,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + //free(coap_header->options_list_ptr); + free(coap_header->payload_ptr); + free(common_stub::coap_header); + free(coap_header); + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; + m2mtlvdeserializer_stub::clear(); + common_stub::clear(); + m2mbase_stub::clear(); +} + +void Test_M2MResource::test_handle_post_request() +{ + uint8_t value[] = {"name"}; + bool execute_value_updated = false; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_POST; + + String *name = new String("name"); + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::POST_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + coap_header->payload_ptr = (uint8_t*)malloc(1); + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->uri_query_ptr = value; + coap_header->options_list_ptr->uri_query_len = sizeof(value); + + coap_header->content_format = sn_coap_content_format_e(99); + + + resource->_delayed_response = true; + resource->_delayed_token = (uint8_t*)malloc(1); + *resource->_delayed_token = 2; + coap_header->token_ptr = (uint8_t*)malloc(1); + *coap_header->token_ptr = 1; + coap_header->token_len = 1; + + m2mbase_stub::bool_value = false; + m2mresourceinstance_stub::string_value = name; + + CHECK(resource->handle_post_request(NULL,coap_header,handler,execute_value_updated) != NULL); + + coap_header->content_format = sn_coap_content_format_e(0); + + CHECK(resource->handle_post_request(NULL,coap_header,handler,execute_value_updated) != NULL); + + m2mresourceinstance_stub::int_value = sizeof(value); + m2mresourceinstance_stub::value = value; + + resource->_delayed_response = false; + sn_coap_hdr_s *coap_response = resource->handle_post_request(NULL,coap_header,handler,execute_value_updated); + + CHECK(coap_response != NULL); + free(coap_response->payload_ptr); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + CHECK(resource->handle_post_request(NULL,coap_header,handler,execute_value_updated) != NULL); + + CHECK(resource->handle_post_request(NULL,NULL,handler,execute_value_updated) != NULL); + + free(coap_header->token_ptr); + free(coap_header->options_list_ptr); + free(coap_header->payload_ptr); + + delete name; + free(coap_header); + free(common_stub::coap_header); + + m2mbase_stub::clear(); + common_stub::clear(); +} + +void Test_M2MResource::test_notification_update() +{ + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + m2mbase_stub::bool_value = true; + + resource->notification_update(); + + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; +} + +void Test_M2MResource::test_set_delayed_response() +{ + resource->set_delayed_response(true); + CHECK(resource->_delayed_response == true); +} + +void Test_M2MResource::test_send_delayed_post_response() +{ + resource->_delayed_response = true; + m2mbase_stub::observe = handler; + CHECK(resource->send_delayed_post_response() == true); +} + +void Test_M2MResource::test_get_delayed_token() +{ + uint8_t value[] = {"1"}; + uint8_t *token = NULL; + uint8_t token_len = 0; + resource->_delayed_token_len = 1; + resource->_delayed_token = (uint8_t*)malloc(sizeof(1)); + memcpy(resource->_delayed_token,value,1); + resource->get_delayed_token(token,token_len); + CHECK(token != NULL); + free(token); + + token = NULL; + token = (uint8_t*)malloc(1); + token_len = 1; + resource->get_delayed_token(token,token_len); + CHECK(token != NULL); + free(token); + +} + +void Test_M2MResource::test_delayed_response() +{ + resource->_delayed_response = false; + CHECK(resource->delayed_response() == false); +} + +void Test_M2MResource::test_execute_params() +{ + M2MResource::M2MExecuteParameter *params = new M2MResource::M2MExecuteParameter(); + CHECK(params->get_argument_value() == NULL); + CHECK(params->get_argument_value_length() == 0); + CHECK(params->get_argument_object_name() == ""); + CHECK(params->get_argument_resource_name() == ""); + CHECK(params->get_argument_object_instance_id() == 0); + + uint8_t value[] = {"test"}; + int length = sizeof(value); + params->_value = (uint8_t*)malloc(length); + memcpy(params->_value,value,length); + params->_value_length = length; + params->_object_name = "object"; + params->_resource_name = "resource"; + params->_object_instance_id = 0; + CHECK(params->_value == params->get_argument_value()); + CHECK(params->_value_length == params->get_argument_value_length()); + CHECK(params->_resource_name == params->get_argument_resource_name()); + CHECK(params->_object_name == params->get_argument_object_name()); + CHECK(params->_object_instance_id == params->get_argument_object_instance_id()); + + delete params; +} + +void Test_M2MResource::test_ctor() +{ + M2MResource* res = new M2MResource(*m2mobject_stub::inst,¶ms,M2MResourceInstance::INTEGER,0); + delete res; +} + +void Test_M2MResource::test_get_parent_object_instance() +{ + M2MResource* res = new M2MResource(*m2mobject_stub::inst,¶ms,M2MResourceInstance::INTEGER,0); + + // Only for the code coverage + res->get_parent_object_instance(); + delete res; + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresource/test_m2mresource.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_RESOURCE_H +#define TEST_M2M_RESOURCE_H + +#include "m2mresource.h" + +class Callback; +class Handler; + +class Test_M2MResource +{ +public: + + Test_M2MResource(); + + virtual ~Test_M2MResource(); + + void test_static_resource(); + + void test_base_type(); + + void test_muliptle_instances(); + + void test_handle_observation_attribute(); + + void test_add_resource_instance(); + + void test_remove_resource_instance(); + + void test_resource_instance(); + + void test_resource_instances(); + + void test_resource_instance_count(); + + void test_add_observation_level(); + + void test_remove_observation_level(); + + void test_handle_get_request(); + + void test_handle_put_request(); + + void test_handle_post_request(); + + void test_notification_update(); + + void test_set_delayed_response(); + + void test_send_delayed_post_response(); + + void test_get_delayed_token(); + + void test_delayed_response(); + + void test_execute_params(); + + void test_ctor(); + + void test_get_parent_object_instance(); + + M2MObjectInstance* object_instance; + M2MObject* object; + M2MResource* resource; + Handler* handler; +}; + +#endif // TEST_M2M_RESOURCE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresourceinstance/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mresourceinstance + "../../../../source/m2mresourceinstance.cpp" + "main.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mtimer_stub.cpp" + "../stub/m2mreporthandler_stub.cpp" + "../stub/common_stub.cpp" + "../stub/m2mtlvdeserializer_stub.cpp" + "../stub/m2mblockmessage_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mobject_stub.cpp" + "m2mresourceinstancetest.cpp" + "test_m2mresourceinstance.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mresourceinstance + CppUTest + CppUTestExt +) +set_target_properties(m2mresourceinstance +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mresourceinstance") +add_test(m2mresourceinstance ${binary}) + + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresourceinstance/m2mresourceinstancetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mresourceinstance.h" + +TEST_GROUP(M2MResourceInstance) +{ + Test_M2MResourceInstance* m2m_resourceinstance; + + void setup() + { + m2m_resourceinstance = new Test_M2MResourceInstance(); + } + void teardown() + { + delete m2m_resourceinstance; + } +}; + +TEST(M2MResourceInstance, Create) +{ + CHECK(m2m_resourceinstance != NULL); +} + +TEST(M2MResourceInstance, test_static_resource_instance) +{ + m2m_resourceinstance->test_static_resource_instance(); +} + +TEST(M2MResourceInstance, base_type) +{ + m2m_resourceinstance->test_base_type(); +} + +TEST(M2MResourceInstance, test_handle_observation_attribute) +{ + m2m_resourceinstance->test_handle_observation_attribute(); +} + +TEST(M2MResourceInstance, test_set_execute_function) +{ + m2m_resourceinstance->test_set_execute_function(); +} + +TEST(M2MResourceInstance, test_execute) +{ + m2m_resourceinstance->test_execute(); +} + +TEST(M2MResourceInstance, test_resource_instance_type) +{ + m2m_resourceinstance->test_resource_instance_type(); +} + +TEST(M2MResourceInstance, test_set_value) +{ + m2m_resourceinstance->test_set_value(); +} + +TEST(M2MResourceInstance, test_clear_value) +{ + m2m_resourceinstance->test_clear_value(); +} + +TEST(M2MResourceInstance, test_get_value) +{ + m2m_resourceinstance->test_get_value(); +} + +TEST(M2MResourceInstance, test_value) +{ + m2m_resourceinstance->test_value(); +} + +TEST(M2MResourceInstance, test_value_length) +{ + m2m_resourceinstance->test_value_length(); +} + +TEST(M2MResourceInstance, test_handle_get_request) +{ + m2m_resourceinstance->test_handle_get_request(); +} + +TEST(M2MResourceInstance, test_handle_put_request) +{ + m2m_resourceinstance->test_handle_put_request(); +} + +TEST(M2MResourceInstance, test_set_resource_observer) +{ + m2m_resourceinstance->test_set_resource_observer(); +} + +TEST(M2MResourceInstance, test_get_object_instance_id) +{ + m2m_resourceinstance->test_get_object_instance_id(); +} + +TEST(M2MResourceInstance, test_get_object_name) +{ + m2m_resourceinstance->test_get_object_name(); +} + +TEST(M2MResourceInstance, test_set_notification_sent_function) +{ + m2m_resourceinstance->test_set_notification_sent_function(); +} + +TEST(M2MResourceInstance, test_notification_sent) +{ + m2m_resourceinstance->test_notification_sent(); +} + +TEST(M2MResourceInstance, test_ctor) +{ + m2m_resourceinstance->test_ctor(); +} + +TEST(M2MResourceInstance, test_get_parent_resource) +{ + m2m_resourceinstance->test_get_parent_resource(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresourceinstance/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MResourceInstance);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresourceinstance/test_m2mresourceinstance.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,658 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mresourceinstance.h" +#include "CppUTest/MemoryLeakDetectorMallocMacros.h" +#include "m2mbase_stub.h" +#include "m2mobservationhandler.h" +#include "m2mreporthandler.h" +#include "m2mreporthandler_stub.h" +#include "common_stub.h" +#include "m2mtlvdeserializer_stub.h" +#include "m2mblockmessage_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mobject_stub.h" +#include "m2mresource_stub.h" + +static bool cb_visited = false; +static void callback_function(void *args) +{ + cb_visited = true; +} +static void global_notification_sent_function() +{ + cb_visited = true; +} + +class MyTest{ +public: + void execute_function(void */*argument*/) { + visited = true; + } + void block_message_received(M2MBlockMessage */*argument*/) { + block_received = true; + } + void block_message_requested(const String& /*resource*/, uint8_t *&/*data*/, uint32_t &/*len*/) { + block_requested = true; + } + void notification_sent() { + visited = true; + } + + bool visited; + bool block_received; + bool block_requested; +}; + +class ResourceCallback : public M2MResourceCallback { + +public: + + ResourceCallback() : visited(false) {} + ~ResourceCallback(){} + void notification_update() { + visited = true; + } + + void clear() {visited = false;} + bool visited; +}; + +class TestReportObserver : public M2MReportObserver{ +public : + TestReportObserver() {} + ~TestReportObserver() {} + void observation_to_be_sent(m2m::Vector<uint16_t>,bool){ } +}; + +class Handler : public M2MObservationHandler { + +public: + + Handler(){} + ~Handler(){} + void observation_to_be_sent(M2MBase *, uint16_t, m2m::Vector<uint16_t>, bool){ + visited = true; + } + void send_delayed_response(M2MBase *){} + void resource_to_be_deleted(M2MBase *){visited=true;} + void remove_object(M2MBase *){visited = true;} + void value_updated(M2MBase *,const String&){visited = true;} + + void clear() {visited = false;} + bool visited; +}; + +Test_M2MResourceInstance::Test_M2MResourceInstance() +{ + handler = new Handler(); + obj = new M2MObject("name", "name"); + m2mresource_stub::object_instance = new M2MObjectInstance(*obj, "name", "", ""); + m2mobjectinstance_stub::resource = new M2MResource(*m2mresource_stub::object_instance, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + resource_instance = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name", + "resource_type", + M2MResourceInstance::STRING, + 0, + "name", + false); +} + +Test_M2MResourceInstance::~Test_M2MResourceInstance() +{ + delete m2mresource_stub::object_instance; + delete m2mobjectinstance_stub::resource; + delete resource_instance; + delete obj; + delete handler; +} + +void Test_M2MResourceInstance::test_resource_instance_type() +{ + CHECK(resource_instance->resource_instance_type() == M2MResourceInstance::STRING); +} + +void Test_M2MResourceInstance::test_static_resource_instance() +{ + u_int8_t value[] = {"value"}; + m2mbase_stub::mode_value = M2MBase::Dynamic; + M2MResourceInstance *res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name1", + "type1", + M2MResourceInstance::INTEGER, + value, (uint32_t)sizeof(value), + 0, + "name1", + false); + + CHECK(res != NULL); + delete res; + res = NULL; + + m2mbase_stub::mode_value = M2MBase::Static; + m2mbase_stub::nsdl_resource = (sn_nsdl_dynamic_resource_parameters_s*)malloc(sizeof(sn_nsdl_dynamic_resource_parameters_s)); + m2mbase_stub::nsdl_resource->static_resource_parameters = + (sn_nsdl_static_resource_parameters_s*)malloc(sizeof(sn_nsdl_static_resource_parameters_s)); + + res = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "name1", + "type1", + M2MResourceInstance::INTEGER, + value, (uint32_t)sizeof(value), + 0, + "name1", + false); + + free(m2mbase_stub::nsdl_resource->static_resource_parameters->resource); + free(m2mbase_stub::nsdl_resource->static_resource_parameters); + free(m2mbase_stub::nsdl_resource); + CHECK(res != NULL); + delete res; +} + +void Test_M2MResourceInstance::test_base_type() +{ + m2mbase_stub::base_type = M2MBase::Resource; + CHECK(M2MBase::Resource == resource_instance->base_type()); +} + +void Test_M2MResourceInstance::test_handle_observation_attribute() +{ + char *d = "s"; + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + + CHECK(false == resource_instance->handle_observation_attribute(d)); + + resource_instance->_resource_type = M2MResourceInstance::INTEGER; + CHECK(false == resource_instance->handle_observation_attribute(d)); + + resource_instance->_resource_type = M2MResourceInstance::FLOAT; + CHECK(false == resource_instance->handle_observation_attribute(d)); + + m2mreporthandler_stub::bool_return = true; + CHECK(true == resource_instance->handle_observation_attribute(d)); + + m2mbase_stub::bool_value = false; + CHECK(true == resource_instance->handle_observation_attribute(d)); + + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; +} + +void Test_M2MResourceInstance::test_set_execute_function() +{ + MyTest test; + resource_instance->set_execute_function(execute_callback(&test,&MyTest::execute_function)); + resource_instance->set_execute_function(callback_function); +} + +void Test_M2MResourceInstance::test_execute() +{ + MyTest test; + void *args = NULL; + + resource_instance->set_execute_function(execute_callback(&test,&MyTest::execute_function)); + resource_instance->execute(args); + + cb_visited = false; + resource_instance->set_execute_function(callback_function); + resource_instance->execute(args); + CHECK(true == cb_visited); + + // Check delete + cb_visited = false; + resource_instance->set_execute_function(callback_function); + resource_instance->execute(args); + CHECK(true == cb_visited); +} + +void Test_M2MResourceInstance::test_set_value() +{ + u_int8_t value[] = {"value2"}; + resource_instance->_value = (u_int8_t*)malloc(sizeof(u_int8_t)); + m2mbase_stub::bool_value = true; + + CHECK(resource_instance->set_value(value,(u_int32_t)sizeof(value)) == true); + CHECK( resource_instance->_value_length == sizeof(value)); + CHECK( *resource_instance->_value == *value); + + m2mbase_stub::observe = (M2MObservationHandler*)handler; + + u_int8_t value2[] = {"12"}; + CHECK(resource_instance->set_value(value2,(u_int32_t)sizeof(value2)) == true); + + u_int8_t value3[] = {"13"}; + CHECK(resource_instance->set_value(value3,(u_int32_t)sizeof(value3)) == true); + + CHECK(resource_instance->set_value(123456789) == true); + CHECK(memcmp(resource_instance->_value, "123456789", 9) == 0); + + // verify int value helper + CHECK(resource_instance->get_value_int() == 123456789); + + // verify string value helper + CHECK(resource_instance->get_value_string() == "123456789"); + + free(resource_instance->_value); + resource_instance->_value_length = 0; + + CHECK(resource_instance->set_value(NULL,0) == false); + + CHECK(resource_instance->set_value(NULL,0) == false); + + m2mbase_stub::observation_level_value = M2MBase::R_Attribute; + resource_instance->_value = (u_int8_t*)malloc(sizeof(value)+1); + memset(resource_instance->_value,0,sizeof(value)+1); + memcpy(resource_instance->_value,value,sizeof(value)); + resource_instance->_value_length = sizeof(value); + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + + u_int8_t value4[] = {"value4"}; + CHECK(resource_instance->set_value(value4,(u_int32_t)sizeof(value4)) == true); + + + m2mbase_stub::base_type = M2MBase::ResourceInstance; + m2mbase_stub::observation_level_value = M2MBase::O_Attribute; + resource_instance->_resource_type = M2MResourceInstance::INTEGER; + m2mbase_stub::mode_value = M2MBase::Dynamic; + ResourceCallback *resource_cb = new ResourceCallback(); + resource_instance->set_resource_observer(resource_cb); + CHECK(resource_instance->set_value(value2,(u_int32_t)sizeof(value2)) == true); + + // XXX: the callback will not be called on current code with combination of + // M2MBase::Dynamic and M2MBase::R_Attribute. + CHECK(resource_cb->visited == false); + + resource_cb->visited = false; + m2mbase_stub::observation_level_value = M2MBase::R_Attribute; + CHECK(resource_instance->set_value(value3,(u_int32_t)sizeof(value3)) == true); + CHECK(resource_cb->visited == true); + + resource_instance->set_resource_observer(NULL); + resource_cb->visited = false; + m2mbase_stub::observation_level_value = M2MBase::R_Attribute; + CHECK(resource_instance->set_value(value2,(u_int32_t)sizeof(value2)) == true); + CHECK(resource_cb->visited == false); + + + CHECK(resource_instance->set_value(value3,(u_int32_t)sizeof(value3)) == true); + + m2mbase_stub::observation_level_value = M2MBase::OI_Attribute; + + resource_instance->_resource_type = M2MResourceInstance::INTEGER; + + m2mbase_stub::mode_value = M2MBase::Dynamic; + + CHECK(resource_instance->set_value(value2,(u_int32_t)sizeof(value2)) == true); + + m2mbase_stub::observation_level_value = M2MBase::OOI_Attribute; + + resource_instance->_resource_type = M2MResourceInstance::INTEGER; + + m2mbase_stub::mode_value = M2MBase::Dynamic; + + CHECK(resource_instance->set_value(value2,(u_int32_t)sizeof(value2)) == true); + + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; + delete resource_cb; +} + +void Test_M2MResourceInstance::test_clear_value() +{ + u_int8_t value[] = {"value"}; + resource_instance->_value = (u_int8_t*)malloc(sizeof(u_int8_t)); + + m2mbase_stub::observe = handler; + TestReportObserver obs; + m2mbase_stub::report = new M2MReportHandler(obs); + + CHECK(resource_instance->set_value(value,(u_int32_t)sizeof(value)) == true); + CHECK( resource_instance->_value_length == sizeof(value)); + CHECK( *resource_instance->_value == *value); + resource_instance->clear_value(); + + CHECK( resource_instance->_value_length == 0); + CHECK( resource_instance->_value == NULL); + + m2mbase_stub::bool_value = true; + m2mbase_stub::mode_value = M2MBase::Dynamic; + m2mbase_stub::observation_level_value = M2MBase::R_Attribute; + resource_instance->_resource_type = M2MResourceInstance::INTEGER; + resource_instance->clear_value(); + + CHECK( resource_instance->_value_length == 0); + CHECK( resource_instance->_value == NULL); + + delete m2mbase_stub::report; + m2mbase_stub::report = NULL; +} + +void Test_M2MResourceInstance::test_get_value() +{ + u_int8_t test_value[] = {"value3"}; + u_int32_t value_length((u_int32_t)sizeof(test_value)); + + resource_instance->_value = (u_int8_t *)malloc(value_length); + resource_instance->_value_length = value_length; + memcpy((u_int8_t *)resource_instance->_value, (u_int8_t *)test_value, value_length); + + uint8_t* buffer = (uint8_t*)malloc(5); + uint32_t val_size = 0; + resource_instance->get_value(buffer, val_size); + CHECK(val_size == value_length); + free(buffer); + + resource_instance->clear_value(); + CHECK(resource_instance->_value == NULL); + + +} + +void Test_M2MResourceInstance::test_value() +{ + CHECK(resource_instance->value() == NULL); +} + +void Test_M2MResourceInstance::test_value_length() +{ + CHECK(resource_instance->value_length() == 0); +} + +void Test_M2MResourceInstance::test_handle_get_request() +{ + uint8_t value[] = {"name"}; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_GET; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + m2mbase_stub::uint8_value = 200; + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + coap_header->token_ptr = (uint8_t*)malloc(sizeof(value)); + memcpy(coap_header->token_ptr, value, sizeof(value)); + + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->observe = 0; + + coap_header->content_format = sn_coap_content_format_e(110); + + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + MyTest test; + test.block_requested = false; + resource_instance->set_incoming_block_message_callback( + incoming_block_message_callback(&test, &MyTest::block_message_received)); + resource_instance->set_outgoing_block_message_callback( + outgoing_block_message_callback(&test,&MyTest::block_message_requested)); + m2mblockmessage_stub::is_block_message = true; + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + CHECK(test.block_requested == true); + m2mblockmessage_stub::is_block_message = false; + + // OMA OPAQUE + resource_instance->_resource_type = M2MResourceInstance::OPAQUE; + + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + // Not OMA TLV or JSON + m2mbase_stub::uint8_value = 110; + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + // OMA TLV + m2mbase_stub::uint8_value = 99; + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + // OMA JSON + m2mbase_stub::uint8_value = 100; + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 0; + m2mbase_stub::uint16_value = 0x1c1c; + m2mbase_stub::bool_value = true; + + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + // Not observable + m2mbase_stub::bool_value = false; + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::bool_value = true; + + coap_header->options_list_ptr->observe = 0; + + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + coap_header->options_list_ptr->observe = 1; + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + CHECK(resource_instance->handle_get_request(NULL,coap_header,handler) != NULL); + + CHECK(resource_instance->handle_get_request(NULL,NULL,handler) != NULL); + + if(coap_header->token_ptr) { + free(coap_header->token_ptr); + coap_header->token_ptr = NULL; + } + if(coap_header->options_list_ptr) { + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + } + + if(common_stub::coap_header){ + if(common_stub::coap_header->options_list_ptr) { + free(common_stub::coap_header->options_list_ptr); + common_stub::coap_header->options_list_ptr = NULL; + } + free(common_stub::coap_header); + common_stub::coap_header = NULL; + } + free(coap_header); + coap_header = NULL; + + m2mbase_stub::clear(); + common_stub::clear(); +} + +void Test_M2MResourceInstance::test_handle_put_request() +{ + uint8_t value[] = {"name"}; + bool execute_value_updated = false; + sn_coap_hdr_s *coap_header = (sn_coap_hdr_s *)malloc(sizeof(sn_coap_hdr_s)); + memset(coap_header, 0, sizeof(sn_coap_hdr_s)); + + coap_header->uri_path_ptr = value; + coap_header->uri_path_len = sizeof(value); + + coap_header->msg_code = COAP_MSG_CODE_REQUEST_PUT; + + common_stub::int_value = 0; + m2mbase_stub::string_value = "name"; + + m2mbase_stub::operation = M2MBase::PUT_ALLOWED; + m2mbase_stub::uint8_value = 200; + + common_stub::coap_header = (sn_coap_hdr_ *)malloc(sizeof(sn_coap_hdr_)); + memset(common_stub::coap_header,0,sizeof(sn_coap_hdr_)); + + coap_header->payload_ptr = (uint8_t*)malloc(1); + + coap_header->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s)); + coap_header->options_list_ptr->uri_query_ptr = value; + coap_header->options_list_ptr->uri_query_len = sizeof(value); + + coap_header->content_format = sn_coap_content_format_e(99); + m2mtlvdeserializer_stub::bool_value = true; + + m2mbase_stub::bool_value = false; + + sn_coap_hdr_s *coap_response = NULL; + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + free(coap_header->options_list_ptr); + coap_header->options_list_ptr = NULL; + + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK( coap_response != NULL); + + m2mtlvdeserializer_stub::bool_value = false; + + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + coap_header->content_format = sn_coap_content_format_e(100); + + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + m2mbase_stub::bool_value = true; + + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + coap_response = resource_instance->handle_put_request(NULL,NULL,handler,execute_value_updated); + + CHECK( coap_response != NULL); + + MyTest test; + test.block_received = false; + m2mbase_stub::operation = M2MBase::PUT_ALLOWED; + m2mblockmessage_stub::is_block_message = true; + m2mblockmessage_stub::is_last_block = false; + resource_instance->set_incoming_block_message_callback( + incoming_block_message_callback(&test, &MyTest::block_message_received)); + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK(test.block_received == true); + CHECK( coap_response != NULL); + + test.block_received = false; + m2mblockmessage_stub::is_block_message = true; + m2mblockmessage_stub::is_last_block = true; + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK(test.block_received == true); + CHECK( coap_response != NULL); + + test.block_received = false; + m2mblockmessage_stub::is_block_message = false; + m2mblockmessage_stub::is_last_block = false; + coap_response = resource_instance->handle_put_request(NULL,coap_header,handler,execute_value_updated); + CHECK(test.block_received == false); + CHECK( coap_response != NULL); + + free(coap_header->options_list_ptr); + free(coap_header->payload_ptr); + free(common_stub::coap_header); + free(coap_header); + + m2mtlvdeserializer_stub::clear(); + common_stub::clear(); + m2mbase_stub::clear(); +} + +void Test_M2MResourceInstance::test_set_resource_observer() +{ + ResourceCallback *resource_cb = new ResourceCallback(); + resource_instance->set_resource_observer(resource_cb); + CHECK(resource_instance->_resource_callback == resource_cb) + delete resource_cb; +} + + +void Test_M2MResourceInstance::test_get_object_name() +{ + m2mbase_stub::string_value = "name"; + CHECK(resource_instance->object_name() == "name"); +} + +void Test_M2MResourceInstance::test_get_object_instance_id() +{ + resource_instance->_object_instance_id = 100; + CHECK(resource_instance->object_instance_id() == 100); +} + +void Test_M2MResourceInstance::test_set_notification_sent_function() +{ + MyTest test; + resource_instance->set_notification_sent_callback( + notification_sent_callback(&test,&MyTest::notification_sent)); + resource_instance->set_notification_sent_callback(global_notification_sent_function); +} + +void Test_M2MResourceInstance::test_notification_sent() +{ + MyTest test; + void *args = NULL; + + resource_instance->set_notification_sent_callback( + notification_sent_callback(&test,&MyTest::notification_sent)); + resource_instance->notification_sent(); + + cb_visited = false; + resource_instance->set_notification_sent_callback(global_notification_sent_function); + resource_instance->notification_sent(); + CHECK(true == cb_visited); + + // Check delete + cb_visited = false; + resource_instance->set_notification_sent_callback(global_notification_sent_function); + resource_instance->notification_sent(); + CHECK(true == cb_visited); +} + +void Test_M2MResourceInstance::test_ctor() +{ + M2MResourceInstance* instance = new M2MResourceInstance(*m2mobjectinstance_stub::resource, ¶ms, + M2MResourceInstance::STRING, 0); + CHECK(instance != NULL); + delete instance; +} + +void Test_M2MResourceInstance::test_get_parent_resource() +{ + M2MResourceInstance* instance = new M2MResourceInstance(*m2mobjectinstance_stub::resource, ¶ms, + M2MResourceInstance::STRING, 0); + // Only for the code coverage + instance->get_parent_resource(); + delete instance; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mresourceinstance/test_m2mresourceinstance.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_RESOURCE_INSTANCE_H +#define TEST_M2M_RESOURCE_INSTANCE_H + +#include "m2mresourceinstance.h" + +class Handler; +class Callback; +class ResourceCallback; + +class Test_M2MResourceInstance +{ +public: + Test_M2MResourceInstance(); + + ~Test_M2MResourceInstance(); + + void test_static_resource_instance(); + + void test_base_type(); + + void test_resource_instance_type(); + + void test_handle_observation_attribute(); + + void test_set_execute_function(); + + void test_execute(); + + void test_set_value(); + + void test_clear_value(); + + void test_get_value(); + + void test_value(); + + void test_value_length(); + + void test_handle_get_request(); + + void test_handle_put_request(); + + void test_set_resource_observer(); + + void test_get_object_name(); + + void test_get_object_instance_id(); + + void test_set_notification_sent_function(); + + void test_notification_sent(); + + void test_ctor(); + + void test_get_parent_resource(); + + M2MResourceInstance* resource_instance; + + M2MObject* obj; + Callback *callback; + + Handler* handler; +}; + +#endif // TEST_M2M_RESOURCE_INSTANCE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2msecurity/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,28 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2msecurity + "main.cpp" + "m2msecuritytest.cpp" + "test_m2msecurity.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../../../../source/m2msecurity.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2msecurity + CppUTest + CppUTestExt +) +set_target_properties(m2msecurity +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") + +set(binary "m2msecurity") +add_test(m2msecurity ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2msecurity/m2msecuritytest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2msecurity.h" + +TEST_GROUP(M2MSecurity) +{ + Test_M2MSecurity* m2m_security; + + void setup() + { + m2m_security = new Test_M2MSecurity(); + } + void teardown() + { + delete m2m_security; + } +}; + +TEST(M2MSecurity, Create) +{ + CHECK(m2m_security != NULL); +} + +TEST(M2MSecurity, create_resource_int) +{ + m2m_security->test_create_resource_int(); +} + +TEST(M2MSecurity, delete_resource) +{ + m2m_security->test_delete_resource(); +} + +TEST(M2MSecurity, set_resource_value_int) +{ + m2m_security->test_set_resource_value_int(); +} + +TEST(M2MSecurity, set_resource_value_string) +{ + m2m_security->test_set_resource_value_string(); +} + +TEST(M2MSecurity, set_resource_value_buffer) +{ + m2m_security->test_set_resource_value_buffer(); +} + +TEST(M2MSecurity, resource_value_int) +{ + m2m_security->test_resource_value_int(); +} + +TEST(M2MSecurity, resource_value_string) +{ + m2m_security->test_resource_value_string(); +} + +TEST(M2MSecurity, resource_value_buffer) +{ + m2m_security->test_resource_value_buffer(); +} + +TEST(M2MSecurity, is_resource_present) +{ + m2m_security->test_is_resource_present(); +} + +TEST(M2MSecurity, total_resource_count) +{ + m2m_security->test_total_resource_count(); +} + +TEST(M2MSecurity, m2m_server_constructor) +{ + m2m_security->test_m2m_server_constructor(); +} + +TEST(M2MSecurity, server_type) +{ + m2m_security->test_server_type(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2msecurity/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MSecurity);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2msecurity/test_m2msecurity.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2msecurity.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mbase_stub.h" +#include "nsdlaccesshelper_stub.h" + +Test_M2MSecurity::Test_M2MSecurity() +{ + M2MObject* obj = new M2MObject("name", "name"); + m2mobject_stub::inst = new M2MObjectInstance(*obj,"name","type", "name"); + m2mresource_stub::bool_value = true; + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + security = new M2MSecurity(M2MSecurity::Bootstrap); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; + + delete obj; +} + +Test_M2MSecurity::~Test_M2MSecurity() +{ + delete m2mobject_stub::inst; + m2mobject_stub::inst = NULL; + m2mobject_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mresource_stub::clear(); + m2mbase_stub::clear(); + delete security; +} + +void Test_M2MSecurity::test_create_resource_int() +{ + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->create_resource(M2MSecurity::M2MServerUri,10) == NULL); + CHECK(security->create_resource(M2MSecurity::BootstrapServer,10) == NULL); + CHECK(security->create_resource(M2MSecurity::SecurityMode,10) == NULL); + CHECK(security->create_resource(M2MSecurity::PublicKey,10) == NULL); + CHECK(security->create_resource(M2MSecurity::ServerPublicKey,10) == NULL); + CHECK(security->create_resource(M2MSecurity::Secretkey,10) == NULL); + CHECK(security->create_resource(M2MSecurity::SMSBindingKey,10) == NULL); + CHECK(security->create_resource(M2MSecurity::SMSBindingSecretKey,10) == NULL); + + CHECK(security->create_resource(M2MSecurity::M2MServerSMSNumber,10) != NULL); + CHECK(security->create_resource(M2MSecurity::ShortServerID,10) != NULL); + CHECK(security->create_resource(M2MSecurity::ClientHoldOffTime,10) != NULL); + CHECK(security->create_resource(M2MSecurity::SMSSecurityMode,10) != NULL); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + +void Test_M2MSecurity::test_delete_resource() +{ + m2mresourceinstance_stub::bool_value = true; + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->delete_resource(M2MSecurity::SMSBindingSecretKey) == false); + CHECK(security->delete_resource(M2MSecurity::SMSBindingKey) == false); + CHECK(security->delete_resource(M2MSecurity::M2MServerUri) == false); + CHECK(security->delete_resource(M2MSecurity::Secretkey) == false); + CHECK(security->delete_resource(M2MSecurity::ServerPublicKey) == false); + CHECK(security->delete_resource(M2MSecurity::BootstrapServer) == false); + CHECK(security->delete_resource(M2MSecurity::PublicKey) == false); + CHECK(security->delete_resource(M2MSecurity::SecurityMode) == false); + + m2mobjectinstance_stub::bool_value = true; + + CHECK(security->delete_resource(M2MSecurity::M2MServerSMSNumber) == true); + CHECK(security->delete_resource(M2MSecurity::ShortServerID) == true); + CHECK(security->delete_resource(M2MSecurity::ClientHoldOffTime) == true); + CHECK(security->delete_resource(M2MSecurity::SMSSecurityMode) == true); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MSecurity::test_set_resource_value_string() +{ + m2mresourceinstance_stub::bool_value = true; + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->set_resource_value(M2MSecurity::M2MServerUri,"test") == true); + + CHECK(security->set_resource_value(M2MSecurity::M2MServerSMSNumber,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::ShortServerID,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::SMSBindingKey,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::SMSBindingSecretKey,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::ClientHoldOffTime,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::SMSSecurityMode,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::Secretkey,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::ServerPublicKey,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::PublicKey,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::BootstrapServer,"test") == false); + CHECK(security->set_resource_value(M2MSecurity::SecurityMode,"test") == false); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MSecurity::test_set_resource_value_int() +{ + m2mresourceinstance_stub::bool_value = true; + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->set_resource_value(M2MSecurity::M2MServerUri,10) == false); + CHECK(security->set_resource_value(M2MSecurity::SMSBindingKey,10) == false); + CHECK(security->set_resource_value(M2MSecurity::SMSBindingSecretKey,10) == false); + CHECK(security->set_resource_value(M2MSecurity::Secretkey,10) == false); + CHECK(security->set_resource_value(M2MSecurity::ServerPublicKey,10) == false); + CHECK(security->set_resource_value(M2MSecurity::PublicKey,10) == false); + CHECK(security->set_resource_value(M2MSecurity::BootstrapServer,10) == false); + + CHECK(security->set_resource_value(M2MSecurity::SecurityMode,10) == true); + CHECK(security->set_resource_value(M2MSecurity::SMSSecurityMode,10) == true); + CHECK(security->set_resource_value(M2MSecurity::M2MServerSMSNumber,10) == true); + CHECK(security->set_resource_value(M2MSecurity::ShortServerID,10) == true); + CHECK(security->set_resource_value(M2MSecurity::ClientHoldOffTime,10) == true); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MSecurity::test_set_resource_value_buffer() +{ + m2mresourceinstance_stub::bool_value = true; + + uint8_t value[] = {"value"}; + uint16_t length = (uint16_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->set_resource_value(M2MSecurity::Secretkey,value,length) == true); + CHECK(security->set_resource_value(M2MSecurity::ServerPublicKey,value,length) == true); + CHECK(security->set_resource_value(M2MSecurity::PublicKey,value,length) == true); + + CHECK(security->set_resource_value(M2MSecurity::M2MServerUri,value,length) == false); + CHECK(security->set_resource_value(M2MSecurity::SMSBindingKey,value,length) == false); + CHECK(security->set_resource_value(M2MSecurity::SMSBindingSecretKey,value,length) == false); + CHECK(security->set_resource_value(M2MSecurity::BootstrapServer,value,length) == false); + + CHECK(security->set_resource_value(M2MSecurity::SecurityMode,value,length) == false); + CHECK(security->set_resource_value(M2MSecurity::SMSSecurityMode,value,length) == false); + CHECK(security->set_resource_value(M2MSecurity::M2MServerSMSNumber,value,length) == false); + CHECK(security->set_resource_value(M2MSecurity::ShortServerID,value,length) == false); + CHECK(security->set_resource_value(M2MSecurity::ClientHoldOffTime,value,length) == false); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MSecurity::test_resource_value_int() +{ + m2mresourceinstance_stub::bool_value = true; + + uint8_t value[] = {"10"}; + //m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + uint8_t size = 0; + m2mresourceinstance_stub::value = String::convert_integer_to_array(10,size); + /*memset(m2mresourceinstance_stub::value,0,(uint32_t)size); + memcpy(m2mresourceinstance_stub::value, 10, size);*/ + m2mresourceinstance_stub::int_value = (uint16_t)size; + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->resource_value_int(M2MSecurity::SecurityMode) == 10); + CHECK(security->resource_value_int(M2MSecurity::SMSSecurityMode) == 10); + CHECK(security->resource_value_int(M2MSecurity::M2MServerSMSNumber) == 10); + CHECK(security->resource_value_int(M2MSecurity::ShortServerID) == 10); + CHECK(security->resource_value_int(M2MSecurity::ClientHoldOffTime) == 10); + CHECK(security->resource_value_int(M2MSecurity::BootstrapServer) == 0); + CHECK(security->resource_value_int(M2MSecurity::PublicKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::ServerPublicKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::Secretkey) == 0); + CHECK(security->resource_value_int(M2MSecurity::SMSBindingSecretKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::SMSBindingKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::M2MServerUri) == 0); + + security->clear_resources(); + CHECK(security->resource_value_int(M2MSecurity::SecurityMode) == 0); + CHECK(security->resource_value_int(M2MSecurity::SMSSecurityMode) == 0); + CHECK(security->resource_value_int(M2MSecurity::M2MServerSMSNumber) == 0); + CHECK(security->resource_value_int(M2MSecurity::ShortServerID) == 0); + CHECK(security->resource_value_int(M2MSecurity::ClientHoldOffTime) == 0); + CHECK(security->resource_value_int(M2MSecurity::BootstrapServer) == 0); + CHECK(security->resource_value_int(M2MSecurity::PublicKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::ServerPublicKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::Secretkey) == 0); + CHECK(security->resource_value_int(M2MSecurity::SMSBindingSecretKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::SMSBindingKey) == 0); + CHECK(security->resource_value_int(M2MSecurity::M2MServerUri) == 0); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MSecurity::test_resource_value_string() +{ + m2mresourceinstance_stub::bool_value = true; + String test = "string"; + uint8_t value[] = {"string"}; + m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint16_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->resource_value_string(M2MSecurity::M2MServerUri) == test); + + CHECK(security->resource_value_string(M2MSecurity::SMSBindingKey) == ""); + CHECK(security->resource_value_string(M2MSecurity::SMSBindingSecretKey) == ""); + CHECK(security->resource_value_string(M2MSecurity::Secretkey) == ""); + CHECK(security->resource_value_string(M2MSecurity::ServerPublicKey) == ""); + CHECK(security->resource_value_string(M2MSecurity::PublicKey) == ""); + CHECK(security->resource_value_string(M2MSecurity::BootstrapServer) == ""); + CHECK(security->resource_value_string(M2MSecurity::ClientHoldOffTime) == ""); + CHECK(security->resource_value_string(M2MSecurity::ShortServerID) == ""); + CHECK(security->resource_value_string(M2MSecurity::M2MServerSMSNumber) == ""); + CHECK(security->resource_value_string(M2MSecurity::SMSSecurityMode) == ""); + CHECK(security->resource_value_string(M2MSecurity::SecurityMode) == ""); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MSecurity::test_resource_value_buffer() +{ + m2mresourceinstance_stub::bool_value = true; + + uint8_t value[] = {"buffer"}; + uint8_t *out_value = NULL; + + m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint16_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->resource_value_buffer(M2MSecurity::Secretkey,out_value) != 0); + CHECK(security->resource_value_buffer(M2MSecurity::ServerPublicKey,out_value) != 0); + CHECK(security->resource_value_buffer(M2MSecurity::PublicKey,out_value) != 0); + + CHECK(security->resource_value_buffer(M2MSecurity::M2MServerUri,out_value) == 0); + + CHECK(security->resource_value_buffer(M2MSecurity::SMSBindingKey,out_value) == 0); + CHECK(security->resource_value_buffer(M2MSecurity::SMSBindingSecretKey,out_value) == 0); + CHECK(security->resource_value_buffer(M2MSecurity::BootstrapServer,out_value) == 0); + CHECK(security->resource_value_buffer(M2MSecurity::ClientHoldOffTime,out_value) == 0); + CHECK(security->resource_value_buffer(M2MSecurity::ShortServerID,out_value) == 0); + CHECK(security->resource_value_buffer(M2MSecurity::M2MServerSMSNumber,out_value) == 0); + CHECK(security->resource_value_buffer(M2MSecurity::SMSSecurityMode,out_value) == 0); + CHECK(security->resource_value_buffer(M2MSecurity::SecurityMode,out_value) == 0); + + const uint8_t *outvalue = NULL; + CHECK(security->resource_value_buffer(M2MSecurity::Secretkey,outvalue) != 0); + CHECK(security->resource_value_buffer(M2MSecurity::ServerPublicKey,outvalue) != 0); + CHECK(security->resource_value_buffer(M2MSecurity::PublicKey,outvalue) != 0); + + free(out_value); + out_value = NULL; + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MSecurity::test_is_resource_present() +{ + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(security->is_resource_present(M2MSecurity::M2MServerUri) == true); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + CHECK(security->is_resource_present(M2MSecurity::ClientHoldOffTime) == false); +} + +void Test_M2MSecurity::test_total_resource_count() +{ + M2MResource *res = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::resource_list.push_back(res); + M2MResource *res2 = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::resource_list.push_back(res2); + + CHECK(security->total_resource_count() == 2); + + m2mobjectinstance_stub::resource_list.clear(); + + delete res2; + delete res; +} + +void Test_M2MSecurity::test_m2m_server_constructor() +{ + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + M2MSecurity* sec = new M2MSecurity(M2MSecurity::M2MServer); + CHECK(M2MSecurity::M2MServer == sec->server_type()); + + delete sec; + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + +void Test_M2MSecurity::test_server_type() +{ + CHECK(M2MSecurity::Bootstrap ==security->server_type()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2msecurity/test_m2msecurity.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_SECURITY_H +#define TEST_M2M_SECURITY_H + +#include "m2msecurity.h" + +class Callback; + +class Test_M2MSecurity +{ +public: + Test_M2MSecurity(); + virtual ~Test_M2MSecurity(); + + void test_create_resource_int(); + + void test_create_resource_string(); + + void test_delete_resource(); + + void test_set_resource_value_int(); + + void test_set_resource_value_string(); + + void test_set_resource_value_buffer(); + + void test_resource_value_int(); + + void test_resource_value_string(); + + void test_resource_value_buffer(); + + void test_is_resource_present(); + + void test_total_resource_count(); + + void test_m2m_server_constructor(); + + void test_server_type(); + + M2MSecurity* security; +}; + +#endif // TEST_M2M_SECURITY_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mserver/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,28 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mserver + "main.cpp" + "m2mservertest.cpp" + "test_m2mserver.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "../../../../source/m2mserver.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) + +target_link_libraries(m2mserver + CppUTest + CppUTestExt +) +set_target_properties(m2mserver +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mserver") +add_test(m2mserver ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mserver/m2mservertest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mserver.h" + +TEST_GROUP(M2MServer) +{ + Test_M2MServer* m2m_server; + + void setup() + { + m2m_server = new Test_M2MServer(); + } + void teardown() + { + delete m2m_server; + } +}; + +TEST(M2MServer, Create) +{ + CHECK(m2m_server->server != NULL); +} + +TEST(M2MServer, create_resource_int) +{ + m2m_server->test_create_resource_int(); +} + +TEST(M2MServer, create_resource) +{ + m2m_server->test_create_resource(); +} + +TEST(M2MServer, delete_resource) +{ + m2m_server->test_delete_resource(); +} + +TEST(M2MServer, set_resource_value_int) +{ + m2m_server->test_set_resource_value_int(); +} + +TEST(M2MServer, set_resource_value_string) +{ + m2m_server->test_set_resource_value_string(); +} + +TEST(M2MServer, resource_value_int) +{ + m2m_server->test_resource_value_int(); +} + +TEST(M2MServer, resource_value_string) +{ + m2m_server->test_resource_value_string(); +} + +TEST(M2MServer, is_resource_present) +{ + m2m_server->test_is_resource_present(); +} + +TEST(M2MServer, total_resource_count) +{ + m2m_server->test_total_resource_count(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mserver/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MServer);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mserver/test_m2mserver.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mserver.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mbase_stub.h" +#include "nsdlaccesshelper_stub.h" + +Test_M2MServer::Test_M2MServer() +{ + M2MObject* obj = new M2MObject("name", "name"); + m2mobject_stub::inst = new M2MObjectInstance(*obj,"name", "type", "name"); + m2mresource_stub::bool_value = true; + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + server = new M2MServer(); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; + delete obj; +} + +Test_M2MServer::~Test_M2MServer() +{ + delete m2mobject_stub::inst; + m2mobject_stub::inst = NULL; + + m2mobject_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mresource_stub::clear(); + m2mbase_stub::clear(); + delete server; +} + +void Test_M2MServer::test_create_resource_int() +{ + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(server->create_resource(M2MServer::DefaultMinPeriod,10) != NULL); + CHECK(server->create_resource(M2MServer::DefaultMaxPeriod,10) != NULL); + CHECK(server->create_resource(M2MServer::DisableTimeout,10) != NULL); + + CHECK(server->create_resource(M2MServer::ShortServerID,10) == NULL); + CHECK(server->create_resource(M2MServer::Lifetime,10) == NULL); + CHECK(server->create_resource(M2MServer::Disable,10) == NULL); + CHECK(server->create_resource(M2MServer::Binding,10) == NULL); + CHECK(server->create_resource(M2MServer::NotificationStorage,10) == NULL); + CHECK(server->create_resource(M2MServer::Binding,10) == NULL); + CHECK(server->create_resource(M2MServer::RegistrationUpdate,10) == NULL); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + +void Test_M2MServer::test_create_resource() +{ + m2mobjectinstance_stub::create_resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(server->create_resource(M2MServer::Disable) != NULL); + + CHECK(server->create_resource(M2MServer::DefaultMinPeriod) == NULL); + CHECK(server->create_resource(M2MServer::DefaultMaxPeriod) == NULL); + CHECK(server->create_resource(M2MServer::DefaultMaxPeriod) == NULL); + CHECK(server->create_resource(M2MServer::ShortServerID) == NULL); + CHECK(server->create_resource(M2MServer::Lifetime) == NULL); + CHECK(server->create_resource(M2MServer::DisableTimeout) == NULL); + CHECK(server->create_resource(M2MServer::Binding) == NULL); + CHECK(server->create_resource(M2MServer::NotificationStorage) == NULL); + CHECK(server->create_resource(M2MServer::RegistrationUpdate) == NULL); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; +} + +void Test_M2MServer::test_delete_resource() +{ + m2mobjectinstance_stub::bool_value = true; + + CHECK(server->delete_resource(M2MServer::ShortServerID) == false); + CHECK(server->delete_resource(M2MServer::Binding) == false); + CHECK(server->delete_resource(M2MServer::NotificationStorage) == false); + CHECK(server->delete_resource(M2MServer::Lifetime) == false); + CHECK(server->delete_resource(M2MServer::RegistrationUpdate) == false); + + CHECK(server->delete_resource(M2MServer::DefaultMinPeriod) == true); + CHECK(server->delete_resource(M2MServer::DefaultMaxPeriod) == true); + CHECK(server->delete_resource(M2MServer::DisableTimeout) == true); + CHECK(server->delete_resource(M2MServer::Disable) == true); +} + +void Test_M2MServer::test_set_resource_value_int() +{ + m2mbase_stub::bool_value = true; + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(server->set_resource_value(M2MServer::DefaultMinPeriod,10) == true); + CHECK(server->set_resource_value(M2MServer::DefaultMaxPeriod,10) == true); + CHECK(server->set_resource_value(M2MServer::DisableTimeout,10) == true); + CHECK(server->set_resource_value(M2MServer::ShortServerID,10) == true); + CHECK(server->set_resource_value(M2MServer::NotificationStorage,10) == true); + CHECK(server->set_resource_value(M2MServer::Lifetime,10) == true); + + CHECK(server->set_resource_value(M2MServer::Binding,10) == false); + CHECK(server->set_resource_value(M2MServer::RegistrationUpdate,10) == false); + CHECK(server->set_resource_value(M2MServer::Disable,10) == false); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MServer::test_set_resource_value_string() +{ + m2mresourceinstance_stub::bool_value = true; + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(server->set_resource_value(M2MServer::Binding,"test") == true); + + CHECK(server->set_resource_value(M2MServer::DefaultMinPeriod,"test") == false); + CHECK(server->set_resource_value(M2MServer::DefaultMaxPeriod,"test") == false); + CHECK(server->set_resource_value(M2MServer::DisableTimeout,"test") == false); + CHECK(server->set_resource_value(M2MServer::ShortServerID,"test") == false); + CHECK(server->set_resource_value(M2MServer::NotificationStorage,"test") == false); + CHECK(server->set_resource_value(M2MServer::Lifetime,"test") == false); + CHECK(server->set_resource_value(M2MServer::RegistrationUpdate,"test") == false); + CHECK(server->set_resource_value(M2MServer::Disable,"test") == false); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; +} + +void Test_M2MServer::test_resource_value_int() +{ + uint8_t value[] = {"10"}; + m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint32_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(server->resource_value_int(M2MServer::ShortServerID) == 10); + CHECK(server->resource_value_int(M2MServer::DefaultMinPeriod) == 10); + CHECK(server->resource_value_int(M2MServer::DefaultMaxPeriod) == 10); + CHECK(server->resource_value_int(M2MServer::DisableTimeout) == 10); + CHECK(server->resource_value_int(M2MServer::NotificationStorage) == 10); + CHECK(server->resource_value_int(M2MServer::Lifetime) == 10); + CHECK(server->resource_value_int(M2MServer::Binding) == 0); + CHECK(server->resource_value_int(M2MServer::RegistrationUpdate) == 0); + CHECK(server->resource_value_int(M2MServer::Disable) == 0); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MServer::test_resource_value_string() +{ + String test = "string"; + uint8_t value[] = {"string"}; + + m2mresourceinstance_stub::value = (uint8_t*)malloc((uint32_t)sizeof(value)); + memset(m2mresourceinstance_stub::value,0,(uint32_t)sizeof(value)); + memcpy(m2mresourceinstance_stub::value,value,sizeof(value)); + m2mresourceinstance_stub::int_value = (uint32_t)sizeof(value); + + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(server->resource_value_string(M2MServer::Binding) == test); + + CHECK(server->resource_value_string(M2MServer::Disable) == ""); + CHECK(server->resource_value_string(M2MServer::RegistrationUpdate) == ""); + CHECK(server->resource_value_string(M2MServer::Lifetime) == ""); + CHECK(server->resource_value_string(M2MServer::NotificationStorage) == ""); + CHECK(server->resource_value_string(M2MServer::DisableTimeout) == ""); + CHECK(server->resource_value_string(M2MServer::DefaultMaxPeriod) == ""); + CHECK(server->resource_value_string(M2MServer::DefaultMinPeriod) == ""); + CHECK(server->resource_value_string(M2MServer::ShortServerID) == ""); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; +} + +void Test_M2MServer::test_is_resource_present() +{ + m2mobjectinstance_stub::resource = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + CHECK(server->is_resource_present(M2MServer::ShortServerID) == true); + + delete m2mobjectinstance_stub::resource; + m2mobjectinstance_stub::resource = NULL; + + CHECK(server->is_resource_present(M2MServer::DefaultMinPeriod) == false); +} + +void Test_M2MServer::test_total_resource_count() +{ + M2MResource *res = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::resource_list.push_back(res); + M2MResource *res2 = new M2MResource(*m2mobject_stub::inst, + "name", + "type", + M2MResourceInstance::STRING, + false, + "name"); + + m2mobjectinstance_stub::resource_list.push_back(res2); + + CHECK(server->total_resource_count() == 2); + + m2mobjectinstance_stub::resource_list.clear(); + + delete res2; + delete res; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mserver/test_m2mserver.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_SERVER_H +#define TEST_M2M_SERVER_H + +#include "m2mserver.h" + +class Callback; + +class Test_M2MServer +{ +public: + Test_M2MServer(); + virtual ~Test_M2MServer(); + + void test_create_resource(); + + void test_create_resource_int(); + + void test_delete_resource(); + + void test_set_resource_value_int(); + + void test_set_resource_value_string(); + + void test_resource_value_int(); + + void test_resource_value_string(); + + void test_is_resource_present(); + + void test_total_resource_count(); + + M2MServer* server; +}; + +#endif // TEST_M2M_SERVER_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstring/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,21 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mstring + "main.cpp" + "test_m2mstring.cpp" + "m2mstringtest.cpp" + "../../../../source/m2mstring.cpp" +) + +target_link_libraries(m2mstring + CppUTest + CppUTestExt +) +set_target_properties(m2mstring +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") + +set(binary "m2mstring") +add_test(m2mstring ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstring/m2mstringtest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mstring.h" + +TEST_GROUP(M2MString) +{ + Test_M2MString* m2m_string; + + void setup() + { + m2m_string = new Test_M2MString(); + } + void teardown() + { + delete m2m_string; + } +}; + +TEST(M2MString, Create) +{ + CHECK(m2m_string != NULL); +} + +TEST(M2MString, string_and_len_constructor) +{ + m2m_string->test_string_and_len_constructor(); +} + +TEST(M2MString, copy_constructor) +{ + m2m_string->test_copy_constructor(); +} + +TEST(M2MString, test_operator_assign) +{ + m2m_string->test_operator_assign(); +} + +TEST(M2MString, test_operator_add) +{ + m2m_string->test_operator_add(); +} + +TEST(M2MString, test_push_back) +{ + m2m_string->test_push_back(); +} + +TEST(M2MString, test_operator_equals) +{ + m2m_string->test_operator_equals(); +} + +TEST(M2MString, test_clear) +{ + m2m_string->test_clear(); +} + +TEST(M2MString, test_size) +{ + m2m_string->test_size(); +} + +TEST(M2MString, test_length) +{ + m2m_string->test_length(); +} + +TEST(M2MString, test_capacity) +{ + m2m_string->test_capacity(); +} + +TEST(M2MString, test_empty) +{ + m2m_string->test_empty(); +} + +TEST(M2MString, test_c_str) +{ + m2m_string->test_c_str(); +} + +TEST(M2MString, test_reserve) +{ + m2m_string->test_reserve(); +} + +TEST(M2MString, test_resize) +{ + m2m_string->test_resize(); +} + +TEST(M2MString, test_swap) +{ + m2m_string->test_swap(); +} + +TEST(M2MString, test_substr) +{ + m2m_string->test_substr(); +} + +TEST(M2MString, test_operator_get) +{ + m2m_string->test_operator_get(); +} + +TEST(M2MString, test_at) +{ + m2m_string->test_at(); +} + +TEST(M2MString, test_erase) +{ + m2m_string->test_erase(); +} + +TEST(M2MString, test_append) +{ + m2m_string->test_append(); +} + +TEST(M2MString, test_append_raw) +{ + m2m_string->test_append_raw(); +} + +TEST(M2MString, test_append_int) +{ + m2m_string->test_append_int(); +} + +TEST(M2MString, test_compare) +{ + m2m_string->test_compare(); +} + +TEST(M2MString, test_find_last_of) +{ + m2m_string->test_find_last_of(); +} + +TEST(M2MString, test_operator_lt) +{ + m2m_string->test_operator_lt(); +} + +TEST(M2MString, test_reverse) +{ + m2m_string->test_reverse(); +} + +TEST(M2MString, test_itoa_c) +{ + m2m_string->test_itoa_c(); +} + +TEST(M2MString, test_convert_integer_to_array) +{ + m2m_string->test_convert_integer_to_array(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstring/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" + +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MString);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstring/test_m2mstring.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,421 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mstring.h" +#include <stdio.h> +#include <string.h> + +Test_M2MString::Test_M2MString() +{ + str = new String("test"); +} + +Test_M2MString::~Test_M2MString() +{ + delete str; +} + +void Test_M2MString::test_string_and_len_constructor() +{ + // make sure the len parameter works as expected + String s("hello_world", 5); + CHECK(s == "hello"); + CHECK(s.size() == 5); +} + +void Test_M2MString::test_copy_constructor() +{ + String s("name"); + String s1(s); + CHECK(s1.p[1] == 'a'); + CHECK(s.size() == s1.size()); +} + +void Test_M2MString::test_operator_assign() +{ + String s("name"); + String s1 = s; + const String s2("yes"); + CHECK(s1.p[1] == 'a'); + + s1 = "yeb"; + CHECK(s1.p[1] == 'e'); + s = s2; + CHECK(s.p[1] == 'e'); +} + +void Test_M2MString::test_operator_add() +{ + String s("name"); + String s1("yeb"); + + s += 'r'; + CHECK(s.p[4] == 'r'); + + s += s1; + CHECK(s.p[5] == 'y'); + + s += "hoi"; + CHECK(s.p[9] == 'o'); + + s1 += "somethingverylongggggggg"; + +} + +void Test_M2MString::test_push_back() +{ + String s("name"); + + s.push_back('r'); + CHECK(s.p[4] == 'r'); +} + +void Test_M2MString::test_operator_equals() +{ + String s("name"); + String s1("yeb"); + + CHECK( (s == s1) == false); + CHECK( (s == "name") == true); + const char c = NULL; + CHECK( (s == c) == false); + free(s.p); + s.p = NULL; + CHECK( (s == c) == true); +} + +void Test_M2MString::test_clear() +{ + String s("name"); + + s.clear(); + CHECK(s.size_ == 0); +} + +void Test_M2MString::test_size() +{ + String s("name"); + String s1("yeb"); + + CHECK(s.size() == 4); +} + +void Test_M2MString::test_length() +{ + String s("name"); + String s1("yeb"); + + CHECK(s.length() == 4); +} + +void Test_M2MString::test_capacity() +{ + String s("name"); + String s1("yeb"); + + CHECK(s.capacity() == 4); +} + +void Test_M2MString::test_empty() +{ + String s("name"); + String s1("yeb"); + + CHECK(s.empty() == false); +} + +void Test_M2MString::test_c_str() +{ + String s("name"); + String s1("yeb"); + + CHECK( s.c_str() != NULL); +} + +void Test_M2MString::test_reserve() +{ + String s("name"); + String s1("yeb"); + + s.reserve(12); + CHECK(s.allocated_ == 13); +} + +void Test_M2MString::test_resize() +{ + String s("name"); + String s1("yeb"); + + s.resize(2); + CHECK( s.size() == 2); + + s.resize(12); + CHECK( s.size() == 12); +} + +void Test_M2MString::test_swap() +{ + String s("name"); + String s1("yeb"); + + s.swap(s1); + CHECK(s1.p[1] == 'a'); + + CHECK(s.p[1] == 'e'); +} + +void Test_M2MString::test_substr() +{ + String s("name"); + String s1("yeb"); + + CHECK(s.substr(1, 1) == "a"); + CHECK(s.substr(3, 4) == "e"); +} + +void Test_M2MString::test_operator_get() +{ + String s("name"); + const String s1("yeb"); + + CHECK(s[1] == 'a'); + CHECK(s1[1] == 'e'); +} + +void Test_M2MString::test_at() +{ + String s("name"); + const String s1("yeb"); + + CHECK(s.at(1) == 'a'); + CHECK(s.at(14) == '\0'); + CHECK(s1.at(1) == 'e'); + CHECK(s1.at(31) == '\0'); +} + +void Test_M2MString::test_erase() +{ + String s("name"); + String s1("yeb"); + + s.erase(1,1); + CHECK(s[1] == 'm'); +} + +void Test_M2MString::test_append() +{ + String s("name"); + String s1("yeb"); + + s.append( s1.c_str(), 1 ); + CHECK(s.size() == 5); + + s.append( s1.c_str(), 15 ); + CHECK(s.size() == 8); +} + +void Test_M2MString::test_append_raw() +{ + String s("name"); + const char test_source[] = "something"; + String expected("namesomething"); + + s.append_raw(test_source, 1); + CHECK(s.size() == 5); + + s.append_raw(test_source + 1, 8); + CHECK(s.size() == 13); + + CHECK(s == expected); +} + +void Test_M2MString::test_append_int() +{ + String s("source"); + String expected("source1234"); + String expected2("source12342147483647"); + + s.append_int(1234); + CHECK(s.size() == 10); + + CHECK(s == expected); + + s.append_int(INT32_MAX); + + CHECK(s == expected2); +} + +void Test_M2MString::test_compare() +{ + String s("name"); + String s1("yeb"); + String s2("name"); + String s3("nam"); + + CHECK(s.compare(1,5, s1) < 0); + CHECK(s1.compare(0,5, s2) > 0); + CHECK(s.compare(0,4, s2) == 0); + CHECK(s.compare(0,4, s3) > 0); + + CHECK(s.compare(1,5, "yeb") < 0); + CHECK(s1.compare(0,5, "name") > 0); + CHECK(s.compare(0,4, "name") == 0); + CHECK(s.compare(0,4, "nam") > 0); +} + +void Test_M2MString::test_find_last_of() +{ + String s("namenamename"); + String s1("yeb"); + + CHECK(s.find_last_of('n') == 8); +} + +void Test_M2MString::test_operator_lt() +{ + String s("name"); + String s1("yeb"); + String s2("yea"); + + CHECK( (s < s1 ) == true); + CHECK( (s1 < s2 ) == false); +} +void Test_M2MString::test_reverse() +{ + char string1[] = "123"; + char string2[] = "321"; + m2m::reverse(string1, strlen(string1)); + char string3[] = "9223372036854775807"; + char string4[] = "7085774586302733229"; + m2m::reverse(string3, strlen(string3)); + + CHECK(strcmp(string1, string2) == 0); + CHECK(strcmp(string3, string4) == 0); +} +void Test_M2MString::test_itoa_c() +{ + int64_t value1 = 0; + char* string1 = "0"; + int64_t value2 = -10; + char* string2 = "-10"; + int64_t value3 = 10000; + char* string3 = "10000"; + int64_t value4 = 9223372036854775807; + char* string4 = "9223372036854775807"; + int64_t value5 = -9223372036854775807; + char* string5 = "-9223372036854775807"; + + char *buffer = (char*)malloc(21); + + if(buffer) { + m2m::itoa_c(value1, buffer); + CHECK(strcmp(string1, buffer) == 0); + m2m::itoa_c(value2, buffer); + CHECK(strcmp(string2, buffer) == 0); + m2m::itoa_c(value3, buffer); + CHECK(strcmp(string3, buffer) == 0); + m2m::itoa_c(value4, buffer); + CHECK(strcmp(string4, buffer) == 0); + m2m::itoa_c(value5, buffer); + CHECK(strcmp(string5, buffer) == 0); + free(buffer); + } +} + +void Test_M2MString::test_convert_integer_to_array() +{ + uint8_t *max_age_ptr = NULL; + uint8_t max_age_len = 0; + uint8_t *temp = NULL; + uint8_t temp_len = 0; + + int64_t val = 0; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + temp = m2m::String::convert_integer_to_array(0,temp_len, max_age_ptr, max_age_len); + CHECK(temp != NULL); + CHECK(val == m2m::String::convert_array_to_integer(temp, temp_len)); + free(temp); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + temp = m2m::String::convert_integer_to_array(0,temp_len, max_age_ptr, max_age_len); + CHECK(temp != NULL); + CHECK(val == m2m::String::convert_array_to_integer(temp, temp_len)); + free(temp); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xffff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xffffff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xffffffff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xffffffffff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xffffffffffff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xffffffffffffff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + free(max_age_ptr); + max_age_ptr = NULL; + + val = 0xffff; + max_age_ptr = m2m::String::convert_integer_to_array(val,max_age_len); + CHECK(max_age_ptr != NULL); + CHECK(val == m2m::String::convert_array_to_integer(max_age_ptr, max_age_len)); + free(max_age_ptr); + max_age_ptr = NULL; + + + +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstring/test_m2mstring.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_STRING_H +#define TEST_M2M_STRING_H + +#include "m2mstring.h" + +using namespace m2m; + +class Test_M2MString +{ +public: + Test_M2MString(); + virtual ~Test_M2MString(); + + void test_string_and_len_constructor(); + void test_copy_constructor(); + void test_operator_assign(); + void test_operator_add(); + void test_push_back(); + void test_operator_equals(); + void test_clear(); + void test_size(); + void test_length(); + void test_capacity(); + void test_empty(); + void test_c_str(); + void test_reserve(); + void test_resize(); + void test_swap(); + void test_substr(); + void test_operator_get(); + void test_at(); + void test_erase(); + void test_append(); + void test_append_raw(); + void test_append_int(); + void test_compare(); + void test_find_last_of(); + void test_operator_lt(); + void test_reverse(); + void test_itoa_c(); + void test_convert_integer_to_array(); + + String* str; +}; + +#endif // TEST_M2M_STRING_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstringbufferbase/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,21 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mstringbufferbase + "main.cpp" + "m2mstringbufferbasetest.cpp" + "test_m2mstringbufferbase.cpp" + "../stub/m2mstring_stub.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) +target_link_libraries(m2mstringbufferbase + CppUTest + CppUTestExt +) +set_target_properties(m2mstringbufferbase +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") +set(binary "m2mstringbufferbase") +add_test(m2mstringbufferbase ${binary}) + + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstringbufferbase/m2mstringbufferbasetest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mstringbufferbase.h" + +TEST_GROUP(M2Mstringbufferbase) +{ + Test_M2Mstringbufferbase* stringbufferbase; + + void setup() + { + stringbufferbase = new Test_M2Mstringbufferbase(); + } + void teardown() + { + delete stringbufferbase; + } +}; + +TEST(M2Mstringbufferbase, Create) +{ + CHECK(stringbufferbase != NULL); +} + +TEST(M2Mstringbufferbase, ensure_space) +{ + stringbufferbase->test_ensure_space(); +} + +TEST(M2Mstringbufferbase, append) +{ + stringbufferbase->test_append(); +} + +TEST(M2Mstringbufferbase, append_int) +{ + stringbufferbase->test_append_int(); +} + +TEST(M2Mstringbufferbase, find_last_of) +{ + stringbufferbase->test_find_last_of(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstringbufferbase/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2Mstringbufferbase);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstringbufferbase/test_m2mstringbufferbase.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mstringbufferbase.h" +//#include "m2mstringbuffer.h" + + + +Test_M2Mstringbufferbase::Test_M2Mstringbufferbase() +{ +} + +Test_M2Mstringbufferbase::~Test_M2Mstringbufferbase() +{ +} + +void Test_M2Mstringbufferbase::test_ensure_space() +{ + CHECK(ensure_space(1, 1)); + CHECK(!ensure_space(1, 2)); +} + +void Test_M2Mstringbufferbase::test_append() +{ + char data[2]; + + _curr_size = 0; + CHECK(append(data, 2, 'a')); + CHECK(!append(data, 2, 'a')); + + _curr_size = 0; + CHECK(append(data, 2, "a")); + CHECK(!append(data, 2, "a")); + + _curr_size = 0; + CHECK(!append(data, 2, "aa")); + + _curr_size = 0; + CHECK(append(data, 2, "aa", 1)); + + _curr_size = 0; + CHECK(!append(data, 2, "aa", 2)); + + +} + +void Test_M2Mstringbufferbase::test_append_int() +{ + char data[2]; + _curr_size = 0; + CHECK(append_int(data, 2, 1)); + CHECK(!append_int(data, 2, 2)); + _curr_size = 0; + CHECK(!append_int(data, 2, 666)); +} + +void Test_M2Mstringbufferbase::test_find_last_of() +{ + char data[2]; + _curr_size = 0; + CHECK(append(data, 2, 'a')); + CHECK(0 == find_last_of(data, 'a')); + CHECK(0 > find_last_of(data, 'b')); +} + +/* + bool ensure_space(size_t max_size, size_t required_size) const; + + bool append(char *buff, size_t max_size, char data); + + bool append(char *buff, size_t max_size, const char *data); + + bool append(char *buff, size_t max_size, const char *data, size_t data_len); + + bool append_int(char *buff, size_t max_size, uint16_t data); + + int find_last_of(const char *buff, char search_char) const;*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mstringbufferbase/test_m2mstringbufferbase.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_STRIGBUFFERBASE_H +#define TEST_M2M_STRIGBUFFERBASE_H + +#include "m2mstringbufferbase.h" + +class Test_M2Mstringbufferbase : StringBufferBase +{ +public: + Test_M2Mstringbufferbase(); + + virtual ~Test_M2Mstringbufferbase(); + + void test_ensure_space(); + void test_append(); + void test_append_int(); + void test_find_last_of(); + +}; + + +#endif // TEST_M2M_STRIGBUFFERBASE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mtlvdeserializer/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(m2mtlv + "../../../../source/m2mtlvdeserializer.cpp" + "../../../../source/m2mtlvserializer.cpp" + "main.cpp" + "m2mtlvdeserializertest.cpp" + "test_m2mtlvdeserializer.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mresource_stub.cpp" + "../stub/m2mresourceinstance_stub.cpp" + "../stub/m2mobjectinstance_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/nsdlaccesshelper_stub.cpp" + "test_m2mtlvserializer.cpp" + "../../../../source/m2mstringbufferbase.cpp" +) + +target_link_libraries(m2mtlv + CppUTest + CppUTestExt +) +set_target_properties(m2mtlv +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") + +set(binary "m2mtlv") +add_test(m2mtlv ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mtlvdeserializer/m2mtlvdeserializertest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_m2mtlvdeserializer.h" +#include "test_m2mtlvserializer.h" + +TEST_GROUP(M2MTLVDeserializer) +{ + Test_M2MTLVDeserializer* m2m_deserializer; + + void setup() + { + m2m_deserializer = new Test_M2MTLVDeserializer(); + } + void teardown() + { + delete m2m_deserializer; + } +}; + +TEST_GROUP(M2MTLVSerializer) +{ + Test_M2MTLVSerializer* m2m_serializer; + + void setup() + { + m2m_serializer = new Test_M2MTLVSerializer(); + } + void teardown() + { + delete m2m_serializer; + } +}; + +TEST(M2MTLVSerializer, Create) +{ + CHECK(m2m_serializer != NULL); +} + +TEST(M2MTLVSerializer, serialize_object) +{ + m2m_serializer->test_serialize_object(); +} + +TEST(M2MTLVSerializer, serialize_object_instance) +{ + m2m_serializer->test_serialize_object_instance(); +} + +TEST(M2MTLVSerializer, serialize_resource) +{ + m2m_serializer->test_serialize_resource(); +} + +TEST(M2MTLVSerializer, serialize_resource_instance) +{ + m2m_serializer->test_serialize_resource_instance(); +} + +TEST(M2MTLVDeserializer, Create) +{ + CHECK(m2m_deserializer != NULL); +} + +TEST(M2MTLVDeserializer, is_object_instance) +{ + m2m_deserializer->test_is_object_instance(); +} + +TEST(M2MTLVDeserializer, is_resource) +{ + m2m_deserializer->test_is_resource(); +} + +TEST(M2MTLVDeserializer, is_multiple_resource) +{ + m2m_deserializer->test_is_multiple_resource(); +} + +TEST(M2MTLVDeserializer, is_resource_instance) +{ + m2m_deserializer->test_is_resource_instance(); +} + +TEST(M2MTLVDeserializer, deserialise_object_instances) +{ + m2m_deserializer->test_deserialise_object_instances(); +} + +TEST(M2MTLVDeserializer, deserialize_resources) +{ + m2m_deserializer->test_deserialize_resources(); +} + +TEST(M2MTLVDeserializer, test_deserialize_resource_instance_1) +{ + m2m_deserializer->test_deserialize_resource_instance_1(); +} + +TEST(M2MTLVDeserializer, test_deserialize_resource_instance) +{ + m2m_deserializer->test_deserialize_resource_instance(); +} + +TEST(M2MTLVDeserializer, test_instance_id) +{ + m2m_deserializer->test_instance_id(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mtlvdeserializer/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( M2MTLVDeserializer); +IMPORT_TEST_GROUP( M2MTLVSerializer);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mtlvdeserializer/test_m2mtlvdeserializer.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,646 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mtlvdeserializer.h" +#include "m2mtlvserializer.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mbase_stub.h" + + +Test_M2MTLVDeserializer::Test_M2MTLVDeserializer() +{ + deserializer = new M2MTLVDeserializer(); +} + +Test_M2MTLVDeserializer::~Test_M2MTLVDeserializer() +{ + delete deserializer; + m2mbase_stub::clear(); + m2mresourceinstance_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); + m2mresource_stub::clear(); +} + +void Test_M2MTLVDeserializer::test_is_object_instance() +{ + uint8_t data_resource[] = {0xC3,0x0}; + uint8_t data_object[] = {0x08,0x0}; + + CHECK(deserializer->is_object_instance(data_resource) == false); + CHECK(deserializer->is_object_instance(data_object) == true); +} + +void Test_M2MTLVDeserializer::test_is_resource() +{ + uint8_t data_resource[] = {0xC3,0x0}; + uint8_t data_object[] = {0x08,0x0}; + + CHECK(deserializer->is_resource(data_resource) == true); + CHECK(deserializer->is_resource(data_object) == false); + +} + +void Test_M2MTLVDeserializer::test_is_multiple_resource() +{ + uint8_t data_resource[] = {0xC3,0x0}; + uint8_t data_object[] = {0x88,0x0}; + + CHECK(deserializer->is_multiple_resource(data_resource) == false); + CHECK(deserializer->is_multiple_resource(data_object) == true); +} + +void Test_M2MTLVDeserializer::test_is_resource_instance() +{ + uint8_t data_resource[] = {0xC3,0x0}; + uint8_t data_object[] = {0x44,0x0}; + + CHECK(deserializer->is_resource_instance(data_object) == true); + CHECK(deserializer->is_resource_instance(data_resource) == false); +} + +void Test_M2MTLVDeserializer::test_deserialise_object_instances() +{ + uint32_t size = 0; + uint8_t *data = 0; + + + M2MObject *object = new M2MObject("1", "1"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"1", "type", "1"); + + M2MObjectInstance* instance_1 = new M2MObjectInstance(*object,"2", "type", "2"); + + + m2mobject_stub::instance_list.push_back(instance); + + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + M2MResource* resource_1 = new M2MResource(*instance, + "2", + "type", + M2MResourceInstance::INTEGER, + false, + "2"); + + m2mobjectinstance_stub::resource_list.push_back(resource); + m2mobjectinstance_stub::resource_list.push_back(resource_1); + + m2mbase_stub::name_id_value = 0; + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + + M2MTLVSerializer *serializer = new M2MTLVSerializer(); + + data = serializer->serialize( m2mobject_stub::instance_list,size); + + CHECK(M2MTLVDeserializer::None == deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post)); + + size = 0; + + if(data) { + free(data); + data = 0; + } + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + + data = serializer->serialize( m2mobject_stub::instance_list,size); + + CHECK(M2MTLVDeserializer::NotAllowed == deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post)); + + size = 0; + + if(data) { + free(data); + data = 0; + } + + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + + u_int8_t value[] = {"value"}; + m2mresourceinstance_stub::value = value; + m2mresourceinstance_stub::int_value = sizeof(value); + + data = serializer->serialize( m2mobject_stub::instance_list,size); + + delete serializer; + + CHECK(M2MTLVDeserializer::None == deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post)); + CHECK(M2MTLVDeserializer::None == deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Put)); + + size = 0; + + if(data) { + free(data); + data = 0; + } + + m2mobject_stub::instance_list.push_back(instance_1); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + serializer = new M2MTLVSerializer(); + + data = serializer->serialize( m2mobject_stub::instance_list,size); + + delete serializer; + + CHECK(M2MTLVDeserializer::None != deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post)); + size = 0; + + if(data) { + free(data); + data = 0; + } + + CHECK(M2MTLVDeserializer::NotValid == deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post)); + + M2MResourceInstance* res_instance = new M2MResourceInstance(*resource, + "1", + "type", + M2MResourceInstance::INTEGER, + 0, + "1", + false); + + + M2MResourceInstance* res_instance_1 = new M2MResourceInstance(*resource, + "2", + "type", + M2MResourceInstance::INTEGER, + 0, + "1", + false); + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + m2mresource_stub::list.push_back(res_instance_1); + + m2mobject_stub::instance_list.pop_back(); + + serializer = new M2MTLVSerializer(); + data = serializer->serialize( m2mobject_stub::instance_list,size); + delete serializer; + + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + + m2mbase_stub::string_value = "name"; + m2mobjectinstance_stub::create_resource_instance = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post); + + deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Put); + + size = 0; + if(data) { + free(data); + data = 0; + } + + m2mbase_stub::name_id_value = 300; + + m2mresourceinstance_stub::int_value = 6; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + serializer = new M2MTLVSerializer(); + data = serializer->serialize( m2mobject_stub::instance_list,size); + delete serializer; + + deserializer->deserialise_object_instances(data,size,*object, M2MTLVDeserializer::Post); + deserializer->deserialise_object_instances(data,size,*object, M2MTLVDeserializer::Put); + size = 0; + + if(data) { + free(data); + data = 0; + } + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + m2mresourceinstance_stub::int_value = 256; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + serializer = new M2MTLVSerializer(); + data = serializer->serialize( m2mobject_stub::instance_list,size); + delete serializer; + + deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post); + deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Put); + size = 0; + + if(data) { + free(data); + data = 0; + } + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + m2mresourceinstance_stub::int_value = 65536; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + serializer = new M2MTLVSerializer(); + data = serializer->serialize( m2mobject_stub::instance_list,size); + delete serializer; + + deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Post); + deserializer->deserialise_object_instances(data,size,*object,M2MTLVDeserializer::Put); + size = 0; + + if(data) { + free(data); + data = 0; + } + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + delete m2mobjectinstance_stub::create_resource_instance; + m2mobjectinstance_stub::create_resource_instance = NULL; + + delete res_instance; + delete res_instance_1; + delete resource; + delete resource_1; + delete instance; + delete instance_1; + delete object; +} + +void Test_M2MTLVDeserializer::test_deserialize_resources() +{ + uint8_t data_resource[] = {0xC3,0x0,'A','R','M'}; + + M2MObject *object = new M2MObject("1","1"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"1","type", "1"); + + m2mobject_stub::instance_list.push_back(instance); + + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + + m2mobjectinstance_stub::resource_list.push_back(resource); + + CHECK(deserializer->is_resource(data_resource) == true); + + uint8_t invalid_data_resource[] = {0x65,0x0,'A','R','M'}; + + CHECK( M2MTLVDeserializer::NotValid == deserializer->deserialize_resources(invalid_data_resource, + sizeof(invalid_data_resource), + *instance,M2MTLVDeserializer::Post)); + + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + + m2mobjectinstance_stub::create_resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + CHECK( M2MTLVDeserializer::None == deserializer->deserialize_resources(data_resource,sizeof(data_resource),*instance,M2MTLVDeserializer::Post)); + + delete m2mobjectinstance_stub::create_resource; + m2mobjectinstance_stub::create_resource = NULL; + + CHECK( M2MTLVDeserializer::NotFound == deserializer->deserialize_resources(data_resource,sizeof(data_resource),*instance,M2MTLVDeserializer::Put)); + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + deserializer->deserialize_resources(data_resource,sizeof(data_resource),*instance,M2MTLVDeserializer::Post); + + + M2MResourceInstance* res_instance = new M2MResourceInstance(*resource, + "1", + "type", + M2MResourceInstance::INTEGER, + 0, + "1", + false); + + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + +// M2MResourceInstance* res_instance_1 = new M2MResourceInstance("2", +// *name, +// M2MResourceInstance::INTEGER, +// *instance); + +// m2mresource_stub::list.push_back(res_instance_1); + m2mbase_stub::string_value = "1"; + uint8_t data_multiple_resource[] = {0x86,0x6, 0x81,0x0, 0x01, 0x41, 0x01, 0x05}; + CHECK(deserializer->is_multiple_resource(data_multiple_resource) == true); + deserializer->deserialize_resources(data_multiple_resource,sizeof(data_multiple_resource),*instance,M2MTLVDeserializer::Post); + + M2MTLVSerializer *serializer = new M2MTLVSerializer(); + + m2mbase_stub::name_id_value = 1; + uint32_t size = 0; + uint8_t* data = serializer->serialize(resource,size); + + delete serializer; + + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + + deserializer->deserialize_resources(data,size,*instance,M2MTLVDeserializer::Post); + + free(data); + + delete res_instance; +// delete res_instance_1; + delete resource; + delete instance; + delete object; + + m2mresourceinstance_stub::clear(); + m2mresource_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); +} + +void Test_M2MTLVDeserializer::test_deserialize_resource_instance_1() +{ + uint8_t data_resource[] = {0xC3,0x0,'A','R','M'}; + + m2mbase_stub::name_id_value = 1; + + M2MObject *object = new M2MObject("1","1"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"1","type", "1"); + + m2mobject_stub::instance_list.push_back(instance); + + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + m2mobjectinstance_stub::resource_list.push_back(resource); + + CHECK(deserializer->is_resource(data_resource) == true); + + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + + deserializer->deserialize_resource_instances(data_resource,sizeof(data_resource), + *resource,M2MTLVDeserializer::Put); + + M2MResourceInstance* res_instance = new M2MResourceInstance(*resource, + "1", + "type", + M2MResourceInstance::INTEGER, + 0, + "1", + false); + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + + M2MResourceInstance* res_instance_1 = new M2MResourceInstance(*resource, + "2", + "type", + M2MResourceInstance::INTEGER, + 0, + "2", + false); + + m2mresource_stub::list.push_back(res_instance_1); + + M2MTLVSerializer *serializer = new M2MTLVSerializer(); + + uint32_t size = 0; + uint8_t* data = serializer->serialize( resource,size); + + delete serializer; + + deserializer->deserialize_resource_instances(data,size, + *resource,M2MTLVDeserializer::Put); + + + free(data); + + delete res_instance; + delete res_instance_1; + delete resource; + delete instance; + delete object; + + m2mresourceinstance_stub::clear(); + m2mresource_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); +} + + +void Test_M2MTLVDeserializer::test_deserialize_resource_instance() +{ + uint32_t size = 0; + uint8_t *data = 0; + + M2MObject *object = new M2MObject("1","1"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"1","type", "1"); + + M2MObjectInstance* instance_1 = new M2MObjectInstance(*object,"2","type", "1"); + + + m2mobject_stub::instance_list.push_back(instance); + m2mobject_stub::instance_list.push_back(instance_1); + + + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + M2MResource* resource_1 = new M2MResource(*instance, + "2", + "type", + M2MResourceInstance::INTEGER, + false, + "2"); + + m2mobjectinstance_stub::resource_list.push_back(resource); + m2mobjectinstance_stub::resource_list.push_back(resource_1); + + m2mbase_stub::name_id_value = 0; + + M2MTLVSerializer *serializer = new M2MTLVSerializer(); + + data = serializer->serialize( resource,size); + + delete serializer; + + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + + deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Post); + size = 0; + + if(data) { + free(data); + data = 0; + } + + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + + deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Post); + size = 0; + + if(data) { + free(data); + data = 0; + } + + M2MResourceInstance* res_instance = new M2MResourceInstance(*resource, + "1", + "type", + M2MResourceInstance::INTEGER, + 0, + "1", + false); + + M2MResourceInstance* res_instance_1 = new M2MResourceInstance(*resource, + "2", + "type", + M2MResourceInstance::INTEGER, + 0, + "2", + false); + + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + m2mresource_stub::list.push_back(res_instance_1); + serializer = new M2MTLVSerializer(); + data = serializer->serialize( resource,size); + delete serializer; + + deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Post); + + m2mbase_stub::operation = M2MBase::GET_PUT_POST_ALLOWED; + deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Post); + + m2mresource_stub::list.pop_back(); + m2mresource_stub::list.pop_back(); + + CHECK(M2MTLVDeserializer::NotAllowed ==deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Post)); + + CHECK(M2MTLVDeserializer::NotFound == deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Put)); + + size = 0; + if(data) { + free(data); + data = 0; + } + + serializer = new M2MTLVSerializer(); + data = serializer->serialize( resource,size); + delete serializer; + + deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Put); + size = 0; + if(data) { + free(data); + data = 0; + } + + m2mresource_stub::list.push_back(res_instance); + m2mresource_stub::list.push_back(res_instance_1); + + m2mbase_stub::name_id_value = 300; + + m2mresourceinstance_stub::int_value = 6; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + serializer = new M2MTLVSerializer(); + data = serializer->serialize( resource,size); + delete serializer; + + deserializer->deserialize_resource_instances(data,size,*resource, M2MTLVDeserializer::Post); + size = 0; + + if(data) { + free(data); + data = 0; + } + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + m2mresourceinstance_stub::int_value = 256; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + serializer = new M2MTLVSerializer(); + data = serializer->serialize( resource,size); + delete serializer; + + deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Post); + size = 0; + + if(data) { + free(data); + data = 0; + } + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + m2mresourceinstance_stub::int_value = 65536; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + serializer = new M2MTLVSerializer(); + data = serializer->serialize( resource,size); + delete serializer; + + deserializer->deserialize_resource_instances(data,size,*resource,M2MTLVDeserializer::Post); + size = 0; + + if(data) { + free(data); + data = 0; + } + + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + delete res_instance; + delete res_instance_1; + delete resource; + delete resource_1; + delete instance; + delete instance_1; + delete object; +} + +void Test_M2MTLVDeserializer::test_instance_id() +{ + uint8_t data_resource[] = {0xC3,0x1}; + uint8_t data_object[] = {0x08,0x2}; + + CHECK(deserializer->instance_id(data_resource) == 1); + CHECK(deserializer->instance_id(data_object) == 2); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mtlvdeserializer/test_m2mtlvdeserializer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_TLV_DESERIALIZER_H +#define TEST_M2M_TLV_DESERIALIZER_H + +#include "m2mtlvdeserializer.h" + +class Test_M2MTLVDeserializer +{ +public: + Test_M2MTLVDeserializer(); + + virtual ~Test_M2MTLVDeserializer(); + + void test_is_object_instance(); + + void test_is_resource(); + + void test_is_multiple_resource(); + + void test_is_resource_instance(); + + void test_deserialise_object_instances(); + + void test_deserialize_resources(); + + void test_deserialize_resource_instance_1(); + + void test_deserialize_resource_instance(); + + void test_instance_id(); + + M2MTLVDeserializer *deserializer; +}; + +#endif // TEST_M2M_TLV_DESERIALIZER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mtlvdeserializer/test_m2mtlvserializer.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_m2mtlvserializer.h" +#include "m2mobject_stub.h" +#include "m2mobjectinstance_stub.h" +#include "m2mresource_stub.h" +#include "m2mresourceinstance_stub.h" +#include "m2mbase_stub.h" + + +Test_M2MTLVSerializer::Test_M2MTLVSerializer() +{ + serializer = new M2MTLVSerializer(); +} + +Test_M2MTLVSerializer::~Test_M2MTLVSerializer() +{ + delete serializer; +} + +void Test_M2MTLVSerializer::test_serialize_object() +{ + uint32_t size = 0; + uint8_t *data = 0; + + M2MObject *object = new M2MObject("1", "1"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"1", "type", "1"); + + m2mobject_stub::instance_list.push_back(instance); + + + + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + + m2mobjectinstance_stub::resource_list.push_back(resource); + + m2mbase_stub::name_id_value = 0; + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = 0; + } + + M2MResourceInstance* res_instance = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "1", + "type", + M2MResourceInstance::STRING, + 0, + "1", + false); + + M2MResourceInstance* res_instance_1 = new M2MResourceInstance(*m2mobjectinstance_stub::resource, + "2", + "type", + M2MResourceInstance::STRING, + 0, + "2", + false); + + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + m2mresource_stub::list.push_back(res_instance_1); + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = 0; + } + + m2mbase_stub::name_id_value = 256; + + m2mresourceinstance_stub::int_value = 6; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = 0; + } + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + m2mresourceinstance_stub::int_value = 256; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = 0; + } + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + + m2mresourceinstance_stub::int_value = 65536; + m2mresourceinstance_stub::value = (uint8_t*) malloc(m2mresourceinstance_stub::int_value); + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = 0; + } + + m2mbase_stub::name_id_value = -1; + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data == NULL); + + delete res_instance_1; + delete res_instance; + delete resource; + delete instance; + delete object; + + free(m2mresourceinstance_stub::value); + + m2mresourceinstance_stub::clear(); + m2mresource_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); +} + +void Test_M2MTLVSerializer::test_serialize_object_instance() +{ + M2MObject *object = new M2MObject("1", "1"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"1","type", "1"); + + uint32_t size = 0; + uint8_t *data = 0; + m2mbase_stub::name_id_value = 0; + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::STRING, + false, + "1"); + + M2MResourceInstance* res_instance = new M2MResourceInstance(*resource, + "1", + "type", + M2MResourceInstance::STRING, + 0, + "1", + false); + + m2mobjectinstance_stub::resource_list.clear(); + m2mobjectinstance_stub::resource_list.push_back(resource); + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + + data = serializer->serialize( m2mobjectinstance_stub::resource_list,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = NULL; + } + + + m2mbase_stub::name_id_value = -1; + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data == NULL); + + delete res_instance; + delete resource; + delete instance; + delete object; + + m2mresource_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); +} + +void Test_M2MTLVSerializer::test_serialize_resource() +{ + M2MObject *object = new M2MObject("1","1"); + M2MObjectInstance* instance =new M2MObjectInstance(*object,"1","type", "1"); + + uint32_t size = 0; + uint8_t *data = 0; + m2mbase_stub::name_id_value = 0; + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + M2MResourceInstance* res_instance = new M2MResourceInstance(*resource, + "1", + "type", + M2MResourceInstance::INTEGER, + 0, + "1", + false); + + + m2mobjectinstance_stub::resource_list.clear(); + m2mobjectinstance_stub::resource_list.push_back(resource); + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + + data = serializer->serialize( resource,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = NULL; + } + + m2mbase_stub::name_id_value = -1; + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data == NULL); + + delete res_instance; + delete resource; + delete instance; + delete object; + + m2mresource_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); +} + +void Test_M2MTLVSerializer::test_serialize_resource_instance() +{ + M2MObject *object = new M2MObject("1","1"); + M2MObjectInstance* instance = new M2MObjectInstance(*object,"1","type", "1"); + + uint32_t size = 0; + uint8_t *data = 0; + m2mbase_stub::name_id_value = 0; + M2MResource* resource = new M2MResource(*instance, + "1", + "type", + M2MResourceInstance::INTEGER, + false, + "1"); + + M2MResourceInstance* res_instance = new M2MResourceInstance(*resource, + "1", + "type", + M2MResourceInstance::INTEGER, + 0, + "1", + false); + + + m2mobjectinstance_stub::resource_list.clear(); + m2mobjectinstance_stub::resource_list.push_back(resource); + + m2mresource_stub::bool_value = true; + m2mresource_stub::list.push_back(res_instance); + + m2mbase_stub::operation = M2MBase::GET_ALLOWED; + + data = serializer->serialize( m2mobjectinstance_stub::resource_list,size); + CHECK(data != NULL); + + if(data) { + free(data); + data = NULL; + } + + + m2mbase_stub::name_id_value = -1; + data = serializer->serialize( m2mobject_stub::instance_list,size); + CHECK(data == NULL); + + delete res_instance; + delete resource; + delete instance; + delete object; + + m2mresource_stub::clear(); + m2mobjectinstance_stub::clear(); + m2mobject_stub::clear(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/m2mtlvdeserializer/test_m2mtlvserializer.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_M2M_TLV_SERIALIZER_H +#define TEST_M2M_TLV_SERIALIZER_H + +#include "m2mtlvserializer.h" + +class Test_M2MTLVSerializer +{ +public: + Test_M2MTLVSerializer(); + + virtual ~Test_M2MTLVSerializer(); + + void test_serialize_object(); + + void test_serialize_object_instance(); + + void test_serialize_resource(); + + void test_serialize_resource_instance(); + + M2MTLVSerializer *serializer; +}; + +#endif // TEST_M2M_TLV_SERIALIZER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/nsdlaccesshelper/CMakeLists.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +if(TARGET_LIKE_LINUX) +include("../includes.txt") +add_executable(nsdlaccesshelper + "../../../../source/nsdlaccesshelper.cpp" + "main.cpp" + "nsdlaccesshelpertest.cpp" + "test_nsdlaccesshelper.cpp" + "../stub/common_stub.cpp" + "../stub/m2mnsdlinterface_stub.cpp" + "../stub/m2mstring_stub.cpp" + "../stub/m2mconnectionhandler_stub.cpp" + "../stub/m2mconnectionsecurity_stub.cpp" + "../stub/m2mserver_stub.cpp" + "../stub/m2mbase_stub.cpp" + "../stub/m2mobject_stub.cpp" + "../stub/m2mstringbufferbase_stub.cpp" +) + +target_link_libraries(nsdlaccesshelper + CppUTest + CppUTestExt +) +set_target_properties(nsdlaccesshelper +PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS}" + LINK_FLAGS "${UTEST_LINK_FLAGS}") + +set(binary "nsdlaccesshelper") +add_test(nsdlaccesshelper ${binary}) + +endif()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/nsdlaccesshelper/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/CommandLineTestRunner.h" +#include "CppUTest/TestPlugin.h" +#include "CppUTest/TestRegistry.h" +#include "CppUTestExt/MockSupportPlugin.h" +int main(int ac, char** av) +{ + return CommandLineTestRunner::RunAllTests(ac, av); +} + +IMPORT_TEST_GROUP( NsdlAccessHelper);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/nsdlaccesshelper/nsdlaccesshelpertest.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +//CppUTest includes should be after your and system includes +#include "CppUTest/TestHarness.h" +#include "test_nsdlaccesshelper.h" + +TEST_GROUP(NsdlAccessHelper) +{ + Test_NsdlAccessHelper* nsdl; + + void setup() + { + nsdl = new Test_NsdlAccessHelper(); + } + void teardown() + { + delete nsdl; + } +}; + + +TEST(NsdlAccessHelper, create) +{ + CHECK(nsdl != NULL); +} + +TEST(NsdlAccessHelper, test_nsdl_c_callback) +{ + nsdl->test_nsdl_c_callback(); +} + +TEST(NsdlAccessHelper, test_nsdl_c_memory_alloc) +{ + nsdl->test_nsdl_c_memory_alloc(); +} + +TEST(NsdlAccessHelper, test_nsdl_c_memory_free) +{ + nsdl->test_nsdl_c_memory_free(); +} + +TEST(NsdlAccessHelper, test_nsdl_c_send_to_server) +{ + nsdl->test_nsdl_c_send_to_server(); +} + +TEST(NsdlAccessHelper, test_nsdl_c_received_from_server) +{ + nsdl->test_nsdl_c_received_from_server(); +} + + +TEST(NsdlAccessHelper, test_socket_malloc) +{ + nsdl->test_socket_malloc(); +} + +TEST(NsdlAccessHelper, test_socket_free) +{ + nsdl->test_socket_free(); +} + +TEST(NsdlAccessHelper, test_mutex_claim) +{ + nsdl->test_mutex_claim(); +} + +TEST(NsdlAccessHelper, test_mutex_release) +{ + nsdl->test_mutex_release(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/nsdlaccesshelper/test_nsdlaccesshelper.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTest/TestHarness.h" +#include "test_nsdlaccesshelper.h" +#include "common_stub.h" +#include "m2mnsdlinterface_stub.h" +#include "m2mnsdlobserver.h" +#include "m2mconnectionobserver.h" + +class TestObserver : public M2MNsdlObserver, + public M2MConnectionObserver +{ + +public: + TestObserver(){} + virtual ~TestObserver(){} + void coap_message_ready(uint8_t *, + uint16_t, + sn_nsdl_addr_s *){ + message_ready = true; + } + + void client_registered(M2MServer *){ + registered = true; + } + + void registration_updated(const M2MServer &){ + + } + + void registration_error(uint8_t, bool retry = false){ + register_error = true; + } + + void client_unregistered(){ + unregistered = true; + } + + void bootstrap_done(M2MSecurity *sec){ + if(sec) { + boot_done = true; + } + } + + void bootstrap_wait(M2MSecurity *sec){ + if(sec) { + boot_wait = true; + } + } + void bootstrap_error(){ + boot_error = true; + } + + void coap_data_processed(){ + data_processed = true; + } + + void value_updated(M2MBase *){ + } + + void data_available(uint8_t*, + uint16_t, + const M2MConnectionObserver::SocketAddress &) { + + } + + void socket_error(uint8_t, bool) { + + } + + void address_ready(const M2MConnectionObserver::SocketAddress &, + M2MConnectionObserver::ServerType, + const uint16_t) { + + } + + void data_sent() { + + } + + bool register_error; + bool boot_error; + bool boot_wait; + bool boot_done; + bool registered; + bool data_processed; + bool unregistered; + bool message_ready; + +}; + +Test_NsdlAccessHelper::Test_NsdlAccessHelper() +{ + observer = new TestObserver(); +} + +Test_NsdlAccessHelper::~Test_NsdlAccessHelper() +{ + delete observer; + observer = NULL; + + clear_list(); +} + +void Test_NsdlAccessHelper::test_nsdl_c_callback() +{ + CHECK(__nsdl_c_callback(NULL,NULL,NULL,SN_NSDL_PROTOCOL_HTTP) == 0 ); + + m2mnsdlinterface_stub::int_value = 1; + m2mnsdlinterface_stub::void_value = malloc(1); + __nsdl_interface_list.clear(); + __nsdl_interface_list.push_back(new M2MNsdlInterface(*observer)); + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + memset(common_stub::coap_header, 0, sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s *) malloc(sizeof(sn_coap_options_list_s)); + common_stub::coap_header->options_list_ptr->block1 = 0x0101; + + CHECK(__nsdl_c_callback((nsdl_s*)m2mnsdlinterface_stub::void_value, + common_stub::coap_header,NULL,SN_NSDL_PROTOCOL_HTTP) == 1 ); + free(common_stub::coap_header->options_list_ptr); + free(common_stub::coap_header); + free(m2mnsdlinterface_stub::void_value); + clear_list(); +} + +void Test_NsdlAccessHelper::test_nsdl_c_memory_alloc() +{ + void *ptr = __nsdl_c_memory_alloc(6); + CHECK(ptr != NULL); + free(ptr); + ptr = NULL; + ptr = __nsdl_c_memory_alloc(UINT16_MAX+1); + CHECK(ptr == NULL); + free(ptr); +} + +void Test_NsdlAccessHelper::test_nsdl_c_memory_free() +{ + void* ptr = malloc(7); + __nsdl_c_memory_free(ptr); + + CHECK(ptr != NULL); + + ptr = NULL; + //No need to check anything, since memory leak is the test +} + +void Test_NsdlAccessHelper::test_nsdl_c_send_to_server() +{ + CHECK(__nsdl_c_send_to_server(NULL, SN_NSDL_PROTOCOL_HTTP, NULL, 0, NULL) == 0); + + m2mnsdlinterface_stub::int_value = 1; + m2mnsdlinterface_stub::void_value = malloc(1); + __nsdl_interface_list.clear(); + __nsdl_interface_list.push_back(new M2MNsdlInterface(*observer)); + + CHECK(__nsdl_c_send_to_server((nsdl_s*)m2mnsdlinterface_stub::void_value, SN_NSDL_PROTOCOL_HTTP, NULL, 0, NULL) == 1); + free(m2mnsdlinterface_stub::void_value); + clear_list(); +} + +void Test_NsdlAccessHelper::test_nsdl_c_received_from_server() +{ + CHECK( 0 == __nsdl_c_received_from_server(NULL, NULL, NULL)); + + m2mnsdlinterface_stub::int_value = 1; + m2mnsdlinterface_stub::void_value = malloc(1); + __nsdl_interface_list.clear(); + __nsdl_interface_list.push_back(new M2MNsdlInterface(*observer)); + common_stub::coap_header = (sn_coap_hdr_s *) malloc(sizeof(sn_coap_hdr_s)); + memset(common_stub::coap_header, 0, sizeof(sn_coap_hdr_s)); + common_stub::coap_header->options_list_ptr = (sn_coap_options_list_s *) malloc(sizeof(sn_coap_options_list_s)); + common_stub::coap_header->options_list_ptr->block1 = 0x0101; + CHECK( 1 == __nsdl_c_received_from_server((nsdl_s*)m2mnsdlinterface_stub::void_value, common_stub::coap_header, NULL)); + free(common_stub::coap_header->options_list_ptr); + free(common_stub::coap_header); + free(m2mnsdlinterface_stub::void_value); + clear_list(); +} + +void Test_NsdlAccessHelper::test_socket_malloc() +{ + void *ptr = __socket_malloc(NULL, 6); + CHECK(ptr != NULL); + + free(ptr); +} + +void Test_NsdlAccessHelper::test_socket_free() +{ + void* ptr = malloc(7); + __socket_free(NULL, ptr); + + ptr = NULL; + //No need to check anything, since memory leak is the test +} + +void Test_NsdlAccessHelper::test_mutex_claim() +{ + __connection_handler = new M2MConnectionHandler(*observer, + NULL, + M2MInterface::UDP, + M2MInterface::LwIP_IPv4); + __mutex_claim(); + + delete __connection_handler; +} + +void Test_NsdlAccessHelper::test_mutex_release() +{ + __connection_handler = new M2MConnectionHandler(*observer, + NULL, + M2MInterface::UDP, + M2MInterface::LwIP_IPv4); + __mutex_release(); + + delete __connection_handler; +} + +void Test_NsdlAccessHelper::clear_list() +{ + M2MNsdlInterfaceList::const_iterator it; + it = __nsdl_interface_list.begin(); + int size = __nsdl_interface_list.size(); + if (!__nsdl_interface_list.empty()) { + for (int i = 0; i < size; i++) { + delete __nsdl_interface_list[i]; + __nsdl_interface_list.erase(i); + } + __nsdl_interface_list.clear(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/nsdlaccesshelper/test_nsdlaccesshelper.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef TEST_NSDL_ACCESS_HELPER_H +#define TEST_NSDL_ACCESS_HELPER_H + +#include "nsdlaccesshelper.h" +#include "common_stub.h" + +class TestObserver; + +class Test_NsdlAccessHelper +{ +public: + Test_NsdlAccessHelper(); + + virtual ~Test_NsdlAccessHelper(); + + void test_nsdl_c_callback(); + + void test_nsdl_c_memory_alloc(); + + void test_nsdl_c_memory_free(); + + void test_nsdl_c_send_to_server(); + + void test_nsdl_c_received_from_server(); + + void test_socket_malloc(); + + void test_socket_free(); + + void test_mutex_claim(); + + void test_mutex_release(); + + TestObserver *observer; +private: + void clear_list(); +}; + +#endif // TEST_NSDL_ACCESS_HELPER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/common_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,455 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "common_stub.h" +#include "sn_grs.h" +#include <sys/socket.h> + +socket_error_t common_stub::error; +socket_event_t * common_stub::event; +socket_addr * common_stub::addr; +void * common_stub::void_value; +bool common_stub::visited; +bool common_stub::bool_value; +int common_stub::int_value; +int common_stub::int2_value; +addrinfo* common_stub::addrinfo; +uint16_t common_stub::uint_value; +sn_coap_hdr_s *common_stub::coap_header; +sn_nsdl_dynamic_resource_parameters_s *common_stub::resource; +pthread_t common_stub::thread; +const char* common_stub::char_value; + +using namespace mbed; +using namespace mbed::Sockets::v0; + +void common_stub::clear() +{ + int_value = -1; + int2_value = -1; + uint_value = 0; + error = SOCKET_ERROR_NONE; + event = NULL; + addr = NULL; + void_value = NULL; + visited = false; + bool_value= false; + coap_header = NULL; + resource = NULL; + addrinfo = NULL; + char_value = NULL; +} + +UDPSocket::UDPSocket(socket_stack_t stack) :Socket(stack) +{ +} + +UDPSocket::~UDPSocket() +{ +} + +socket_error_t UDPSocket::connect(const SocketAddr *, const uint16_t ) +{ + return common_stub::error; +} + +//SocketAddr + +void SocketAddr::setAddr(const struct socket_addr *) +{ +} + +void SocketAddr::setAddr(const SocketAddr *) +{ +} + +bool SocketAddr::SocketAddr::is_v4() +{ + return common_stub::bool_value; +} + +void mbed::Ticker::detach() +{ + common_stub::visited = true; +} + + +// SN_NSDL_LIB + +struct nsdl_s *sn_nsdl_init (uint8_t (*sn_nsdl_tx_cb)(struct nsdl_s *, sn_nsdl_capab_e , uint8_t *, uint16_t, sn_nsdl_addr_s *), + uint8_t (*sn_nsdl_rx_cb)(struct nsdl_s *, sn_coap_hdr_s *, sn_nsdl_addr_s *), + void *(*sn_nsdl_alloc)(uint16_t),void (*sn_nsdl_free)(void *)) +{ + return NULL; +} + +uint16_t sn_nsdl_register_endpoint(struct nsdl_s *, sn_nsdl_ep_parameters_s *) +{ + return common_stub::uint_value; +} + +uint16_t sn_nsdl_unregister_endpoint(struct nsdl_s *) +{ + return common_stub::uint_value; +} + +uint16_t sn_nsdl_update_registration(struct nsdl_s *,uint8_t *, uint8_t) +{ + return common_stub::uint_value; +} + +uint16_t sn_nsdl_send_observation_notification_with_uri_path(struct nsdl_s *, uint8_t *, uint8_t, + uint8_t *, uint16_t, + uint8_t *, uint8_t, + sn_coap_msg_type_e , uint8_t, + uint8_t *, uint16_t) +{ + return common_stub::uint_value; +} +uint16_t sn_nsdl_send_observation_notification(struct nsdl_s *, uint8_t *, uint8_t, + uint8_t *, uint16_t, + uint8_t *, uint8_t, + sn_coap_msg_type_e , uint8_t) +{ + return common_stub::uint_value; +} + +int8_t sn_nsdl_set_endpoint_location(struct nsdl_s *, uint8_t *, uint8_t) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_destroy(struct nsdl_s *handle) +{ + return common_stub::int_value; +} + +sn_coap_hdr_s *sn_nsdl_build_response(struct nsdl_s *, sn_coap_hdr_s *, uint8_t ) +{ + return common_stub::coap_header; +} + +sn_nsdl_dynamic_resource_parameters_s *sn_nsdl_get_resource(struct nsdl_s *, uint16_t, uint8_t *) +{ + return common_stub::resource; +} + +int8_t sn_nsdl_process_coap(struct nsdl_s *, uint8_t *, uint16_t , sn_nsdl_addr_s *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_exec(struct nsdl_s *, uint32_t) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_set_retransmission_parameters(struct nsdl_s *, uint8_t, uint8_t) +{ + return common_stub::int_value; +} + +void sn_nsdl_release_allocated_coap_msg_mem(struct nsdl_s *, sn_coap_hdr_s *header) +{ + if(header && header != common_stub::coap_header){ + if( header->options_list_ptr){ + free(header->options_list_ptr); + header->options_list_ptr = NULL; + } + free(header); + header = NULL; + } +} + +sn_coap_options_list_s *sn_nsdl_alloc_options_list(struct nsdl_s *handle, sn_coap_hdr_s *coap_msg_ptr) +{ + if( common_stub::coap_header ) { + return common_stub::coap_header->options_list_ptr; + } + return NULL; +} + +int8_t sn_nsdl_create_resource(struct nsdl_s *, sn_nsdl_dynamic_resource_parameters_s *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_delete_resource(struct nsdl_s *, uint16_t , uint8_t *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_put_resource(struct nsdl_s *handle, sn_nsdl_dynamic_resource_parameters_s *res) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_pop_resource(struct nsdl_s *handle, sn_nsdl_dynamic_resource_parameters_s *res) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_send_coap_message(struct nsdl_s *, sn_nsdl_addr_s *, sn_coap_hdr_s *) +{ + return common_stub::int_value; +} + +int8_t sn_nsdl_update_resource(struct nsdl_s *, sn_nsdl_dynamic_resource_parameters_s *) +{ + return common_stub::int_value; +} + +int8_t set_NSP_address(struct nsdl_s *, uint8_t *, uint8_t, uint16_t, sn_nsdl_addr_type_e) +{ + return common_stub::int_value; +} + +uint16_t sn_nsdl_oma_bootstrap(struct nsdl_s *, sn_nsdl_addr_s *, + sn_nsdl_ep_parameters_s *, + sn_nsdl_bs_ep_info_t *) +{ + return common_stub::uint_value; +} + +//Coap Headers + +sn_coap_hdr_s *sn_coap_build_response(struct coap_s *, sn_coap_hdr_s *, uint8_t ) +{ + return common_stub::coap_header; +} + +void sn_coap_parser_release_allocated_coap_msg_mem(struct coap_s *, sn_coap_hdr_s *) +{ +} + +int8_t sn_coap_protocol_set_retransmission_parameters(uint8_t, uint8_t) +{ + return common_stub::int_value; +} + +// IP6String.h +uint_fast8_t ip6tos(const void *ip6addr, char *p) +{ + // Just set at least something there, or the valgrind will scream when + // client tries to use the result string. + p[0] = '\0'; + return 0; +} + +//Socket +Socket::Socket(const socket_stack_t ) : _irq(this) +{ + _socket.api = NULL; +} + +Socket::~Socket() +{ +} + +socket_error_t Socket::open(const socket_address_family_t , const socket_proto_family_t ) +{ + return common_stub::error; +} + +bool Socket::error_check(socket_error_t ) +{ + return common_stub::bool_value; +} + +void Socket::_eventHandler(struct socket_event *) +{ +} + +void Socket::setOnError(const ErrorHandler_t &) +{ +} + +void Socket::setOnReadable(const ReadableHandler_t &) +{ +} + +void Socket::setOnSent(const SentHandler_t & ) +{ +} + +void Socket::_nvEventHandler(void * ) +{ +} + +socket_error_t Socket::getLocalAddr(SocketAddr *) const +{ + return common_stub::error; +} + +socket_error_t Socket::getLocalPort(uint16_t *) const +{ + return common_stub::error; +} + +socket_error_t Socket::getRemoteAddr(SocketAddr *) const +{ + return common_stub::error; +} + +socket_error_t Socket::getRemotePort(uint16_t *) const +{ + return common_stub::error; +} + +socket_error_t Socket::resolve(const char* , const DNSHandler_t & ) +{ + return common_stub::error; +} + +socket_error_t Socket::bind(const char * , const uint16_t ) +{ + return common_stub::error; +} +socket_error_t Socket::bind(const SocketAddr * , const uint16_t ) +{ + return common_stub::error; +} + +socket_error_t Socket::close() +{ + return common_stub::error; +} + +socket_error_t Socket::recv(void * , size_t *) +{ + return common_stub::error; +} +socket_error_t Socket::recv_from(void * , size_t *, SocketAddr *, uint16_t *) +{ + return common_stub::error; +} + +socket_error_t Socket::send(const void * , const size_t ) +{ + return common_stub::error; +} +socket_error_t Socket::send_to(const void * , const size_t , const SocketAddr *, uint16_t ) +{ + return common_stub::error; +} + +bool Socket::isConnected() const { + return common_stub::error; +} + +// pthread +int pthread_equal (pthread_t , pthread_t ) __THROW +{ + return common_stub::int2_value; +} + +pthread_t pthread_self (void) __THROW +{ + return common_stub::thread; +} + +int pthread_detach (pthread_t) __THROW +{ + return common_stub::int_value; +} + +int pthread_create (pthread_t * , + const pthread_attr_t *, + void *(*__start_routine) (void *), + void *) __THROWNL +{ + __start_routine(NULL); + return common_stub::int_value; +} + +int pthread_cancel (pthread_t) +{ + return common_stub::int_value; +} + +int pthread_join (pthread_t , void **) +{ + return common_stub::int_value; +} + +void pthread_exit (void *__retval)/* __attribute__ ((__noreturn__))*/ +{ + +} + +// sys/socket +#ifndef __SOCKADDR_ARG +# define __SOCKADDR_ARG struct sockaddr *__restrict +#endif + +#ifndef __CONST_SOCKADDR_ARG +# define __CONST_SOCKADDR_ARG const struct sockaddr * +#endif + +#ifndef __socklen_t_defined +typedef __socklen_t socklen_t; +# define __socklen_t_defined +#endif + +int bind (int , __CONST_SOCKADDR_ARG , socklen_t ) + __THROW +{ + return common_stub::int_value; +} + +ssize_t sendto (int , const void *, size_t , + int , __CONST_SOCKADDR_ARG , + socklen_t ) +{ + return common_stub::int_value; +} + +ssize_t recvfrom (int , void * , size_t , + int , __SOCKADDR_ARG , + socklen_t * ) +{ + return common_stub::int_value; +} + +int getaddrinfo (const char *__restrict, + const char *__restrict, + const struct addrinfo *__restrict, + struct addrinfo **__restrict addr) +{ + //*addr = (addrinfo*)malloc(sizeof(addrinfo)); + //(*addr)->ai_addr = (sockaddr*)malloc(sizeof(sockaddr)); + *addr = common_stub::addrinfo; + return common_stub::int_value; +} + +void freeaddrinfo (struct addrinfo * addr) +__THROW +{ +// free(addr->ai_addr); +// free(addr); +} + +const char *inet_ntop (int, const void *__restrict, + char *__restrict, socklen_t) + __THROW +{ + return common_stub::char_value; +} + +int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) +{ + return common_stub::int_value; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/common_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef COMMON_STUB_H +#define COMMON_STUB_H + +#include <sys/types.h> +#include <netdb.h> +#include "sockets/UDPSocket.h" +#include "nsdlaccesshelper.h" +#include "ip6string.h" +#include "Ticker.h" + +//some internal test related stuff +namespace common_stub +{ + extern socket_error_t error; + extern socket_event_t* event; + extern socket_addr* addr; + extern bool visited; + extern bool bool_value; + extern void* void_value; + extern int int_value; + extern int int2_value; + extern uint16_t uint_value; + extern addrinfo* addrinfo; + extern sn_coap_hdr_s *coap_header; + extern sn_nsdl_dynamic_resource_parameters_s *resource; + extern pthread_t thread; + extern const char *char_value; + void clear(); +} + +#endif // COMMON_STUB_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mbase_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,542 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mbase_stub.h" +#include "m2mstringbufferbase_stub.h" +#include <assert.h> + +uint8_t m2mbase_stub::uint8_value; +uint16_t m2mbase_stub::uint16_value; +uint32_t m2mbase_stub::uint32_value; +uint16_t m2mbase_stub::int_value; +int32_t m2mbase_stub::name_id_value; + +bool m2mbase_stub::bool_value; +const char *m2mbase_stub::string_value; +const char *m2mbase_stub::object_instance_name; +const char *m2mbase_stub::resource_name; +const char *m2mbase_stub::resource_name_inst; +M2MBase::BaseType m2mbase_stub::base_type; +M2MBase::Operation m2mbase_stub::operation; +M2MBase::Mode m2mbase_stub::mode_value; +M2MBase::Observation m2mbase_stub::observation_level_value; + +void *m2mbase_stub::void_value; +M2MObservationHandler *m2mbase_stub::observe; +M2MReportHandler *m2mbase_stub::report; +bool m2mbase_stub::is_value_updated_function_set; +uint8_t *m2mbase_stub::object_inst_token; +uint32_t m2mbase_stub::object_inst_token_len; +uint8_t *m2mbase_stub::object_token; +uint32_t m2mbase_stub::object_token_len; +uint8_t *m2mbase_stub::resource_token; +uint32_t m2mbase_stub::resource_token_len; +sn_nsdl_dynamic_resource_parameters_s *m2mbase_stub::nsdl_resource; +bool m2mbase_stub::find_resource; +int32_t m2mbase_stub::ret_counter; + +void m2mbase_stub::clear() +{ + int_value = 0; + uint8_value = 0; + uint16_value = 0; + uint32_value = 0; + string_value = NULL; + object_instance_name = NULL; + resource_name = NULL; + resource_name_inst = NULL; + name_id_value = -1; + mode_value = M2MBase::Static; + base_type = M2MBase::Object; + observation_level_value = M2MBase::None; + bool_value = false; + m2mbase_stub::operation = M2MBase::NOT_ALLOWED; + void_value = NULL; + observe = NULL; + report = NULL; + is_value_updated_function_set = false; + object_token = NULL; + object_token_len = 0; + resource_token = NULL; + resource_token_len = 0; + object_inst_token = NULL; + object_inst_token_len = 0; + find_resource = false; + ret_counter = 0; +} + +M2MBase::M2MBase(const String& resource_name, + M2MBase::Mode mode, + const String &resource_type, + char *path, + bool external_blockwise_store) +: + _sn_resource(NULL), + _report_handler(NULL), + _observation_handler(NULL), + _token(NULL), + _function_pointer(NULL), + _observation_number(0), + _token_length(0), + _observation_level(M2MBase::None), + _is_under_observation(false) +{ + +} + +M2MBase::M2MBase(const lwm2m_parameters_s *s): + _sn_resource((lwm2m_parameters_s*) s), + _report_handler(NULL), + _observation_handler(NULL), + _token(NULL), + _function_pointer(NULL), + _observation_number(0), + _token_length(0), + _observation_level(M2MBase::None), + _is_under_observation(false) +{ +} + +M2MBase::~M2MBase() +{ +} + +void M2MBase::set_operation(M2MBase::Operation opr) +{ + m2mbase_stub::operation = opr; +} + +void M2MBase::set_interface_description(const String &/*desc*/) +{ +} + +void M2MBase::set_resource_type(const String &/*res_type*/) +{ +} + +void M2MBase::set_interface_description(const char */*desc*/) +{ +} + +void M2MBase::set_resource_type(const char */*res_type*/) +{ +} + +void M2MBase::set_coap_content_type(const uint8_t /*con_type*/) +{ +} + +void M2MBase::set_instance_id(const uint16_t /*inst_id*/) +{ +} + +void M2MBase::set_observation_number(const uint16_t /*observation_number*/) +{ +} + +void M2MBase::set_max_age(const uint32_t /*max_age*/) +{ +} + +M2MBase::Operation M2MBase::operation() const +{ + return m2mbase_stub::operation; +} + +const char* M2MBase::name() const +{ + return m2mbase_stub::string_value; +} + +int32_t M2MBase::name_id() const +{ + return m2mbase_stub::name_id_value; +} + +uint16_t M2MBase::instance_id() const +{ + return m2mbase_stub::int_value; +} + +const char* M2MBase::interface_description() const +{ + return m2mbase_stub::string_value; +} + +const char* M2MBase::resource_type() const +{ + return m2mbase_stub::string_value; +} + +uint8_t M2MBase::coap_content_type() const +{ + return m2mbase_stub::uint8_value; +} + +uint32_t M2MBase::max_age() const +{ + return m2mbase_stub::uint32_value; +} + +void M2MBase::set_observable(bool /*observable*/) +{ +} + +void M2MBase::add_observation_level(M2MBase::Observation) +{ +} + +void M2MBase::remove_observation_level(M2MBase::Observation) +{ +} + +void M2MBase::set_under_observation(bool /*observed*/, + M2MObservationHandler */*handler*/) +{ +} + +void M2MBase::set_observation_token(const uint8_t */*token*/, + const uint8_t /*length*/) +{ +} + +bool M2MBase::is_observable() const +{ + return m2mbase_stub::bool_value; +} + +M2MBase::Observation M2MBase::observation_level() const +{ + return m2mbase_stub::observation_level_value; +} + +void M2MBase::get_observation_token(uint8_t *&token, + uint32_t &length) +{ + length = 0; + if(token) { + free(token); + token = NULL; + } + + if (m2mbase_stub::find_resource) { + if (m2mbase_stub::ret_counter == 1) { + token = (uint8_t *)malloc(m2mbase_stub::object_inst_token_len); + if(token) { + length = m2mbase_stub::object_inst_token_len; + memcpy((uint8_t *)token, (uint8_t *)m2mbase_stub::object_inst_token, length); + } + } else if (m2mbase_stub::ret_counter == 2) { + token = (uint8_t *)malloc(m2mbase_stub::resource_token_len); + if(token) { + length = m2mbase_stub::resource_token_len; + memcpy((uint8_t *)token, (uint8_t *)m2mbase_stub::resource_token, length); + } + } else { + token = (uint8_t *)malloc(m2mbase_stub::object_token_len); + if(token) { + length = m2mbase_stub::object_token_len; + memcpy((uint8_t *)token, (uint8_t *)m2mbase_stub::object_token, length); + } + } + m2mbase_stub::ret_counter++; + } else { + token = (uint8_t *)malloc(m2mbase_stub::object_token_len); + if(token) { + length = m2mbase_stub::object_token_len; + memcpy((uint8_t *)token, (uint8_t *)m2mbase_stub::object_token, length); + } + } +} + +void M2MBase::set_base_type(M2MBase::BaseType /*type*/) +{ +} + +M2MBase::BaseType M2MBase::base_type() const +{ + return m2mbase_stub::base_type; +} + +M2MBase::Mode M2MBase::mode() const +{ + return m2mbase_stub::mode_value; +} + +uint16_t M2MBase::observation_number() const +{ + return m2mbase_stub::uint16_value; +} + +bool M2MBase::handle_observation_attribute(const char *query) +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::observation_to_be_sent(m2m::Vector<uint16_t>, bool) +{ +} + +void *M2MBase::memory_alloc(uint32_t size) +{ + if(size) + return malloc(size); + else + return 0; +} + +void M2MBase::memory_free(void *ptr) +{ + if(ptr) + free(ptr); +} + +uint8_t* M2MBase::alloc_string_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size + 1); + if (result) { + memcpy(result, source, size); + result[size] = '\0'; + } + return result; +} + +uint8_t* M2MBase::alloc_copy(const uint8_t* source, uint32_t size) +{ + assert(source != NULL); + + uint8_t* result = (uint8_t*)memory_alloc(size); + if (result) { + memcpy(result, source, size); + } + return result; +} + +M2MReportHandler* M2MBase::report_handler() +{ + return m2mbase_stub::report; +} + +M2MObservationHandler* M2MBase::observation_handler() +{ + return m2mbase_stub::observe; +} + +sn_coap_hdr_s* M2MBase::handle_get_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_put_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &execute_value_updated) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +sn_coap_hdr_s* M2MBase::handle_post_request(nsdl_s */*nsdl*/, + sn_coap_hdr_s */*received_coap_header*/, + M2MObservationHandler */*observation_handler*/, + bool &, sn_nsdl_addr_s *address) +{ + //Handled in M2MResource, M2MObjectInstance and M2MObject classes + return NULL; +} + +void M2MBase::set_register_uri( bool register_uri) +{ +} + +bool M2MBase::register_uri() +{ + return m2mbase_stub::bool_value; +} + +const char* M2MBase::uri_path() const +{ + if (m2mbase_stub::find_resource) { + m2mbase_stub::ret_counter++; + if (m2mbase_stub::ret_counter == 2) { + return m2mbase_stub::object_instance_name; + } else if (m2mbase_stub::ret_counter == 3) { + return m2mbase_stub::resource_name; + } else if (m2mbase_stub::ret_counter == 4 || m2mbase_stub::ret_counter == 5) { + return m2mbase_stub::resource_name_inst; + } else { + return m2mbase_stub::string_value; + } + } else { + return m2mbase_stub::string_value; + } +} + +bool M2MBase::is_under_observation() const +{ + return m2mbase_stub::bool_value; +} + +void M2MBase::set_value_updated_function(value_updated_callback callback) +{ + +} + +void M2MBase::set_value_updated_function(value_updated_callback2 callback) +{ + +} + +bool M2MBase::is_value_updated_function_set() +{ + return m2mbase_stub::is_value_updated_function_set; +} + +void M2MBase::execute_value_updated(const String& name) +{ + +} +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE> &buffer, const char *s1, uint16_t i1, const char *s2, uint16_t i2) +{ + + if(!buffer.ensure_space(strlen(s1) + strlen(s2) + 10 + 3 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + buffer.append('/'); + buffer.append(s2); + buffer.append('/'); + buffer.append_int(i2); + + return true; + +} + +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_2> &buffer, const char *s1, uint16_t i1, const char *s2) +{ + + if(!buffer.ensure_space(strlen(s1) + strlen(s2) + 5 + 2 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + buffer.append('/'); + buffer.append(s2); + + return true; + +} + +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_3> &buffer, const char *s1, uint16_t i1, uint16_t i2) +{ + + if(!buffer.ensure_space(strlen(s1) + 10 + 2 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + buffer.append('/'); + buffer.append_int(i2); + + return true; + +} + +bool M2MBase::build_path(StringBuffer<MAX_PATH_SIZE_4> &buffer, const char *s1, uint16_t i1) +{ + + if(!buffer.ensure_space(strlen(s1) + 5 + 1 + 1)){ + return false; + } + + buffer.append(s1); + buffer.append('/'); + buffer.append_int(i1); + + return true; + +} + +sn_nsdl_dynamic_resource_parameters_s* M2MBase::get_nsdl_resource() +{ + return m2mbase_stub::nsdl_resource; +} + +char* M2MBase::stringdup(const char* src) +{ + +} + +char* M2MBase::create_path(const M2MObject &parent, uint16_t object_instance) +{ + +} + +char* M2MBase::create_path(const M2MObject &parent, const char *name) +{ + +} + +char* M2MBase::create_path(const M2MResource &parent, uint16_t resource_instance) +{ + +} + +char* M2MBase::create_path(const M2MResource &parent, const char *name) +{ + +} + +char* M2MBase::create_path(const M2MObjectInstance &parent, const char *name) +{ + +} + +void M2MBase::set_observation_handler(M2MObservationHandler *handler) +{ + +} + +size_t M2MBase::resource_name_length() const +{ + +} + +bool M2MBase::validate_string_length(const String &string, size_t min_length, size_t max_length) +{ + return m2mbase_stub::bool_value; +} + +bool M2MBase::validate_string_length(const char* string, size_t min_length, size_t max_length) +{ + return m2mbase_stub::bool_value; +} + +M2MReportHandler* M2MBase::create_report_handler() +{ + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mbase_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_BASE_STUB_H +#define M2M_BASE_STUB_H + +#include "m2mbase.h" +#include "nsdlaccesshelper_stub.h" +static sn_nsdl_static_resource_parameters_s params_static = { + (char*)"", // resource_type_ptr + (char*)"", // interface_description_ptr + (uint8_t*)"", // path + (uint8_t*)"value", // resource + 0, // pathlen + 5, // resourcelen + false, // external_memory_block + SN_GRS_DYNAMIC, // mode + false // free_on_delete +}; + +static sn_nsdl_dynamic_resource_parameters_s params_dynamic = { + __nsdl_c_callback, + ¶ms_static, + {NULL, NULL}, // link + 0, // coap_content_type + M2MBase::PUT_ALLOWED, // access + 0, // registered + false, // publish_uri + false, // free_on_delete + true // observable +}; + +const static M2MBase::lwm2m_parameters params = { + 0, // max_age + 1, // instance_id + 0, // name_id + (char*)"", // name + ¶ms_dynamic, + M2MBase::Resource, // base_type + false // free_on_delete +}; + +//some internal test related stuff +namespace m2mbase_stub +{ + extern uint8_t uint8_value; + extern uint16_t uint16_value; + extern uint32_t uint32_value; + extern uint16_t int_value; + extern int32_t name_id_value; + extern const char *string_value; + extern const char *object_instance_name; + extern const char *resource_name; + extern const char *resource_name_inst; + extern bool bool_value; + extern M2MBase::BaseType base_type; + extern M2MBase::Mode mode_value; + extern M2MBase::Operation operation; + extern void *void_value; + extern M2MObservationHandler *observe; + extern M2MReportHandler *report; + extern M2MBase::Observation observation_level_value; + extern bool is_value_updated_function_set; + void clear(); + extern uint8_t* object_token; + extern uint32_t object_token_len; + extern uint8_t* resource_token; + extern uint32_t resource_token_len; + extern uint8_t* object_inst_token; + extern uint32_t object_inst_token_len; + extern sn_nsdl_dynamic_resource_parameters_s *nsdl_resource; + extern bool find_resource; + extern int32_t ret_counter; +} + +#endif // M2M_BASE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mblockmessage_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mblockmessage_stub.h" + +bool m2mblockmessage_stub::is_block_message; +bool m2mblockmessage_stub::is_last_block; +void m2mblockmessage_stub::clear() +{ + +} + +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "mbed-client/m2mblockmessage.h" +#include <assert.h> +#include <cstdlib> +#include <cstring> +M2MBlockMessage::M2MBlockMessage() +{ +} + +M2MBlockMessage::~M2MBlockMessage() +{ + +} + +void M2MBlockMessage::set_message_info(sn_coap_hdr_s *coap_header) +{ + +} + +void M2MBlockMessage::clear_values() +{ + +} + +bool M2MBlockMessage::is_block_message() const +{ + return m2mblockmessage_stub::is_block_message; +} + +uint16_t M2MBlockMessage::block_number() const +{ + +} + +uint32_t M2MBlockMessage::total_message_size() const +{ + +} + +bool M2MBlockMessage::is_last_block() const +{ + return m2mblockmessage_stub::is_last_block; +} + +uint8_t* M2MBlockMessage::block_data() const +{ + +} + +uint32_t M2MBlockMessage::block_data_len() const +{ + +} + +M2MBlockMessage::Error M2MBlockMessage::error_code() const +{ + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mblockmessage_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_BLOCKMESSAGE_STUB_H +#define M2M_BLOCKMESSAGE_STUB_H + +#include "m2mblockmessage.h" + +//some internal test related stuff +namespace m2mblockmessage_stub +{ + extern bool is_block_message; + extern bool is_last_block; + void clear(); +} + +#endif // M2M_BLOCKMESSAGE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mconnectionhandler_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mconnectionhandler_stub.h" +#include "m2mconnectionsecurity.h" +#include "common_stub.h" + +int m2mconnectionhandler_stub::int_value; +uint16_t m2mconnectionhandler_stub::uint_value; +bool m2mconnectionhandler_stub::bool_value; +M2MConnectionSecurity* secu = NULL; + +void m2mconnectionhandler_stub::clear() +{ + int_value = -1; + uint_value = 0; + bool_value = false; +} + +M2MConnectionHandler::M2MConnectionHandler(M2MConnectionObserver &observer, + M2MConnectionSecurity* sec, + M2MInterface::BindingMode, + M2MInterface::NetworkStack) +:_observer(observer) +{ + if (secu) { + delete secu; + secu = NULL; + } + secu = sec; +} + +M2MConnectionHandler::~M2MConnectionHandler() +{ + if( secu ){ + delete secu; + secu = NULL; + } +} + +bool M2MConnectionHandler::bind_connection(const uint16_t) +{ + return m2mconnectionhandler_stub::bool_value; +} + +bool M2MConnectionHandler::resolve_server_address(const String&, + const uint16_t, + M2MConnectionObserver::ServerType, + const M2MSecurity* ) +{ + return m2mconnectionhandler_stub::bool_value; +} + +bool M2MConnectionHandler::start_listening_for_data() +{ + return m2mconnectionhandler_stub::bool_value; +} + +bool M2MConnectionHandler::send_data(uint8_t *, + uint16_t , + sn_nsdl_addr_s *) +{ + return m2mconnectionhandler_stub::bool_value; +} + +void M2MConnectionHandler::stop_listening() +{ +} + +int M2MConnectionHandler::send_to_socket(const unsigned char *, size_t ){ + return m2mconnectionhandler_stub::int_value; +} + +int M2MConnectionHandler::receive_from_socket(unsigned char *, size_t){ + return m2mconnectionhandler_stub::int_value; +} + +void M2MConnectionHandler::set_platform_network_handler(void *) +{ +} + +void M2MConnectionHandler::claim_mutex() +{ +} + +void M2MConnectionHandler::release_mutex() +{ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mconnectionhandler_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_HANDLER_IMPL_MBED_STUB_H +#define M2M_CONNECTION_HANDLER_IMPL_MBED_STUB_H + +#include "m2mconnectionhandler.h" + +//some internal test related stuff +namespace m2mconnectionhandler_stub +{ + extern int int_value; + extern uint16_t uint_value; + extern bool bool_value; + void clear(); +} + +#endif // M2M_CONNECTION_HANDLER_IMPL_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mconnectionsecurity_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "m2mconnectionhandler.h" +#include "m2mconnectionsecurity.h" +#include "m2mtimer.h" +#include "m2msecurity.h" +#include <string.h> +#include "m2mconnectionsecurity_stub.h" + +bool m2mconnectionsecurityimpl_stub::use_inc_int; +int m2mconnectionsecurityimpl_stub::inc_int_value; +int m2mconnectionsecurityimpl_stub::int_value; + +void m2mconnectionsecurityimpl_stub::clear() +{ + int_value = -1; + use_inc_int = false; + inc_int_value = 0; +} + +M2MConnectionSecurity::M2MConnectionSecurity(M2MConnectionSecurity::SecurityMode mode) +{ + +} + +M2MConnectionSecurity::~M2MConnectionSecurity(){ +} + +void M2MConnectionSecurity::reset(){ +} + +int M2MConnectionSecurity::init(const M2MSecurity *security){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::connect(M2MConnectionHandler* connHandler){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::start_connecting_non_blocking(M2MConnectionHandler* connHandler) +{ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::continue_connecting() +{ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::send_message(unsigned char *message, int len){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +int M2MConnectionSecurity::read(unsigned char* buffer, uint16_t len){ + if(m2mconnectionsecurityimpl_stub::use_inc_int){ + return m2mconnectionsecurityimpl_stub::inc_int_value++; + } + return m2mconnectionsecurityimpl_stub::int_value; +} + +void M2MConnectionSecurity::set_random_number_callback(random_number_cb) +{ + +} + +void M2MConnectionSecurity::set_entropy_callback(mbedtls_entropy) +{ + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mconnectionsecurity_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_CONNECTION_SECURITY_IMPL_STUB_H +#define M2M_CONNECTION_SECURITY_IMPL_STUB_H + +//some internal test related stuff +namespace m2mconnectionsecurityimpl_stub +{ + extern int int_value; + extern bool use_inc_int; + extern int inc_int_value; + void clear(); +} + +#endif // M2M_CONNECTION_SECURITY_IMPL_STUB_H + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mdevice_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mdevice_stub.h" + +uint32_t m2mdevice_stub::int_value; +bool m2mdevice_stub::bool_value; +M2MResource* m2mdevice_stub::resource; +String *m2mdevice_stub::string_value; + +void m2mdevice_stub::clear() +{ + int_value = -1; + bool_value = false; + *string_value = ""; + resource = NULL; +} + +M2MDevice::M2MDevice(char *path) +: M2MObject("3", path) +{ + m2mdevice_stub::string_value = new String(""); +} + +M2MDevice::~M2MDevice() +{ + delete m2mdevice_stub::string_value; +} + +M2MDevice* M2MDevice::get_instance() +{ + return new M2MDevice("3"); +} + +void M2MDevice::delete_instance() +{ +} + +M2MResource* M2MDevice::create_resource(DeviceResource, const String &) +{ + return m2mdevice_stub::resource; +} + +M2MResource* M2MDevice::create_resource(DeviceResource) +{ + return m2mdevice_stub::resource; +} + +bool M2MDevice::delete_resource(DeviceResource) +{ + return m2mdevice_stub::bool_value; +} + +bool M2MDevice::delete_resource_instance(DeviceResource, uint16_t) +{ + return m2mdevice_stub::bool_value; +} + +bool M2MDevice::set_resource_value(DeviceResource, + const String &, + uint16_t ) +{ + return m2mdevice_stub::bool_value; +} + +bool M2MDevice::set_resource_value(DeviceResource, + int64_t, + uint16_t) +{ + return m2mdevice_stub::bool_value; +} + +String M2MDevice::resource_value_string(DeviceResource, + uint16_t) const +{ + return *m2mdevice_stub::string_value; +} + +int64_t M2MDevice::resource_value_int(DeviceResource, + uint16_t) const +{ + return m2mdevice_stub::int_value; +} + +bool M2MDevice::is_resource_present(DeviceResource) const +{ + return m2mdevice_stub::bool_value; +} + +uint16_t M2MDevice::per_resource_count(DeviceResource) const +{ + return (uint16_t)m2mdevice_stub::int_value; +} + +uint16_t M2MDevice::total_resource_count() const +{ + return (uint16_t)m2mdevice_stub::int_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mdevice_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_DEVICE_STUB_H +#define M2M_DEVICE_STUB_H + +#include "m2mdevice.h" + +//some internal test related stuff +namespace m2mdevice_stub +{ + extern uint32_t int_value; + extern M2MResource* resource; + extern String *string_value; + extern bool bool_value; + void clear(); +} + +#endif // M2M_DEVICE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mfirmware_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mfirmware_stub.h" +bool m2mfirmware_stub::has_value; +uint32_t m2mfirmware_stub::int_value; +bool m2mfirmware_stub::bool_value; +M2MResource* m2mfirmware_stub::resource; +String *m2mfirmware_stub::string_value; + +void m2mfirmware_stub::clear() +{ + int_value = -1; + bool_value = false; + *string_value = ""; + resource = NULL; + has_value = false; +} + +M2MFirmware::M2MFirmware() +: M2MObject("5", "5") +{ + m2mfirmware_stub::string_value = new String(""); +} + +M2MFirmware::~M2MFirmware() +{ + delete m2mfirmware_stub::string_value; +} + +M2MFirmware* M2MFirmware::get_instance() +{ + return new M2MFirmware(); +} + +void M2MFirmware::delete_instance() +{ +} + +M2MResource* M2MFirmware::create_resource(FirmwareResource, const String &) +{ + return m2mfirmware_stub::resource; +} + +bool M2MFirmware::set_resource_value(FirmwareResource, + const uint8_t *, + const uint32_t) +{ + return m2mfirmware_stub::bool_value; +} + + +uint32_t M2MFirmware::resource_value_buffer(FirmwareResource, + uint8_t *&value) const +{ + if( m2mfirmware_stub::has_value ){ + value = (uint8_t *)malloc(5); + return 5; + } + return m2mfirmware_stub::int_value; +} + +bool M2MFirmware::delete_resource(FirmwareResource) +{ + return m2mfirmware_stub::bool_value; +} + +bool M2MFirmware::set_resource_value(FirmwareResource, + const String &) +{ + return m2mfirmware_stub::bool_value; +} + +bool M2MFirmware::set_resource_value(FirmwareResource, + int64_t) +{ + return m2mfirmware_stub::bool_value; +} + +String M2MFirmware::resource_value_string(FirmwareResource) const +{ + return *m2mfirmware_stub::string_value; +} + +int64_t M2MFirmware::resource_value_int(FirmwareResource) const +{ + return m2mfirmware_stub::int_value; +} + +bool M2MFirmware::is_resource_present(FirmwareResource) const +{ + return m2mfirmware_stub::bool_value; +} + +uint16_t M2MFirmware::per_resource_count(FirmwareResource) const +{ + return (uint16_t)m2mfirmware_stub::int_value; +} + +uint16_t M2MFirmware::total_resource_count() const +{ + return (uint16_t)m2mfirmware_stub::int_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mfirmware_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_FIRMWARE_STUB_H +#define M2M_FIRMWARE_STUB_H + +#include "m2mfirmware.h" + +//some internal test related stuff +namespace m2mfirmware_stub +{ + extern uint32_t int_value; + extern M2MResource* resource; + extern String *string_value; + extern bool bool_value; + void clear(); + extern bool has_value; +} + +#endif // M2M_FIRMWARE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2minterfaceimpl_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2minterfaceimpl_stub.h" +#include "common_stub.h" + +u_int8_t m2minterfaceimpl_stub::int_value; +bool m2minterfaceimpl_stub::bool_value; + +void m2minterfaceimpl_stub::clear() +{ + int_value = 0; + bool_value = false; +} + +M2MInterfaceImpl::M2MInterfaceImpl(M2MInterfaceObserver& observer, + const String &, + const String &, + const int32_t, + const uint16_t, + const String &, + M2MInterface::BindingMode mode, + M2MInterface::NetworkStack stack, + const String &) +: _observer(observer), + _current_state(0), + _max_states( STATE_MAX_STATES ), + _event_generated(false), + _event_data(NULL), + _nsdl_interface(*this), + _queue_sleep_timer(*this), + _retry_timer(*this), + _connection_handler(*this, NULL, mode, stack) +{ +} + +M2MInterfaceImpl::~M2MInterfaceImpl() +{ +} +void M2MInterfaceImpl::bootstrap(M2MSecurity *) +{ +} + +void M2MInterfaceImpl::cancel_bootstrap() +{ +} + +void M2MInterfaceImpl::register_object(M2MSecurity *, const M2MObjectList &) +{ +} + +void M2MInterfaceImpl::update_registration(M2MSecurity *, const uint32_t) +{ +} +void M2MInterfaceImpl::update_registration(M2MSecurity *, + const M2MObjectList &, + const uint32_t) +{ +} + +void M2MInterfaceImpl::unregister_object(M2MSecurity*) +{ +} + +void M2MInterfaceImpl::set_queue_sleep_handler(callback_handler) +{ + +} + +void M2MInterfaceImpl::set_platform_network_handler(void *) +{ + +} + +void M2MInterfaceImpl::set_random_number_callback(random_number_cb) +{ + +} + +void M2MInterfaceImpl::set_entropy_callback(entropy_cb) +{ + +} + +void M2MInterfaceImpl::coap_message_ready(uint8_t *, + uint16_t , + sn_nsdl_addr_s *) +{ + +} + +void M2MInterfaceImpl::client_registered(M2MServer*) +{ + +} + +void M2MInterfaceImpl::registration_error(uint8_t, bool) +{ + +} + +void M2MInterfaceImpl::client_unregistered() +{ + +} + +void M2MInterfaceImpl::bootstrap_done(M2MSecurity *) +{ + +} + +void M2MInterfaceImpl::bootstrap_wait(M2MSecurity *) +{ + +} + +void M2MInterfaceImpl::bootstrap_error() +{ + +} + +void M2MInterfaceImpl::coap_data_processed() +{ + +} + +void M2MInterfaceImpl::data_available(uint8_t*, + uint16_t, + const M2MConnectionObserver::SocketAddress &) +{ + +} + +void M2MInterfaceImpl::socket_error(uint8_t, bool) +{ + +} + +void M2MInterfaceImpl::address_ready(const M2MConnectionObserver::SocketAddress &, + M2MConnectionObserver::ServerType, + const uint16_t) +{ + +} + +void M2MInterfaceImpl::data_sent() +{ +} + +void M2MInterfaceImpl::timer_expired(M2MTimerObserver::Type) +{ + +} + +void M2MInterfaceImpl::registration_updated(const M2MServer &) +{ +} + +void M2MInterfaceImpl::value_updated(M2MBase *) +{ + +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2minterfaceimpl_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_INTERFACE_IMPL_STUB_H +#define M2M_INTERFACE_IMPL_STUB_H + +#include "m2minterfaceimpl.h" + +//some internal test related stuff +namespace m2minterfaceimpl_stub +{ + extern u_int8_t int_value; + extern bool bool_value; + void clear(); +} + +#endif // M2M_INTERFACE_IMPL_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mnsdlinterface_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mnsdlinterface_stub.h" + + +bool m2mnsdlinterface_stub::bool_value; +uint32_t m2mnsdlinterface_stub::int_value; +void * m2mnsdlinterface_stub::void_value; +String *m2mnsdlinterface_stub::string_value; + +void m2mnsdlinterface_stub::clear() +{ + bool_value = false; + int_value = 0; + *string_value = ""; + void_value = NULL; +} + +M2MNsdlInterface::M2MNsdlInterface(M2MNsdlObserver &observer) +: _observer(observer) +{ + //m2mnsdlinterface_stub::string_value = new String(""); +} + +M2MNsdlInterface::~M2MNsdlInterface() +{ + //delete m2mnsdlinterface_stub::string_value; +} + +bool M2MNsdlInterface::initialize() +{ + return m2mnsdlinterface_stub::bool_value; +} + +void M2MNsdlInterface::create_endpoint(const String &, + const String &, + const int32_t, + const String &, + const uint8_t, + const String &) +{ +} + +void M2MNsdlInterface::delete_endpoint() +{ +} + +bool M2MNsdlInterface::create_nsdl_list_structure(const M2MObjectList &) +{ + return m2mnsdlinterface_stub::bool_value; +} + +bool M2MNsdlInterface::remove_nsdl_resource(M2MBase* base) +{ + return m2mnsdlinterface_stub::bool_value; +} + +bool M2MNsdlInterface::create_bootstrap_resource(sn_nsdl_addr_s *, const String& name) +{ + return m2mnsdlinterface_stub::bool_value; +} + +bool M2MNsdlInterface::send_register_message(uint8_t*, + uint8_t, + const uint16_t, + sn_nsdl_addr_type_e) +{ + return m2mnsdlinterface_stub::bool_value; +} + +bool M2MNsdlInterface::send_update_registration(const uint32_t) +{ + return m2mnsdlinterface_stub::bool_value; +} + +bool M2MNsdlInterface::send_unregister_message() +{ + return m2mnsdlinterface_stub::bool_value; +} + +void *M2MNsdlInterface::memory_alloc(uint16_t size) +{ + return malloc(size); +} + +void M2MNsdlInterface::memory_free(void *ptr) +{ + free(ptr); + ptr = NULL; +} + +uint8_t M2MNsdlInterface::send_to_server_callback(struct nsdl_s *, + sn_nsdl_capab_e, + uint8_t *, + uint16_t, + sn_nsdl_addr_s *) +{ + return (uint8_t)m2mnsdlinterface_stub::int_value; +} + +uint8_t M2MNsdlInterface::received_from_server_callback(struct nsdl_s *, + sn_coap_hdr_s *, + sn_nsdl_addr_s *) +{ + return (uint8_t)m2mnsdlinterface_stub::int_value; +} + +uint8_t M2MNsdlInterface::resource_callback(struct nsdl_s *, + sn_coap_hdr_s *, + sn_nsdl_addr_s *, + sn_nsdl_capab_e) +{ + return (uint8_t)m2mnsdlinterface_stub::int_value; +} + + +bool M2MNsdlInterface::process_received_data(uint8_t *, + uint16_t , + sn_nsdl_addr_s *) +{ + return m2mnsdlinterface_stub::bool_value; +} + +void M2MNsdlInterface::stop_timers() +{ + +} + +void M2MNsdlInterface::timer_expired(M2MTimerObserver::Type) +{ +} + +void M2MNsdlInterface::observation_to_be_sent(M2MBase *, uint16_t, Vector<uint16_t>, bool) +{ +} + +void M2MNsdlInterface::send_delayed_response(M2MBase *) +{ +} + +void M2MNsdlInterface::resource_to_be_deleted(M2MBase *) +{ +} + +void M2MNsdlInterface::value_updated(M2MBase *, const String&) +{ +} + +void M2MNsdlInterface::remove_object(M2MBase *) +{ +} + +nsdl_s* M2MNsdlInterface::get_nsdl_handle() +{ + return (nsdl_s*) m2mnsdlinterface_stub::void_value; +} + +void M2MNsdlInterface::handle_bootstrap_put_message(sn_coap_hdr_s *coap_header, sn_nsdl_addr_s *address) +{ + +} + +void M2MNsdlInterface::handle_bootstrap_finished(sn_coap_hdr_s *coap_header,sn_nsdl_addr_s *address) +{ + +} + +void M2MNsdlInterface::handle_bootstrap_delete(sn_coap_hdr_s *coap_header,sn_nsdl_addr_s *address) +{ + +} + +bool M2MNsdlInterface::parse_bootstrap_message(sn_coap_hdr_s *coap_header, bool is_security_object) +{ + +} + +bool M2MNsdlInterface::validate_security_object() +{ + +} + +void M2MNsdlInterface::handle_bootstrap_error() +{ + +} + +const String& M2MNsdlInterface::endpoint_name() const +{ + return *m2mnsdlinterface_stub::string_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mnsdlinterface_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_NSDL_INTERFACE_STUB_H +#define M2M_NSDL_INTERFACE_STUB_H + +#include "m2mnsdlinterface.h" + +//some internal test related stuff +namespace m2mnsdlinterface_stub +{ + extern bool bool_value; + extern uint32_t int_value; + extern void* void_value; + extern String *string_value; + void clear(); +} + +#endif // M2M_NSDL_INTERFACE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mobject_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mobject_stub.h" + +u_int16_t m2mobject_stub::int_value; +bool m2mobject_stub::bool_value; +M2MObjectInstance* m2mobject_stub::inst; + +// The statically initialized object list must be bigh enough to cater +// for all the tests, or the utest framework will complain for memory leak. +M2MObjectInstanceList m2mobject_stub::instance_list(12); + +M2MBase::BaseType m2mobject_stub::base_type; +sn_coap_hdr_s *m2mobject_stub::header; + +void m2mobject_stub::clear() +{ + int_value = 0; + bool_value = false; + m2mobject_stub::base_type = M2MBase::Object; + instance_list.clear(); + header = NULL; +} + +M2MObject::M2MObject(const String &object_name, char *path, bool external_blockwise_store) +: M2MBase(object_name, + M2MBase::Dynamic, + "", + path, + external_blockwise_store), + _max_instance_count(65535) +{ + +} + +M2MObject::M2MObject(const M2MBase::lwm2m_parameters_s* static_res) +: M2MBase(static_res), + _max_instance_count(65535) +{ + +} + +M2MObject::~M2MObject() +{ +} + +M2MObjectInstance* M2MObject::create_object_instance(uint16_t instance_id) +{ + return m2mobject_stub::inst; +} + +bool M2MObject::remove_object_instance(uint16_t) +{ + return m2mobject_stub::bool_value; +} + +M2MObjectInstance* M2MObject::object_instance(uint16_t) const +{ + return m2mobject_stub::inst; +} + +const M2MObjectInstanceList& M2MObject::instances() const +{ + return m2mobject_stub::instance_list; +} + +uint16_t M2MObject::instance_count() const +{ + return m2mobject_stub::int_value; +} + +M2MBase::BaseType M2MObject::base_type() const +{ + return m2mobject_stub::base_type; +} + +void M2MObject::add_observation_level(M2MBase::Observation) +{ + +} + +void M2MObject::remove_observation_level(M2MBase::Observation) +{ + +} + +sn_coap_hdr_s* M2MObject::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mobject_stub::header; +} + +sn_coap_hdr_s* M2MObject::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &execute) +{ + execute = m2mobject_stub::bool_value; + return m2mobject_stub::header; +} + +sn_coap_hdr_s* M2MObject::handle_post_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &, + sn_nsdl_addr_s *) +{ + return m2mobject_stub::header; +} + +void M2MObject::notification_update(uint16_t obj_instance_id) +{ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mobject_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_OBJECT_STUB_H +#define M2M_OBJECT_STUB_H + +#include "m2mobject.h" +#include "m2mobjectinstance.h" + +//some internal test related stuff +namespace m2mobject_stub +{ + extern u_int16_t int_value; + extern M2MObjectInstance* inst; + extern bool bool_value; + extern M2MObjectInstanceList instance_list; + extern M2MBase::BaseType base_type; + extern sn_coap_hdr_s *header; + void clear(); +} + +#endif // M2M_OBJECT_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mobjectinstance_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mobjectinstance_stub.h" + +u_int8_t m2mobjectinstance_stub::int_value; +bool m2mobjectinstance_stub::bool_value; +M2MResource* m2mobjectinstance_stub::resource; +M2MResource* m2mobjectinstance_stub::create_resource; + +// The statically initialized list must be bigh enough to cater +// for all the tests, or the utest framework will complain for memory leak. +M2MResourceList m2mobjectinstance_stub::resource_list(12); + +M2MResourceInstance* m2mobjectinstance_stub::create_resource_instance; +sn_coap_hdr_s* m2mobjectinstance_stub::header; +M2MBase::BaseType m2mobjectinstance_stub::base_type; + + +void m2mobjectinstance_stub::clear() +{ + int_value = 0; + bool_value = false; + resource = NULL; + create_resource = NULL; + create_resource_instance = NULL; + header = NULL; + base_type = M2MBase::ObjectInstance; + resource_list.clear(); +} + +M2MObjectInstance::M2MObjectInstance(M2MObject& parent, const String &object_name, + const String &resource_type, + char *path, + bool external_blockwise_store) +: M2MBase(object_name, + M2MBase::Dynamic, + resource_type, + path, + external_blockwise_store), + _parent(parent) +{ +} + +M2MObjectInstance::M2MObjectInstance(M2MObject& parent, const lwm2m_parameters_s* static_res) +: M2MBase(static_res), _parent(parent) +{ + +} + +M2MObjectInstance::~M2MObjectInstance() +{ +} + +M2MResource* M2MObjectInstance::create_static_resource(const lwm2m_parameters_s* static_res, + M2MResourceInstance::ResourceType type) +{ + return m2mobjectinstance_stub::create_resource; +} + +M2MResource* M2MObjectInstance::create_static_resource(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + bool multiple_instance, + bool external_blockwise_store) +{ + return m2mobjectinstance_stub::create_resource; +} + +M2MResource* M2MObjectInstance::create_dynamic_resource(const lwm2m_parameters_s* static_res, + M2MResourceInstance::ResourceType type, + bool observable) +{ + return m2mobjectinstance_stub::create_resource; +} + +M2MResource* M2MObjectInstance::create_dynamic_resource(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + bool multiple_instance, + bool external_blockwise_store) +{ + return m2mobjectinstance_stub::create_resource; +} + +M2MResourceInstance* M2MObjectInstance::create_static_resource_instance(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + uint16_t instance_id, + bool external_blockwise_store) +{ + return m2mobjectinstance_stub::create_resource_instance; +} + + +M2MResourceInstance* M2MObjectInstance::create_dynamic_resource_instance(const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + uint16_t instance_id, + bool external_blockwise_store) +{ + return m2mobjectinstance_stub::create_resource_instance; +} + +bool M2MObjectInstance::remove_resource(const String &) +{ + return m2mobjectinstance_stub::bool_value; +} + +bool M2MObjectInstance::remove_resource(const char *resource_name) +{ + return m2mobjectinstance_stub::bool_value; +} + +bool M2MObjectInstance::remove_resource_instance(const String &, uint16_t) +{ + return m2mobjectinstance_stub::bool_value; +} + +M2MResource* M2MObjectInstance::resource(const String &) const +{ + return m2mobjectinstance_stub::resource; +} + +M2MResource* M2MObjectInstance::resource(const char *resource_name) const +{ + return m2mobjectinstance_stub::resource; +} + +const M2MResourceList& M2MObjectInstance::resources() const +{ + return m2mobjectinstance_stub::resource_list; +} + +uint16_t M2MObjectInstance::resource_count() const +{ + return m2mobjectinstance_stub::int_value; +} + +uint16_t M2MObjectInstance::resource_count(const String& ) const +{ + return m2mobjectinstance_stub::int_value; +} + +uint16_t M2MObjectInstance::resource_count(const char* ) const +{ + return m2mobjectinstance_stub::int_value; +} + +M2MBase::BaseType M2MObjectInstance::base_type() const +{ + return m2mobjectinstance_stub::base_type; +} + +void M2MObjectInstance::add_observation_level(M2MBase::Observation) +{ +} + +void M2MObjectInstance::remove_observation_level(M2MBase::Observation) +{ +} + +sn_coap_hdr_s* M2MObjectInstance::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mobjectinstance_stub::header; +} + +sn_coap_hdr_s* M2MObjectInstance::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &) +{ + return m2mobjectinstance_stub::header; +} + +sn_coap_hdr_s* M2MObjectInstance::handle_post_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &execute, + sn_nsdl_addr_s *) +{ + execute = m2mobjectinstance_stub::bool_value; + return m2mobjectinstance_stub::header; +} + +void M2MObjectInstance::notification_update(M2MBase::Observation) +{ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mobjectinstance_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_OBJECT_INSTANCE_STUB_H +#define M2M_OBJECT_INSTANCE_STUB_H + +#include "m2mobjectinstance.h" + +//some internal test related stuff +namespace m2mobjectinstance_stub +{ + extern u_int8_t int_value; + extern bool bool_value; + extern M2MResource *resource; + extern M2MResource* create_resource; + extern M2MResourceInstance* create_resource_instance; + extern sn_coap_hdr_s* header; + extern M2MResourceList resource_list; + extern M2MBase::BaseType base_type; + void clear(); +} + +#endif // M2M_OBJECT_INSTANCE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mreporthandler_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mreporthandler_stub.h" +#include "m2mtimer_stub.h" + +bool m2mreporthandler_stub::bool_return; +u_int8_t m2mreporthandler_stub::int_value; + +void m2mreporthandler_stub::clear() +{ + bool_return = false; + int_value = 0; +} + +M2MReportHandler::M2MReportHandler(M2MReportObserver &observer) +: _observer(observer), + _pmin_timer(*this), + _pmax_timer(*this) +{ +} + +M2MReportHandler::~M2MReportHandler() +{ +} + +void M2MReportHandler::set_under_observation(bool) +{ +} + +void M2MReportHandler::set_value(float) +{ +} + +bool M2MReportHandler::parse_notification_attribute(const char *, + M2MBase::BaseType, + M2MResourceInstance::ResourceType resource_type) +{ + return m2mreporthandler_stub::bool_return; +} + +void M2MReportHandler::timer_expired(M2MTimerObserver::Type ) +{ +} + +void M2MReportHandler::set_notification_trigger(uint16_t) +{ +} + +void M2MReportHandler::set_default_values() +{ +} + +uint8_t M2MReportHandler::attribute_flags() +{ + return m2mreporthandler_stub::int_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mreporthandler_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_REPORT_HANDLER_STUB_H +#define M2M_REPORT_HANDLER_STUB_H + +#include "m2mreporthandler.h" + +//some internal test related stuff +namespace m2mreporthandler_stub +{ + extern bool bool_return; + extern u_int8_t int_value; + void clear(); +} + +#endif // M2M_REPORT_HANDLER_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mresource_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mresource_stub.h" + +uint32_t m2mresource_stub::int_value; +uint8_t* m2mresource_stub::delayed_token; +uint8_t m2mresource_stub::delayed_token_len; +bool m2mresource_stub::bool_value; +// The statically initialized list must be bigh enough to cater +// for all the tests, or the utest framework will complain for memory leak. +M2MResourceInstanceList m2mresource_stub::list(12); + +M2MResourceInstance *m2mresource_stub::instance; +M2MObjectInstance *m2mresource_stub::object_instance; +sn_coap_hdr_s *m2mresource_stub::header; +void m2mresource_stub::clear() +{ + int_value = 0; + delayed_token = NULL; + delayed_token_len = 0; + bool_value = false; + list.clear(); + instance = NULL; + object_instance = NULL; +} + +M2MResource::M2MResource(M2MObjectInstance &parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + char* path, + const uint16_t object_instance_id, + bool multiple_instance, + bool external_blockwise_store) +: M2MResourceInstance(*this, resource_name, resource_type, type, value, value_length, object_instance_id, + path, external_blockwise_store), + _parent(parent), + _delayed_token(NULL), + _delayed_token_len(0), + _has_multiple_instances(multiple_instance), + _delayed_response(false) +{ + +} + +M2MResource::M2MResource(M2MObjectInstance &parent, + const lwm2m_parameters_s* s, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id) +: M2MResourceInstance(*this, s, type, object_instance_id), + _parent(parent), + _delayed_token(NULL), + _delayed_token_len(0), + _has_multiple_instances(false), + _delayed_response(false) +{ + // tbd: _has_multiple_instances could be in flash, but no real benefit, because of current alignment. +} + +M2MResource::M2MResource(M2MObjectInstance &parent, + const String &resource_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + bool observable, + char *path, + const uint16_t object_instance_id, + bool multiple_instance, + bool external_blockwise_store) +: M2MResourceInstance(*this, resource_name, resource_type, type, + object_instance_id, path, external_blockwise_store), + _parent(parent), + _delayed_token(NULL), + _delayed_token_len(0), + _has_multiple_instances(multiple_instance), + _delayed_response(false) +{ + +} + +M2MResource::~M2MResource() +{ +} + +bool M2MResource::supports_multiple_instances() const +{ + return m2mresource_stub::bool_value; +} + +void M2MResource::get_delayed_token(unsigned char *&token, unsigned char &token_len) +{ + token_len = 0; + if(token) { + free(token); + token = NULL; + } + token = (uint8_t *)malloc(m2mresource_stub::delayed_token_len); + if(token) { + token_len = m2mresource_stub::delayed_token_len; + memcpy((uint8_t *)token, (uint8_t *)m2mresource_stub::delayed_token, token_len); + } +} + +bool M2MResource::remove_resource_instance(uint16_t inst_id) +{ + return m2mresource_stub::bool_value; +} + +M2MResourceInstance* M2MResource::resource_instance(uint16_t inst_id) const +{ + return m2mresource_stub::instance; +} + +const M2MResourceInstanceList& M2MResource::resource_instances() const +{ + return m2mresource_stub::list; +} + +uint16_t M2MResource::resource_instance_count() const +{ + return m2mresource_stub::int_value; +} + +bool M2MResource::handle_observation_attribute(const char *query) +{ + return m2mresource_stub::bool_value; +} + +void M2MResource::add_resource_instance(M2MResourceInstance *) +{ +} + +void M2MResource::add_observation_level(M2MBase::Observation) +{ +} + +void M2MResource::remove_observation_level(M2MBase::Observation) +{ +} + +void M2MResource::notification_update() +{ +} + +sn_coap_hdr_s* M2MResource::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mresource_stub::header; +} + +sn_coap_hdr_s* M2MResource::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &) +{ + return m2mresource_stub::header; +} + +sn_coap_hdr_s* M2MResource::handle_post_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &, sn_nsdl_addr_s *) +{ + return m2mresource_stub::header; +} + +M2MObjectInstance& M2MResource::get_parent_object_instance() const +{ + return *m2mresource_stub::object_instance; +} + +const char* M2MResource::object_name() const +{ + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mresource_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_RESOURCE_STUB_H +#define M2M_RESOURCE_STUB_H + +#include "m2mresource.h" + +//some internal test related stuff +namespace m2mresource_stub +{ + extern uint32_t int_value; + extern uint8_t* delayed_token; + extern uint8_t delayed_token_len; + extern bool bool_value; + extern M2MResourceInstanceList list; + extern M2MResourceInstance *instance; + extern M2MObjectInstance *object_instance; + void clear(); + extern sn_coap_hdr_s *header; +} + +#endif // M2M_RESOURCE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mresourceinstance_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mresourceinstance_stub.h" + +uint32_t m2mresourceinstance_stub::int_value; +bool m2mresourceinstance_stub::bool_value; +String *m2mresourceinstance_stub::string_value; +M2MResourceInstance::ResourceType m2mresourceinstance_stub::resource_type; +sn_coap_hdr_s *m2mresourceinstance_stub::header; +uint8_t* m2mresourceinstance_stub::value; +M2MBase::BaseType m2mresourceinstance_stub::base_type; + + +void m2mresourceinstance_stub::clear() +{ + int_value = 0; + bool_value = false; + resource_type = M2MResourceInstance::STRING; + header = NULL; + value = NULL; + base_type = M2MBase::ResourceInstance; + string_value = NULL; +} + +M2MResourceInstance::M2MResourceInstance(M2MResource &parent, + const String &res_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id, + char* path, + bool external_blockwise_store) +: M2MBase(res_name, + M2MBase::Dynamic, + resource_type, + path, + external_blockwise_store), + _parent_resource(parent), + _value(NULL), + _value_length(0), + _block_message_data(NULL), + _execute_callback(NULL), + _resource_callback(NULL), + _execute_function_pointer(NULL), + _notification_sent_function_pointer(NULL), + _notification_sent_callback(NULL), + _object_instance_id(object_instance_id), + _resource_type(type) +{ + +} + +M2MResourceInstance::M2MResourceInstance(M2MResource &parent, + const String &res_name, + const String &resource_type, + M2MResourceInstance::ResourceType type, + const uint8_t *value, + const uint8_t value_length, + const uint16_t object_instance_id, + char* path, + bool external_blockwise_store) +: M2MBase(res_name, + M2MBase::Static, + resource_type, + path, + external_blockwise_store), + _parent_resource(parent), + _value(NULL), + _value_length(0), + _block_message_data(NULL), + _execute_callback(NULL), + _resource_callback(NULL), + _execute_function_pointer(NULL), + _notification_sent_function_pointer(NULL), + _notification_sent_callback(NULL), + _object_instance_id(object_instance_id), + _resource_type(type) +{ +} + +M2MResourceInstance::M2MResourceInstance(M2MResource &parent, + const lwm2m_parameters_s* s, + M2MResourceInstance::ResourceType type, + const uint16_t object_instance_id) +: M2MBase(s), + _parent_resource(parent), + _value(NULL), + _value_length(0), + _block_message_data(NULL), + _execute_callback(NULL), + _resource_callback(NULL), + _execute_function_pointer(NULL), + _notification_sent_function_pointer(NULL), + _object_instance_id(object_instance_id), + _resource_type(type) +{ +} + +M2MResourceInstance::~M2MResourceInstance() +{ +} + +M2MBase::BaseType M2MResourceInstance::base_type() const +{ + return m2mresourceinstance_stub::base_type; +} + +M2MResourceInstance::ResourceType M2MResourceInstance::resource_instance_type() const +{ + return m2mresourceinstance_stub::resource_type; +} + +bool M2MResourceInstance::handle_observation_attribute(const char *) +{ + return m2mresourceinstance_stub::bool_value; +} + +void M2MResourceInstance::set_execute_function(execute_callback) +{ +} + +bool M2MResourceInstance::set_value(const uint8_t *, + const uint32_t ) +{ + return m2mresourceinstance_stub::bool_value; +} + +bool M2MResourceInstance::set_value(int64_t value) +{ + return m2mresourceinstance_stub::bool_value; +} + + +void M2MResourceInstance::clear_value() +{ + if (m2mresourceinstance_stub::value) { + free(m2mresourceinstance_stub::value); + m2mresourceinstance_stub::value = NULL; + m2mresourceinstance_stub::int_value = 0; + } +} + +void M2MResourceInstance::execute(void *) +{ +} + +void M2MResourceInstance::get_value(uint8_t *&value, uint32_t &value_length) +{ + value_length = 0; + if(value) { + free(value); + value = NULL; + } + value = (uint8_t *)malloc(m2mresourceinstance_stub::int_value); + if(value) { + value_length = m2mresourceinstance_stub::int_value; + memcpy((uint8_t *)value, (uint8_t *)m2mresourceinstance_stub::value, value_length); + } +} + +int M2MResourceInstance::get_value_int() +{ + // Note: this is a copy-paste from the original version, as the tests + // set only m2mresourceinstance_stub::value. + + int value_int = 0; + // Get the value and convert it into integer. This is not the most + // efficient way, as it takes pointless heap copy to get the zero termination. + uint8_t* buffer = NULL; + uint32_t length; + get_value(buffer,length); + if(buffer) { + value_int = atoi((const char*)buffer); + free(buffer); + } + return value_int; +} + +String M2MResourceInstance::get_value_string() const +{ + // XXX: do a better constructor to avoid pointless malloc + String value; + if (m2mresourceinstance_stub::value) { + value.append_raw((char*)m2mresourceinstance_stub::value, m2mresourceinstance_stub::int_value); + } + + return value; +} + +uint8_t* M2MResourceInstance::value() const +{ + return m2mresourceinstance_stub::value; +} + +uint32_t M2MResourceInstance::value_length() const +{ + return m2mresourceinstance_stub::int_value; +} + +sn_coap_hdr_s* M2MResourceInstance::handle_get_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *) +{ + return m2mresourceinstance_stub::header; +} + +sn_coap_hdr_s* M2MResourceInstance::handle_put_request(nsdl_s *, + sn_coap_hdr_s *, + M2MObservationHandler *, + bool &) +{ + return m2mresourceinstance_stub::header; +} + +void M2MResourceInstance::set_resource_observer(M2MResourceCallback *callback) +{ + +} + +uint16_t M2MResourceInstance::object_instance_id() const +{ + return m2mresourceinstance_stub::int_value; +} + +void M2MResourceInstance::set_execute_function(execute_callback_2 callback) +{ +} + +M2MBlockMessage* M2MResourceInstance::block_message() const +{ + +} + +void M2MResourceInstance::set_incoming_block_message_callback(incoming_block_message_callback callback) +{ +} + +void M2MResourceInstance::set_outgoing_block_message_callback(outgoing_block_message_callback callback) +{ + +} + +void M2MResourceInstance::set_notification_sent_callback(notification_sent_callback callback) +{ +} + +void M2MResourceInstance::set_notification_sent_callback(notification_sent_callback_2 callback) +{ +} + +void M2MResourceInstance::notification_sent() +{ +} + +const char* M2MResourceInstance::object_name() const +{ + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mresourceinstance_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_RESOURCE_INSTANCE_STUB_H +#define M2M_RESOURCE_INSTANCE_STUB_H + +#include "m2mresourceinstance.h" + +//some internal test related stuff +namespace m2mresourceinstance_stub +{ + extern uint32_t int_value; + extern uint8_t* value; + extern bool bool_value; + extern String *string_value; + extern M2MResourceInstance::ResourceType resource_type; + extern M2MBase::BaseType base_type; + extern sn_coap_hdr_s *header; + void clear(); +} + +#endif // M2M_RESOURCE_INSTANCE_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2msecurity_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2msecurity_stub.h" + +bool m2msecurity_stub::has_value; +uint32_t m2msecurity_stub::int_value; +uint32_t m2msecurity_stub::sec_mode; +bool m2msecurity_stub::bool_value; +String *m2msecurity_stub::string_value; +M2MResource* m2msecurity_stub::resource; + +void m2msecurity_stub::clear() +{ + has_value = false; + int_value = -1; + bool_value = false; + string_value = NULL; + resource = NULL; +} + +M2MSecurity::M2MSecurity(ServerType ser_type) +: M2MObject("0", stringdup("0")), + _server_type(ser_type), + _server_instance(NULL) +{ +} + +M2MSecurity::~M2MSecurity() +{ +} + +M2MResource* M2MSecurity::create_resource(SecurityResource, uint32_t) +{ + return m2msecurity_stub::resource; +} + +bool M2MSecurity::delete_resource(SecurityResource) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + const String &) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + uint32_t) +{ + return m2msecurity_stub::bool_value; +} + +bool M2MSecurity::set_resource_value(SecurityResource, + const uint8_t *, + const uint16_t) +{ + return m2msecurity_stub::bool_value; +} + +String M2MSecurity::resource_value_string(SecurityResource) const +{ + return *m2msecurity_stub::string_value; +} + +uint32_t M2MSecurity::resource_value_buffer(SecurityResource, + uint8_t *&value) const +{ + if( m2msecurity_stub::has_value ){ + value = (uint8_t *)malloc(5); + return 5; + } + return m2msecurity_stub::int_value; +} + +uint32_t M2MSecurity::resource_value_buffer(SecurityResource, + const uint8_t *&value) const +{ + if( m2msecurity_stub::has_value ){ + value = NULL; + return 5; + } + return m2msecurity_stub::int_value; +} + +uint32_t M2MSecurity::resource_value_int(SecurityResource res) const +{ + if (res == M2MSecurity::SecurityMode) { + return m2msecurity_stub::sec_mode; + } + else if(res == M2MSecurity::BootstrapServer) { + return m2msecurity_stub::bool_value; + } + else { + return m2msecurity_stub::int_value; + } +} + +bool M2MSecurity::is_resource_present(SecurityResource) const +{ + return m2msecurity_stub::bool_value; +} + +uint16_t M2MSecurity::total_resource_count() const +{ + return (uint16_t)m2msecurity_stub::int_value; +} + +M2MSecurity::ServerType M2MSecurity::server_type() const +{ + return _server_type; +} + +void M2MSecurity::clear_resources() +{ + +} + +M2MResource* M2MSecurity::get_resource(SecurityResource res) const +{ + return m2msecurity_stub::resource; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2msecurity_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_SECURITY_STUB_H +#define M2M_SECURITY_STUB_H + +#include "m2msecurity.h" + +//some internal test related stuff +namespace m2msecurity_stub +{ + extern bool has_value; + extern uint32_t int_value; + extern uint32_t sec_mode; + extern bool bool_value; + extern String *string_value; + extern M2MResource* resource; + void clear(); +} + +#endif // M2M_SECURITY_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mserver_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mserver_stub.h" + +uint32_t m2mserver_stub::int_value; +bool m2mserver_stub::bool_value; +M2MResource* m2mserver_stub::resource; + +void m2mserver_stub::clear() +{ + int_value = 0; + bool_value = false; + resource = NULL; +} + +M2MServer::M2MServer() +: M2MObject("1", "1") +{ +} + +M2MServer::~M2MServer() +{ +} + +M2MResource* M2MServer::create_resource(ServerResource, uint32_t) +{ + return m2mserver_stub::resource; +} + +M2MResource* M2MServer::create_resource(ServerResource) +{ + return m2mserver_stub::resource; +} + +bool M2MServer::delete_resource(ServerResource) +{ + return m2mserver_stub::bool_value; +} + +bool M2MServer::set_resource_value(ServerResource, + const String &) +{ + return m2mserver_stub::bool_value; +} + +bool M2MServer::set_resource_value(ServerResource, + uint32_t) +{ + return m2mserver_stub::bool_value; +} + +String M2MServer::resource_value_string(ServerResource) const +{ + return String(""); +} + + +uint32_t M2MServer::resource_value_int(ServerResource) const +{ + return m2mserver_stub::int_value; +} + +bool M2MServer::is_resource_present(ServerResource) const +{ + return m2mserver_stub::bool_value; +} + +uint16_t M2MServer::total_resource_count() const +{ + return (uint16_t)m2mserver_stub::int_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mserver_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_SERVER_STUB_H +#define M2M_SERVER_STUB_H + +#include "m2mserver.h" +#include "m2mresource.h" + +//some internal test related stuff +namespace m2mserver_stub +{ + extern uint32_t int_value; + extern bool bool_value; + extern String *string_value; + extern M2MResource* resource; + void clear(); +} + +#endif // M2M_SERVER_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mstring_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mstring.h" +#include <string.h> // strlen +#include <stdlib.h> // malloc, realloc +#include <assert.h> +#include <algorithm> // min + +namespace m2m { + +const String::size_type String::npos = static_cast<size_t>(-1); + +char* String::strdup(const char* s) +{ + const size_t len = strlen(s)+1; + char *p2 = static_cast<char*>(malloc(len)); + memcpy(p2, s, len); + allocated_ = len; + size_ = len-1; + return p2; +} + +String::String() + : p( strdup("") ) +{ +} + +String::~String() +{ + free(p); + p = 0; +} + +String::String(const String& s) + : p(0) +{ + if( &s != NULL ) { + p = static_cast<char*>(malloc(s.size_ + 1)); + + allocated_ = s.size_ + 1; + size_ = s.size_; + memcpy(p, s.p, size_ + 1); + } +} + +String::String(const char* s) + : p(strdup(s)) +{ +} + +String::String(const char* str, size_t n) +{ + p = static_cast<char*>(malloc(n + 1)); + + allocated_ = n + 1; + size_ = n; + memcpy(p, str, n); + p[n] = 0; +} + +String& String::operator=(const char* s) +{ + if ( p != s ) { + // s could point into our own string, so we have to allocate a new string + const size_t len = strlen(s); + char* copy = (char*) malloc( len + 1); + memmove(copy, s, len+1); // trailing 0 + free( p ); + p = copy; + size_ = len; + allocated_ = len+1; + } + return *this; +} + +String& String::operator=(const String& s) +{ + return operator=(s.p); +} + +String& String::operator+=(const String& s) +{ + if (s.size_ > 0) { + this->reserve(size_ + s.size_); + memmove(p+size_, s.p, s.size_+1); // trailing 0 + size_ += s.size_; + } + return *this; +} + +// since p and s may overlap, we have to copy our own string first +String& String::operator+=(const char* s) +{ + const size_type lens = strlen(s); + if (lens > 0) { + if (size_ + lens + 1 <= allocated_) { + memmove(p+size_, s, lens+1); // trailing 0 + size_ += lens; + } else { + String s2( *this ); // copy own data + s2.reserve(size_ + lens); + memmove(s2.p+size_, s, lens+1); // trailing 0 + s2.size_ = size_ + lens; + this->swap( s2 ); + } + } + return *this; +} + +String& String::operator+=(const char c) +{ + push_back(c); + return *this; +} + +void String::push_back(const char c) { + + if (size_ == allocated_ - 1) { + size_t more = (allocated_* 3) / 2; // factor 1.5 + if ( more < 4 ) more = 4; + reserve( size_ + more ); + } + + p[size_] = c; + size_++; + p[size_] = 0; +} + +bool String::operator==(const char* s) const +{ + if( s == NULL ) { + if( p == NULL ) { + return true; + } + return false; + } + bool ret = strcmp(p, s); + return !ret; +} + +bool String::operator==(const String& s) const +{ + bool ret = strcmp(p, s.p); + return !ret; +} + +void String::clear() +{ + size_ = 0; + p[0] = 0; +} + +String String::substr(const size_type pos, size_type length) const +{ + String s; + const size_type len = size_; + + if ( pos <= len ) { + + size_type remain = len - pos; + + if ( length > remain ) + length = remain; + + s.reserve( length ); + + memcpy(s.p, p + pos, length); + s.p[length] = '\0'; + s.size_ = length; + } + return s; +} + + +// checked access, accessing the NUL at end is allowed +char String::at(const size_type i) const +{ + if ( i <= strlen(p) ) { + return p[i]; + } else { + return '\0'; + } +} + +String& String::erase(size_type pos, size_type len) +{ + if (len > 0) { + + if ( pos < size_ ) { // user must not remove trailing 0 + + size_type s2 = size_; + size_type remain = s2 - pos - len; + + if (remain > 0) { + // erase by overwriting + memmove(p + pos, p + pos + len, remain); + } + + //if ( remain < 0 ) remain = 0; + + // remove unused space + this->resize( pos+remain ); + + } + } + return *this; +} + +String& String::append( const char* str, size_type n) { + if (str && n > 0) { + size_t lens = strlen(str); + if (n > lens) + n = lens; + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +String& String::append_raw( const char* str, size_type n) { + if (str && n > 0) { + size_t newlen = size_ + n; + this->reserve( newlen ); + memmove(p+size_, str, n); // p and s.p MAY overlap + p[newlen] = 0; // add NUL termination + size_ = newlen; + } + return *this; +} + +void String::append_int(int param) { + + // max len of "-9223372036854775808" plus zero termination + char conv_buff[20+1]; + + int len = itoa_c(param, conv_buff); + append_raw(conv_buff, len); +} + +int String::compare( size_type pos, size_type len, const String& str ) const { + int r = -1; + if (pos <= size_) { + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = str.size(); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str.p, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::compare( size_type pos, size_type len, const char* str ) const { + int r = -1; + if (pos <= size_) { + + if ( len > size_ - pos) + len = size_ - pos; // limit len to available length + + const size_type osize = strlen(str); + const size_type len2 = std::min(len, osize); + r = strncmp( p + pos, str, len2); + if (r==0) // equal so far, now compare sizes + r = len < osize ? -1 : ( len == osize ? 0 : +1 ); + } + return r; +} + +int String::find_last_of(char c) const { + int r = -1; + char *v; + v = strrchr(p,c); + if (v != NULL) { + r = 0; + char* i = p; + while (v != i) { + i++; + r++; + } + } + return r; +} + +void String::new_realloc( size_type n) { + if (n > 0 ) { + char* pnew = static_cast<char*>(realloc(p, n)); // could return NULL + if (pnew) + p = pnew; + } +} + +void String::reserve( const size_type n) { + if (n >= allocated_ ) { + this->new_realloc(n + 1); + allocated_ = n + 1; + } +} + +void String::resize( const size_type n) { + this->resize( n, 0 ); +} + +void String::resize( const size_type n, const char c) { + if (n < size_ ) { + p[n] = 0; + size_ = n; + } + else if (n > size_ ) { + this->reserve( n ); + for (size_type i=size_; i < n; ++i ) + p[i] = c; + p[n] = 0; + size_ = n; + } +} + +void String::swap( String& s ) { + std::swap( allocated_, s.allocated_ ); + std::swap( size_, s.size_ ); + std::swap( p, s.p ); +} + + +// Comparison +bool operator<( const String& s1, const String& s2 ) { + return strcmp( s1.c_str(), s2.c_str() ) < 0; +} + +void reverse(char s[], uint32_t length) +{ + uint32_t i, j; + char c; + + for (i = 0, j = length-1; i<j; i++, j--) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } +} + +uint32_t itoa_c (int64_t n, char s[]) +{ + int64_t sign; + uint32_t i; + + if ((sign = n) < 0) + n = -n; + + i = 0; + + do { + s[i++] = n % 10 + '0'; + } + while ((n /= 10) > 0); + + if (sign < 0) + s[i++] = '-'; + + s[i] = '\0'; + + m2m::reverse(s, i); + return i; +} + +uint8_t* String::convert_integer_to_array(int64_t value, uint8_t &size, uint8_t *array, uint32_t array_size) +{ + uint8_t* buffer = NULL; + size = 0; + if (array) { + value = String::convert_array_to_integer(array, array_size); + } + + if(value < 0xFF) { + size = 1; + } else if(value < 0xFFFF) { + size = 2; + } else if(value < 0xFFFFFF) { + size = 3; + } else if(value < 0xFFFFFFFF) { + size = 4; + } else if(value < 0xFFFFFFFFFF) { + size = 5; + } else if(value < 0xFFFFFFFFFFFF) { + size = 6; + } else if(value < 0xFFFFFFFFFFFFFF) { + size = 7; + } else { + size = 8; + } + + buffer = (uint8_t*)malloc(size); + if (buffer) { + for (int i = 0; i < size; i++) { + buffer[i] = (value >> ((size - i - 1) * 8)); + } + } else { + size = 0; + } + return buffer; +} + +int64_t String::convert_array_to_integer(uint8_t *value, uint32_t size) +{ + int64_t temp_64 = 0; + for (int i = size - 1; i >= 0; i--) { + temp_64 += (uint64_t)(*value++) << i * 8; + } + return temp_64; +} + +} // namespace
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mstringbufferbase_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#include "m2mstringbufferbase_stub.h" + +bool StringBufferBase::ensure_space(size_t max_size, size_t required_size) const +{ + +} + +bool StringBufferBase::append(char *buff, size_t max_size, char data) +{ + +} + +bool StringBufferBase::append(char *buff, size_t max_size, const char *data) +{ + +} + +bool StringBufferBase::append(char *buff, size_t max_size, const char *data, size_t data_len) +{ + +} + +bool StringBufferBase::append_int(char *buff, size_t max_size, uint16_t data) +{ + +} + +int StringBufferBase::find_last_of(const char *buff, char search_char) const +{ + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mstringbufferbase_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ + +#ifndef M2MSTRINGBUFFERBASE_STUB_H +#define M2MSTRINGBUFFERBASE_STUB_H + +#include "m2mstringbufferbase.h" + +#endif // M2MSTRINGBUFFERBASE_STUB_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mtimer_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "CppUTestExt/MockSupport.h" +#include <stdio.h> +#include "m2mtimer_stub.h" + +bool m2mtimer_stub::bool_value; +bool m2mtimer_stub::total_bool_value; +bool m2mtimer_stub::enable_mock; + +void m2mtimer_stub::clear() +{ + bool_value = false; + total_bool_value = false; + enable_mock = false; +} + +M2MTimer::M2MTimer(M2MTimerObserver& observer) +: _observer(observer) +{ +} + +M2MTimer::~M2MTimer() +{ +} + +void M2MTimer::start_timer(uint64_t /*interval*/, + M2MTimerObserver::Type /*type*/, + bool /*single_shot*/) +{ + if (m2mtimer_stub::enable_mock) { + mock().actualCall("start_timer").onObject(this); + } +} + +void M2MTimer::start_dtls_timer(uint64_t , uint64_t , M2MTimerObserver::Type ) +{ + if (m2mtimer_stub::enable_mock) { + mock().actualCall("start_dtls_timer").onObject(this); + } +} + +void M2MTimer::stop_timer() +{ + if (m2mtimer_stub::enable_mock) { + mock().actualCall("stop_timer").onObject(this); + } +} + + +bool M2MTimer::is_intermediate_interval_passed(){ + return m2mtimer_stub::bool_value; +} + +bool M2MTimer::is_total_interval_passed(){ + return m2mtimer_stub::total_bool_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mtimer_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TIMER_STUB_H +#define M2M_TIMER_STUB_H + +#include "m2mtimer.h" + +//some internal test related stuff +namespace m2mtimer_stub +{ + extern bool bool_value; + extern bool total_bool_value; + extern bool enable_mock; + void clear(); +} + +#endif // M2M_TIMER_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mtlvdeserializer_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mtlvdeserializer_stub.h" + +bool m2mtlvdeserializer_stub::bool_value; +bool m2mtlvdeserializer_stub::is_object_bool_value; +M2MTLVDeserializer::Error m2mtlvdeserializer_stub::error; +uint16_t m2mtlvdeserializer_stub::int_value; + +void m2mtlvdeserializer_stub::clear() +{ + bool_value = false; + is_object_bool_value = false; + error = M2MTLVDeserializer::None; + int_value = 0; +} + +M2MTLVDeserializer::M2MTLVDeserializer() +{ +} + +M2MTLVDeserializer::~M2MTLVDeserializer() +{ +} + +bool M2MTLVDeserializer::is_object_instance(uint8_t *) +{ + return m2mtlvdeserializer_stub::is_object_bool_value; +} + +bool M2MTLVDeserializer::is_resource(uint8_t *) +{ + return m2mtlvdeserializer_stub::bool_value; +} + +bool M2MTLVDeserializer::is_multiple_resource(uint8_t *) +{ + return m2mtlvdeserializer_stub::bool_value; +} + +bool M2MTLVDeserializer::is_resource_instance(uint8_t *) +{ + return m2mtlvdeserializer_stub::bool_value; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resources(uint8_t*, + uint32_t, + M2MObjectInstance &, + M2MTLVDeserializer::Operation ) +{ + return m2mtlvdeserializer_stub::error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialize_resource_instances(uint8_t *, + uint32_t, + M2MResource &, + M2MTLVDeserializer::Operation ) +{ + return m2mtlvdeserializer_stub::error; +} + +M2MTLVDeserializer::Error M2MTLVDeserializer::deserialise_object_instances(uint8_t*, + uint32_t , + M2MObject &, + M2MTLVDeserializer::Operation) +{ + return m2mtlvdeserializer_stub::error; +} + +TypeIdLength* TypeIdLength::createTypeIdLength(uint8_t *, uint32_t) +{ + TypeIdLength *til = new TypeIdLength(); + return til; +} + +TypeIdLength* TypeIdLength::deserialize() +{ + return this; +} + +void TypeIdLength::deserialiseID(uint32_t idLength) +{ +} + +void TypeIdLength::deserialiseLength(uint32_t lengthType) +{ +} + +uint16_t M2MTLVDeserializer::instance_id(uint8_t *tlv) +{ + return m2mtlvdeserializer_stub::int_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mtlvdeserializer_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TLV_DESERIALIZER_STUB_H +#define M2M_TLV_DESERIALIZER_STUB_H + +#include "m2mtlvdeserializer.h" + +//some internal test related stuff +namespace m2mtlvdeserializer_stub +{ + extern bool bool_value; + extern uint16_t int_value; + extern bool is_object_bool_value; + extern M2MTLVDeserializer::Error error; + void clear(); +} + +#endif // M2M_TLV_DESERIALIZER_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mtlvserializer_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "m2mtlvserializer_stub.h" + +uint8_t* m2mtlvserializer_stub::uint8_value; + +void m2mtlvserializer_stub::clear() +{ + uint8_value = NULL; +} + +M2MTLVSerializer::M2MTLVSerializer() +{ +} + +M2MTLVSerializer::~M2MTLVSerializer() +{ +} + +uint8_t* M2MTLVSerializer::serialize(M2MObjectInstanceList object_instance_list, uint32_t &) +{ + return m2mtlvserializer_stub::uint8_value; +} + +uint8_t* M2MTLVSerializer::serialize(M2MResourceList resource_list, uint32_t &size) +{ + return m2mtlvserializer_stub::uint8_value; +} + +uint8_t* M2MTLVSerializer::serialize(M2MResource *, uint32_t &) +{ + return m2mtlvserializer_stub::uint8_value; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/m2mtlvserializer_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef M2M_TLV_SERIALIZER_STUB_H +#define M2M_TLV_SERIALIZER_STUB_H + +#include "m2mtlvserializer.h" + +//some internal test related stuff +namespace m2mtlvserializer_stub +{ + extern uint8_t* uint8_value; + void clear(); +} + +#endif // M2M_TLV_SERIALIZER_STUB_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/nsdlaccesshelper_stub.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include "nsdlaccesshelper_stub.h" + +bool nsdlaccesshelper_stub::bool_value; +void* nsdlaccesshelper_stub::void_value; +uint8_t nsdlaccesshelper_stub::int_value; + +M2MNsdlInterfaceList __nsdl_interface_list; +M2MConnectionHandler *__connection_handler = NULL; +#ifdef USE_LINUX +M2MTimerImpl *__timer_impl = NULL; +M2MConnectionHandler *__connection_impl = NULL; +#endif +void nsdlaccesshelper_stub::clear() +{ + bool_value = false; + void_value = NULL; + int_value = 0; +} + +uint8_t __nsdl_c_callback(struct nsdl_s * , + sn_coap_hdr_s *, + sn_nsdl_addr_s *, + sn_nsdl_capab_e ) +{ + return nsdlaccesshelper_stub::int_value; +} + +void *__nsdl_c_memory_alloc(uint16_t) +{ + return nsdlaccesshelper_stub::void_value; +} + +void __nsdl_c_memory_free(void *) +{ +} + +uint8_t __nsdl_c_send_to_server(struct nsdl_s * , + sn_nsdl_capab_e , + uint8_t *, + uint16_t , + sn_nsdl_addr_s *) +{ + return nsdlaccesshelper_stub::int_value; +} + +uint8_t __nsdl_c_received_from_server(struct nsdl_s * , + sn_coap_hdr_s *, + sn_nsdl_addr_s *) +{ + return nsdlaccesshelper_stub::int_value; +} + +void *__socket_malloc( void *, size_t) +{ +return nsdlaccesshelper_stub::void_value; +} + +void __socket_free(void *, void *) +{ +} + +void __mutex_claim() +{ +} + +void __mutex_release() +{ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient/utest/stub/nsdlaccesshelper_stub.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef NSDLACCESSHELPER_STUB_H +#define NSDLACCESSHELPER_STUB_H + +#include "nsdlaccesshelper.h" + +//some internal test related stuff +namespace nsdlaccesshelper_stub +{ + extern bool bool_value; + extern void *void_value; + extern uint8_t int_value; + void clear(); +} +#endif // NSDLACCESSHELPER_STUB_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient_linux/Makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,17 @@ +PLATFORM= +OS = LINUX +TARGET = mbedclient_linux +OBJECTS = main.o +CFLAGS = -std=c++11 -Wall -D_REENTRANT -D$(OS) -I ../../lwm2m-client -I ../../source/include -I ../../../../libService/libService -I ../../ -DTARGET_LIKE_LINUX -DHAVE_DEBUG +LDFLAGS = -D_REENTRANT -L../../ -lmbedclient_gcc -L ../../../../nsdl-c -lnsdl_gcc -L ../../../../libService -lservice_gcc -L ../../../../mbedtls/library -lmbedtls -lmbedx509 -lmbedcrypto -lpthread +all: $(TARGET) + +$(TARGET): $(OBJECTS) + $(PLATFORM)g++ -g -o $(TARGET) $(OBJECTS) $(LDFLAGS) + +.cpp.o: + $(PLATFORM)g++ -c -g -O2 $(CFLAGS) $< + +clean: + rm -f $(TARGET) $(OBJECTS) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/mbedclient_linux/main.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#include <unistd.h> +#include <malloc.h> +#include <stdio.h> +#include <stdarg.h> +#include <pthread.h> +#include <signal.h> /* For SIGIGN and SIGINT */ +#include "mbed-client/m2minterfacefactory.h" +#include "mbed-client/m2mdevice.h" +#include "mbed-client/m2minterfaceobserver.h" +#include "mbed-client/m2minterface.h" +#include "mbed-client/m2mobjectinstance.h" +#include "mbed-client/m2mresource.h" + +#include "mbed-trace/mbed_trace.h" + +const String &BOOTSTRAP_SERVER_ADDRESS = "coap://10.45.3.10:5693"; +const String &M2M_SERVER_ADDRESS = "coap://10.45.3.10:5683"; +const String &MANUFACTURER = "manufacturer"; +const String &TYPE = "type"; +const String &MODEL_NUMBER = "2015"; +const String &SERIAL_NUMBER = "12345"; + +const uint8_t STATIC_VALUE[] = "Open Mobile Alliance"; + +static void ctrl_c_handle_function(void); +void close_function(); +typedef void (*signalhandler_t)(int); /* Function pointer type for ctrl-c */ + +class MbedClient: public M2MInterfaceObserver { +public: + MbedClient(){ + _security = NULL; + _interface = NULL; + _register_security = NULL; + _device = NULL; + _object = NULL; + _bootstrapped = false; + _error = false; + _registered = false; + _unregistered = false; + _registration_updated = false; + _value = 0; + } + + ~MbedClient() { + if(_security) { + delete _security; + } + if(_register_security){ + delete _register_security; + } + if(_device) { + M2MDevice::delete_instance(); + _device = NULL; + } + if(_object) { + delete _object; + } + if(_interface) { + delete _interface; + } + } + + bool create_interface() { + _interface = M2MInterfaceFactory::create_interface(*this, + "linux-endpoint", + "test", + 60, + 5683, + "", + M2MInterface::UDP, + M2MInterface::LwIP_IPv4, + ""); + printf("Endpoint Name : linux-endpoint\n"); + return (_interface == NULL) ? false : true; + } + + bool bootstrap_successful() { + while(!_bootstrapped && !_error) { + sleep(1); + } + return _bootstrapped; + } + + bool register_successful() { + while(!_registered && !_error) { + sleep(1); + } + return _registered; + } + + bool unregister_successful() { + while(!_unregistered && !_error) { + sleep(1); + } + return _unregistered; + } + + bool registration_update_successful() { + while(!_registration_updated && !_error) { + } + return _registration_updated; + } + + bool create_bootstrap_object() { + bool success = false; + if(_security) { + delete _security; + } + _security = M2MInterfaceFactory::create_security(M2MSecurity::Bootstrap); + if(_security) { + if(_security->set_resource_value(M2MSecurity::M2MServerUri, BOOTSTRAP_SERVER_ADDRESS) && + _security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity)) { + success = true; + /* Not used now because there is no TLS or DTLS implementation available for stack. + security->set_resource_value(M2MSecurity::ServerPublicKey,certificates->certificate_ptr[0],certificates->certificate_len[0]); + security->set_resource_value(M2MSecurity::PublicKey,certificates->certificate_ptr[1],certificates->certificate_len[1]); + security->set_resource_value(M2MSecurity::Secretkey,certificates->own_private_key_ptr,certificates->own_private_key_len); + */ + } + } + printf("Bootstrap Server Address %s\n", BOOTSTRAP_SERVER_ADDRESS.c_str()); + return success; + } + + bool create_register_object() { + bool success = false; + _register_security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); + if(_register_security) { + if(_register_security->set_resource_value(M2MSecurity::M2MServerUri, M2M_SERVER_ADDRESS) && + _register_security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity)) { + success = true; + /* Not used now because there is no TLS or DTLS implementation available for stack. + security->set_resource_value(M2MSecurity::ServerPublicKey,certificates->certificate_ptr[0],certificates->certificate_len[0]); + security->set_resource_value(M2MSecurity::PublicKey,certificates->certificate_ptr[1],certificates->certificate_len[1]); + security->set_resource_value(M2MSecurity::Secretkey,certificates->own_private_key_ptr,certificates->own_private_key_len); + */ + } + } + return success; + } + + void test_bootstrap() { + _interface->bootstrap(_security); + } + + bool create_device_object() { + bool success = false; + _device = M2MInterfaceFactory::create_device(); + if(_device) { + _device->object_instance()->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + if(_device->create_resource(M2MDevice::Manufacturer,MANUFACTURER) && + _device->create_resource(M2MDevice::DeviceType,TYPE) && + _device->create_resource(M2MDevice::ModelNumber,MODEL_NUMBER) && + _device->create_resource(M2MDevice::SerialNumber,SERIAL_NUMBER)) { + success = true; + } + } + return success; + } + + void execute_function(void *argument) { + if(argument) { + char* arguments = (char*)argument; + printf("Received %s!!\n", arguments); + } + printf("I am executed !!\n"); + } + + bool create_generic_object() { + bool success = false; + _object = M2MInterfaceFactory::create_object("10"); + if(_object) { + _object->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + M2MObjectInstance* inst = _object->create_object_instance(); + if(inst) { + inst->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + inst->set_observable(false); + char buffer[20]; + int size = sprintf(buffer,"%d",_value); + + inst->create_static_resource("0", + "ResourceTest", + M2MResourceInstance::INTEGER, + STATIC_VALUE, + sizeof(STATIC_VALUE)-1); + + M2MResourceInstance* instance = inst->create_dynamic_resource_instance("1", + "ResourceTest", + M2MResourceInstance::INTEGER, + true,0); + + if(instance) { + instance->set_operation(M2MBase::GET_PUT_POST_ALLOWED); + instance->set_value((const uint8_t*)buffer, + (const uint32_t)size); + instance->set_execute_function(execute_callback(this,&MbedClient::execute_function)); + _value++; + } + } + } + return success; + } + + void update_resource() { + if(_object) { + M2MObjectInstance* inst = _object->object_instance(); + if(inst) { + M2MResource* res = inst->resource("1"); + res = inst->resource("1"); + if(res) { + M2MResourceInstance *res_inst = res->resource_instance(0); + if(res_inst) { + char buffer1[20]; + int size1 = sprintf(buffer1,"%d",_value); + res_inst->set_value((const uint8_t*)buffer1, + (const uint32_t)size1); + _value++; + } + } + } + } + } + + void test_register(){ + M2MObjectList object_list; + object_list.push_back(_device); + object_list.push_back(_object); + + _interface->register_object(_register_security,object_list); + } + + void test_update_register() { + uint32_t updated_lifetime = 20; + _registered = false; + _unregistered = false; + _interface->update_registration(_register_security,updated_lifetime); + } + + void test_unregister() { + _interface->unregister_object(NULL); + } + + void bootstrap_done(M2MSecurity *server_object){ + if(server_object) { + _register_security = server_object; + _bootstrapped = true; + printf("\nBootstrapped\n"); + printf("mDS Address %s\n", + _register_security->resource_value_string(M2MSecurity::M2MServerUri).c_str()); + } + } + + void object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){ + _registered = true; + printf("\nRegistered\n"); + } + + void object_unregistered(M2MSecurity */*server_object*/){ + _unregistered = true; + printf("\nUnregistered\n"); + } + + void registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/){ + _registration_updated = true; + printf("\nregistration updated\n"); + + } + + void error(M2MInterface::Error error){ + _error = true; + close_function(); + printf("\nError occured Error Code : %d\n", (int8_t)error); + + } + + void value_updated(M2MBase *base, M2MBase::BaseType type) { + printf("\nValue updated of Object name %s and Type %d\n", + base->name(), type); + } + +private: + + M2MInterface *_interface; + M2MSecurity *_security; + M2MSecurity *_register_security; + M2MDevice *_device; + M2MObject *_object; + bool _bootstrapped; + bool _error; + bool _registered; + bool _unregistered; + bool _registration_updated; + int _value; +}; + +void* wait_for_bootstrap(void* arg) { + MbedClient *client; + client = (MbedClient*) arg; + if(client->bootstrap_successful()) { + printf("Registering endpoint\n"); + client->test_register(); + } + return NULL; +} + +void* wait_for_unregister(void* arg) { + MbedClient *client; + client = (MbedClient*) arg; + if(client->unregister_successful()) { + printf("Unregistered done --> exiting\n"); + close_function(); + } + return NULL; +} + +void* send_observation(void* arg) { + MbedClient *client; + client = (MbedClient*) arg; + static uint8_t counter = 0; + while(1) { + sleep(1); + if(counter >= 5 && + client->register_successful()) { + printf("Sending observation\n"); + client->update_resource(); + counter = 0; + } + else + counter++; + } + return NULL; +} + +static MbedClient *m2mclient = NULL; + +static void ctrl_c_handle_function(void) +{ + if(m2mclient && m2mclient->register_successful()) { + printf("Unregistering endpoint\n"); + m2mclient->test_unregister(); + } +} + +void trace_printer(const char* str) +{ + printf("%s\r\n", str); +} + +static pthread_t bootstrap_thread; +static pthread_t unregister_thread; +static pthread_t observation_thread; + +void close_function() { + pthread_cancel(bootstrap_thread); + pthread_cancel(unregister_thread); + pthread_cancel(observation_thread); +} + +int main() { + + MbedClient mbed_client; + + m2mclient = &mbed_client; + + mbed_trace_init(); + mbed_trace_print_function_set( trace_printer ); + mbed_trace_config_set(TRACE_MODE_COLOR|TRACE_ACTIVE_LEVEL_DEBUG|TRACE_CARRIAGE_RETURN); + + signal(SIGINT, (signalhandler_t)ctrl_c_handle_function); + + bool result = mbed_client.create_interface(); + if(true == result) { + printf("\nInterface created\n"); + } + result = mbed_client.create_bootstrap_object(); + if(true == result) { + printf("Bootstrap object created"); + } + + result = mbed_client.create_register_object(); + if(true == result) { + printf("Register object created"); + } + + result = mbed_client.create_device_object(); + if(true == result){ + printf("\nDevice object created !!\n"); + } + + result = mbed_client.create_generic_object(); + + if(true == result) { + printf("\nGeneric object created\n"); + } + +// printf("Bootstrapping endpoint\n"); +// mbed_client.test_bootstrap(); + + printf("Registering endpoint\n"); + mbed_client.test_register(); + + + pthread_create(&bootstrap_thread, NULL, &wait_for_bootstrap, (void*) &mbed_client); + pthread_create(&observation_thread, NULL, &send_observation, (void*) &mbed_client); + pthread_create(&unregister_thread, NULL, &wait_for_unregister, (void*) &mbed_client); + + pthread_join(bootstrap_thread, NULL); + pthread_join(unregister_thread, NULL); + pthread_join(observation_thread, NULL); + + exit(EXIT_SUCCESS); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/version_check.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,58 @@ +#!/bin/bash +# Copyright (c) 2015 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. + +echo +echo "Check version in module json" +echo +echo $1 +echo $2 + +function version_gt() { + test "$(echo "$@" | tr " " "\n" | sort -V | tail -n 1)" == "$1"; +} + +git clone $1 $PWD/master +git clone $1 $PWD/pull_req +pushd $PWD/pull_req +git checkout $2 +popd +if [ ! -e "$PWD/master/module.json" ] +then + echo "$PWD/master/module.json not found." + exit 1 +fi +if [ ! -e "$PWD/pull_req/module.json" ] +then + echo "$PWD/pull_req/module.json not found." + exit 1 +fi + +OLD_VERSION=`sed -n 's#version##p' master/module.json | sed 's|[^0-9]*\([0-9\.]*\)|\1 |g'` +NEW_VERSION=`sed -n 's#version##p' pull_req/module.json | sed 's|[^0-9]*\([0-9\.]*\)|\1 |g'` + +echo "Version in master branch: $OLD_VERSION" +echo "New version: $NEW_VERSION" + +if [[ "$OLD_VERSION" != "$NEW_VERSION" ]]; then + if version_gt $NEW_VERSION $OLD_VERSION; then + exit 0 + else + echo "Update version in module.json!" + exit 1 +fi +else + echo "Update version in module.json!" + exit 1 +fi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/xsl_script.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (c) 2015 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. + +echo +echo "Creating report" +echo + +echo '<?xml version="1.0" encoding="UTF-8" ?> +<?xml-stylesheet type="text/xsl" href="junit_xsl.xslt"?> +<list>' >> lcov/index.xml + +for f in lcov/results/*.xml +do +name=${f##*/} +echo '<entry name="results/'"$name"'" />'>> lcov/index.xml +done + +echo '</list>' >> lcov/index.xml + +echo +echo "Report created to lcov/index.xml (outputs html)" +echo \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#269f58d75b752a4e67a6a2d8c5c698635ffd6752
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_app.json Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,9 @@ +{ + "macros": ["MBEDTLS_USER_CONFIG_FILE=\"mbedtls_mbed_client_config.h\""], + "target_overrides": { + "*": { + "target.features_add": ["NANOSTACK", "LOWPAN_ROUTER", "COMMON_PAL"], + "mbed-trace.enable": 0 + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_client_config.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef MBED_CLIENT_CONFIG_H +#define MBED_CLIENT_CONFIG_H + + +// Defines the number of times client should try re-connection towards +// Server in case of connectivity loss , also defines the number of CoAP +// re-transmission attempts.Default value is 3 +#define M2M_CLIENT_RECONNECTION_COUNT 3 + +// Defines the interval (in seconds) in which client should try re-connection towards +// Server in case of connectivity loss , also use the same interval for CoAP +// re-transmission attempts. Default value is 5 seconds +#define M2M_CLIENT_RECONNECTION_INTERVAL 5 + +// Defines the keep-alive interval (in seconds) in which client should send keep alive +// pings to server while connected through TCP mode. Default value is 300 seconds +#define M2M_CLIENT_TCP_KEEPALIVE_TIME 300 + +// Defines the maximum CoAP messages that client can hold, maximum value is 6 +#define SN_COAP_DUPLICATION_MAX_MSGS_COUNT 2 + +// Defines the size of blockwise CoAP messages that client can handle. +// The values that can be defined uust be 2^x and x is at least 4. +// Suitable values: 0, 16, 32, 64, 128, 256, 512 and 1024 +#define SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE 1024 + +// Many pure LWM2M servers doen't accept 'obs' text in registration message. +// While using Client against such servers, this flag can be set to define to +// disable client sending 'obs' text for observable resources. +#undef COAP_DISABLE_OBS_FEATURE + +// Disable Bootstrap functionality in client in order to reduce code size, if bootstrap +// functionality is not required. +#undef M2M_CLIENT_DISABLE_BOOTSTRAP_FEATURE + +#endif // MBED_CLIENT_CONFIG_H +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbedtls_mbed_client_config.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,111 @@ +/** + * Minimal configuration for using mbedtls as part of mbed-client + * + * NOTE! This is an optimized, minimal configuration for mbed Client. + * We know it works with mbed Client but if you want to add more + * services/communications to the application yourself - please ensure + * you update this configuration accordingly. The default configuration + * can be found from mbedTLS Github: + * + * https://github.com/ARMmbed/mbedtls/blob/development/include/mbedtls/config.h + * + * + * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * 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. + * + * This file is part of mbed TLS (https://tls.mbed.org) + */ + + +#ifndef MBEDTLS_CUSTOM_CONFIG_H +#define MBEDTLS_CUSTOM_CONFIG_H + +/* System support */ +#define MBEDTLS_HAVE_ASM + +/* mbed TLS feature support */ +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED +#define MBEDTLS_ECP_NIST_OPTIM +#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH +#define MBEDTLS_SSL_PROTO_TLS1_2 +#define MBEDTLS_SSL_PROTO_DTLS +#define MBEDTLS_SSL_DTLS_ANTI_REPLAY +#define MBEDTLS_SSL_DTLS_HELLO_VERIFY +#define MBEDTLS_SSL_EXPORT_KEYS + +/* mbed TLS modules */ +#define MBEDTLS_AES_C +#define MBEDTLS_ASN1_PARSE_C +#define MBEDTLS_ASN1_WRITE_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_CIPHER_C +#define MBEDTLS_CTR_DRBG_C +#define MBEDTLS_ECP_C +#define MBEDTLS_ENTROPY_C +#define MBEDTLS_MD_C +#define MBEDTLS_OID_C +#define MBEDTLS_PK_C +#define MBEDTLS_PK_PARSE_C +#define MBEDTLS_SHA256_C +#define MBEDTLS_SSL_COOKIE_C +#define MBEDTLS_SSL_CLI_C +#define MBEDTLS_SSL_SRV_C +#define MBEDTLS_SSL_TLS_C + +// XXX mbedclient needs these: mbedtls_x509_crt_free, mbedtls_x509_crt_init, mbedtls_x509_crt_parse +#define MBEDTLS_X509_USE_C +#define MBEDTLS_X509_CRT_PARSE_C + +// XXX: clean these up!! +#define MBEDTLS_SHA512_C +#define MBEDTLS_ECDH_C +#define MBEDTLS_GCM_C + +#define MBEDTLS_ECDH_C +#define MBEDTLS_ECDSA_C +#define MBEDTLS_X509_CRT_PARSE_C + +// Remove RSA, save 20KB at total +#undef MBEDTLS_RSA_C +#undef MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED + +// Remove error messages, save 10KB of ROM +#undef MBEDTLS_ERROR_C + +// Remove selftesting and save 11KB of ROM +#undef MBEDTLS_SELF_TEST + +// Reduces ROM size by 30 kB +#undef MBEDTLS_ERROR_STRERROR_DUMMY +#undef MBEDTLS_VERSION_FEATURES +#undef MBEDTLS_DEBUG_C + +// needed for parsing the certificates +#define MBEDTLS_PEM_PARSE_C +// dep of the previous +#define MBEDTLS_BASE64_C + +// Reduce IO buffer to save RAM, default is 16KB +#define MBEDTLS_SSL_MAX_CONTENT_LEN 2048 + +// define to save 8KB RAM at the expense of ROM +#undef MBEDTLS_AES_ROM_TABLES + +// Save ROM and a few bytes of RAM by specifying our own ciphersuite list +#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + +#include "mbedtls/check_config.h" + +#endif /* MBEDTLS_CUSTOM_CONFIG_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/metronome.hpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,37 @@ +#pragma once + +#include "mbed.h" + +class metronome +{ +public: + enum { beat_samples = 30 }; + +public: + metronome() + : m_timing(false), m_beat_count(0) {} + ~metronome() {} + +public: + // Call when entering "learn" mode + void start_timing(); + // Call when leaving "learn" mode + void stop_timing(); + + // Should only record the current time when timing + // Insert the time at the next free position of m_beats + void tap(); + + bool is_timing() const { return m_timing; } + // Calculate the BPM from the deltas between m_beats + // Return 0 if there are not enough samples + size_t get_bpm() const; + +private: + bool m_timing; + Timer m_timer; + + // Insert new samples at the end of the array, removing the oldest + size_t m_beats[beat_samples]; + size_t m_beat_count; +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal.lib Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/pal/#4e46c0ea870631bb5bec3e4aa9fd7eebf3db21f0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/FETCH_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,6 @@ +03d26ec0975c752144e16bd70585782481fe8eca not-for-merge branch 'ARCH_A9_fix' of https://github.com/ARMmbed/pal +3b664c8bb1384fb1ef244821d054814fbbecf51b not-for-merge branch 'PAL-R0.8-IAR-build-fixes' of https://github.com/ARMmbed/pal +f6ed72fe831dc05c511cd055d4967537b6e7d953 not-for-merge branch 'feature-mbed-os-bootloader' of https://github.com/ARMmbed/pal +dd3291844bc556bbed39038074d9151b94dcbc31 not-for-merge branch 'iar_fixes' of https://github.com/ARMmbed/pal +6e21a6901c5346681b091a70b865dd787311e255 not-for-merge branch 'master' of https://github.com/ARMmbed/pal +066663c08f1f43bf88f0298be59221031d59a3bb not-for-merge branch 'releaseCandidate' of https://github.com/ARMmbed/pal
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +4e46c0ea870631bb5bec3e4aa9fd7eebf3db21f0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/ORIG_HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +3d4cbd817dd6e9887e7237e2cc1106af28dfee53
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/config Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = https://github.com/ARMmbed/pal/ +[branch "master"] + remote = origin + merge = refs/heads/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/description Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/applypatch-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/post-update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/pre-applypatch.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/pre-commit.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against --
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/pre-rebase.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/prepare-commit-msg.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/hooks/update.sample Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0
Binary file pal/.git/index has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/info/exclude Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,25 @@ +.hg +.git +.svn +.CVS +.cvs +*.orig +.build +.export +.msub +.meta +.ctags* +*.uvproj +*.uvopt +*.project +*.cproject +*.launch +*.ewp +*.eww +Makefile +Debug +*.htm +*.settings +mbed_settings.py +*.py[cod] +# subrepo ignores \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/logs/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 3d4cbd817dd6e9887e7237e2cc1106af28dfee53 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189594 +0000 clone: from https://github.com/ARMmbed/pal/ +3d4cbd817dd6e9887e7237e2cc1106af28dfee53 4e46c0ea870631bb5bec3e4aa9fd7eebf3db21f0 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189599 +0000 checkout: moving from master to 4e46c0ea870631bb5bec3e4aa9fd7eebf3db21f0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/logs/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 3d4cbd817dd6e9887e7237e2cc1106af28dfee53 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189594 +0000 clone: from https://github.com/ARMmbed/pal/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/logs/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 3d4cbd817dd6e9887e7237e2cc1106af28dfee53 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1487189594 +0000 clone: from https://github.com/ARMmbed/pal/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/logs/refs/remotes/origin/feature-mbed-os-bootloader Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 f6ed72fe831dc05c511cd055d4967537b6e7d953 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787105 +0000 fetch --append origin: storing head
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/logs/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +3d4cbd817dd6e9887e7237e2cc1106af28dfee53 6e21a6901c5346681b091a70b865dd787311e255 www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787105 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/logs/refs/remotes/origin/releaseCandidate Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +8f8f330213245fd1072de2fa9aa04d709e235f8d 066663c08f1f43bf88f0298be59221031d59a3bb www-data <www-data@developer-sjc-cyan-compiler.local.mbed.org> 1494787105 +0000 fetch --append origin: fast-forward
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/04/d87ba5082bc784ca06cd13f6a51cd4f69c121f Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +x¥AjÃ0E»Ö)fjf$Y @Ð3FvYAÈÜ>îºù|üÇVë6@»ùcôµõKdñvÎ!hKB)(Dk¢êÉ=¹ 9JnN68à Ñ949ó¢ÅiÑ6)>ÆÚ:|+øjë×Ö³´é 9ýùØöé·ì÷:I«7 ë}@KäáQô¼;ò¿EêØ·ñÑàç¯AéÂóMÔþ¹R$ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/06/6663c08f1f43bf88f0298be59221031d59a3bb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x¥AjÄ0E»Î)´/ ãØe èdY!¦=¸¿éºùïñ¥g`=½® +äPc ´ÄDÞZ^ÐD¿"ç3%AÌ)0=¸k`\!ñj¢M¢6^2.ç%»Í ÅmâçØ[Ï˶_{k]¥íïÐÛ·£Ôùk«3÷sv¾ºô^5fºèuwè¿C¥G9ø8à{áQZýЪèô¨äS \ No newline at end of file
Binary file pal/.git/objects/06/84b32ebf7fabd69c8bdb3c56d97685262820db has changed
Binary file pal/.git/objects/0a/623a5d927d1e04046a1aa6b8e9874971455089 has changed
Binary file pal/.git/objects/12/af13d947ec075010d17dd5f9f39f7016ba6ad1 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/14/1d1228d0b26cd5819ad991f52415e12faebe2e Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +xu=kÄ0DSëWl0ú°dB¸îR¥KVÒêl°%£¬üûÈ\nf&Ö}_´Õ/Ü@ POÞd´ü4i£8k¥AÌÙÄk6*ÖéÆ|2+£ÇÑI«MÌ~ö1¸@ÙzHàÉKmðI 6¸×BÞʳ«Þ°íC¬û;¨ÑOÎÏÎ(xZJÑ×~©Á}å3t³6:¶ßÛcååÿhâëHÈnÃ"¦tÅï¸ëÃ\ìQ[ \ No newline at end of file
Binary file pal/.git/objects/1b/14ca66e28b7bb20e24e24490a9aae5b608bc3a has changed
Binary file pal/.git/objects/1b/b1a2783fa5fe87720bb6ec92e903aaff3cbb6e has changed
Binary file pal/.git/objects/1b/c418838a48712455bf0df98d88d7db5c9d7177 has changed
Binary file pal/.git/objects/1f/c8c2debb15689ab6c09b0888249df884a2645a has changed
Binary file pal/.git/objects/1f/e4c0f9d8d5bcf6a00e41f2ae5c0d20b66b98b5 has changed
Binary file pal/.git/objects/27/0ac960fcf9f8b22d02dc6f6eadf82e80e35337 has changed
Binary file pal/.git/objects/27/28a4846dc845efb28b7da673042349ffb08fa7 has changed
Binary file pal/.git/objects/2b/0048b38bf3c9b6fee94a5f74af172e26146a2e has changed
Binary file pal/.git/objects/2c/90fccebcf95a52065d08adcbe16390aca7773c has changed
Binary file pal/.git/objects/2d/30617c7df5cac847353e697c49ce48f9a12db1 has changed
Binary file pal/.git/objects/31/f24a1997ed7b7707c3591d87f090df30f511cf has changed
Binary file pal/.git/objects/36/b0301a67424f61eb6777f986feda845082a663 has changed
Binary file pal/.git/objects/39/aa2bd33df273ed1c3ab90540d3c8c59b548ad5 has changed
Binary file pal/.git/objects/3a/cbc99b7436d7f8520570609360d276fc5a58d3 has changed
Binary file pal/.git/objects/41/99d5cbf06a4a0de2197d308e8943a14db60a8a has changed
Binary file pal/.git/objects/43/d63a797d636512689f078b923b889b88dfaad3 has changed
Binary file pal/.git/objects/44/c32d95c5fe3a50f96ff7aa7e5e246bb00958d1 has changed
Binary file pal/.git/objects/45/d17feaa479e48e9e7197454a786dfc388d3df5 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/51/4822948b991ca7155550f739d21c221f001ab8 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,7 @@ +xTaoÚH½¯Ä9 +.`tÕ]Dwg5 +ô¢¶²{·µw}»kúßoÆ6 ¨i¥òyvföÍ·o©þþbøç¶[.\ªb§Å:µÐº0¾ñâ®D.,0Î2¨Î hn¸Þ`ê7ûW"âÒð¾siE"¸~ ãE)ïCJk2b(eÌ5Ø7 ûÜrmС¦¦{;UBÎvÔH*¥áØAHDÆßG¼° $D*/2ÁdÄa+lZÝÒ4©°ÞÕm@,ÃtÅTrÌâ5tSjmñÒó¶ÛíU³^{Y=ªñ®üËé,6RÁ̸!zþ+ æ1¬vÀ +±ÂÌضÖϬ"À[-¬ëØ-ÓÚÄÂX-V%Ò~ÀV3àÔ È0ÀàbøAÞúËæ7Kjõv¼XgKÀ|óÙÄ_úó~ýãÙ¼ögpä +wÂïܬ!xÜ/ÙÛÏéÛ<ÂUG8\lÍa6\K +®saháÅ%#!1[ 5p°¯Ýj·N²2æàä+¼?uBçIÆLÚÿ¨J-YÖGåë]ß ß$;yUFØdûð1cþyØÑX¥y£²2çýIüÒ^ëpØkE騧Ýâ÷yçÒA X°»kd¾^G=¦4¢i"wz°Q"«KoqÉ5Ýźݳ£UÞr,ÃeaÐ4<ü{1¿y.nf³é¢.ûQ¶ÊüdQÑ'n.j·<÷úb: ¯üÅxqÞN +NG±(|˨+Zz_øm0\TÄH ódå9ÕvÛ-À_P¯ñ¶Úâu½D¤vÚ|á¬'\Æ"!IJ¬±Ón}©ÿIâþ×oi;>#ÊøJ°Ú-Úþ=!À^ 8tíQ%xïj¡À+øâ ï8=§¿q¾b÷zBcû¤ãiôó^¿ÝO$&IV´cl¬JKÁ:ü¨N#>stê{ºÞÑç»án¯Ð>¾áö±¯çÁ,ü[Û¡a.@K4$Ý¡½ãs@§û$Õ¶)ä ør!Ñ*»GØ°e¡Ö&%r1t~o?¾ëºÓÙP®[Qâ«^x5<ç§Ã!þ=Þ-JKo°óìþÙwiªv÷?AM[¢ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/56/2dd43aa8f00f1324460523cf898cb6bef580be Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +xu»NÄ0E©ó#Q"?âØZD±4KÁ=l¤Ä^§àïñ +QRÞÇÑÕy]ç +Zû»ZA{DHkÕL2j^^.LïLwÅ©ÔÇ@NZ¢½sÒURGåhd6ú¯ÈK¼6ÑJé¢ê¶²C/2õa¡¥Bt¸×K.ðÁ/pÊ<§_ynòe=ļ¾ì¬ÚÁPnn»U¹Ài®ï{hd.|]¾Ó\/{øëÎ\&ë¾,Pøkç½10¼Âëçy LO Æß0ÑLX¹ëhNÄq«mj[ñ1o?RÍlÓ \ No newline at end of file
Binary file pal/.git/objects/57/d514337c05c4ca663dcb55ff08f9a632088e5e has changed
Binary file pal/.git/objects/5e/05eaab5e70d3de44d3547f79de1c28efa27116 has changed
Binary file pal/.git/objects/5f/e34cdcd60115341e18205c5562c59eb053260e has changed
Binary file pal/.git/objects/62/1c4f0f434edd6a7ed9524bb7a6e2e358933fcb has changed
Binary file pal/.git/objects/63/09e650b1c997ba700fb1c6c7bdfa9439b55d1b has changed
Binary file pal/.git/objects/63/2eef20e82266827bb43bfb9401e22e7a176bbb has changed
Binary file pal/.git/objects/64/9a360ec36a568171bbbd35c2dcc1bde9a6ed3c has changed
Binary file pal/.git/objects/67/c0e9ec76c9e49b87ece01a997e5878ff15be3e has changed
Binary file pal/.git/objects/6b/f008ab01f5bde81b311bb0ecb819b0ffc5c08b has changed
Binary file pal/.git/objects/6d/5127ea553d9b40dc423d29a492f6ec0de7af3f has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/6e/21a6901c5346681b091a70b865dd787311e255 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xAjÄ0EgíSh_86¥ô&²£tBÆvp]hoßô +ݽÿàÃË}e](%»·É¼iX)yÍÑjD'²m.ÿ sJ×:`Ue&Õ³µÞqL~%0³×0ç,¼¯ñhN=êþ÷®qHÕú&½L¹W xAh.{%ý×Ù¼K>`4 Ö÷½ÊÖöýUNæbÕN× \ No newline at end of file
Binary file pal/.git/objects/70/ca5a6030ae5f141acad2cc1356340754d7ebd2 has changed
Binary file pal/.git/objects/71/7c8ce9be91c1f22d6c3ca3589f7de026c10850 has changed
Binary file pal/.git/objects/72/3f052fa4758b1263e8ddb767a7bc89cbb5bda3 has changed
Binary file pal/.git/objects/73/8164c356ed7c19cbe6dc85543fd64fca356fcb has changed
Binary file pal/.git/objects/74/39becfc7573f0c8ee8c01a38e52733e4b7337c has changed
Binary file pal/.git/objects/75/73e8310fc71981cb556dd1d3910af8f58f4381 has changed
Binary file pal/.git/objects/79/94aff3766daa9ecc02d56fba83193cc48d0bfe has changed
Binary file pal/.git/objects/7a/a36e96c0ea8c719d6dcfad103cc59bdf7225e7 has changed
Binary file pal/.git/objects/7e/1757ab28022604645eb9e93bb9c649184c8164 has changed
Binary file pal/.git/objects/7e/4f2b1bed9959c48ec9b1bda88a62d4c373e803 has changed
Binary file pal/.git/objects/82/1147f696dacfafb82b82b4182ab495b7e620ea has changed
Binary file pal/.git/objects/8f/832f3736943410ef686862637b5a05b7469002 has changed
Binary file pal/.git/objects/91/84a5f0427525a0654811a154dcb5751904526e has changed
Binary file pal/.git/objects/93/62db27cd7cbae3b0ea4223d924a285efce5dd7 has changed
Binary file pal/.git/objects/94/1e87c7e938b9622a31086519746d9bc11db877 has changed
Binary file pal/.git/objects/96/f17adb4d6b4429ff47476fa516e669dac0a984 has changed
Binary file pal/.git/objects/97/018fd2be99f6bf10450a3d2ac9c9b8972e0b7e has changed
Binary file pal/.git/objects/9a/ced387fbd122230a988f8f741bc5e144562339 has changed
Binary file pal/.git/objects/a0/3069f795bf10c59b9df451980a722f59cfa9e6 has changed
Binary file pal/.git/objects/a1/9db3cabd42d88d7dc84ff9765250599e071996 has changed
Binary file pal/.git/objects/a2/487bac845e9b103b3aafd0cfa91dcc30043b69 has changed
Binary file pal/.git/objects/a3/e4f058129e64b92cb4bf5d5b2d0cbb76bde8f2 has changed
Binary file pal/.git/objects/a7/4153faf91f10a6f2838ed899a7b79c05219b91 has changed
Binary file pal/.git/objects/ad/f1eca266abc112b7e000c1b04083776cee4b13 has changed
Binary file pal/.git/objects/b0/cfd4f430a130befb0b2b788ce17c8ccd507a3f has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/b8/15f0161d65d4963ad006603eb370e72c62c24d Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +x] +Â0}Î)ö]ÍÏ&[<gXÓÔL#1õü¦Wðeøø%祱|h5% 0vÖ]ïíDÓ< âAæDI½¥¦µÁ Ù MèL Ck-Ü®Ò:2>)ÙÚ\*Ü»·2÷<Χ¸óUjî/ 3ëà#DÕÛ~°¥?T%ãßòÚr,«<ûH+õ£~)IÏ \ No newline at end of file
Binary file pal/.git/objects/bc/30957f59dda098a412fb4e2913a0b35b166cf8 has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/bd/0ffd824c34b6afa65328f6fd35de31c943e2d2 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +x QËNÃ0ä)ÿÀ9(ê@§"àXù±%nØÊ:(\øvvÒ#²3³;µcí¾\¯Ö²¨rUB'ÂQPE¦ø¤HÆ0Û;È3À`´iÊZu¢2- +q>k>D}x·&á½)»vê5Í©n¸&Y'Eö3#'¿òÜJ}j7òªo©½-Îe&áÇpf|YUYÜOÎÛº,¸öíU f'Õá£óx¹/¤cÒÓ³¥,Ä(²È½()ïÇ Rª_çÝ>1£w¾±£¨Öo»ÕõÍmýr·4Ëãü2ÿ9ÿpç¿Â/jEY +΢ò3x+ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/bd/919b935c7118c24537627641baed4bfcbb9300 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +xÎAj1@Ñ®} +íKmÙc Ð]w¹,iÒ@mǹ³èºýðàËhí¶ âö²¦àΫ"êA®»ÏÉ+ +IÞkNÄÝOëPT¥PT7ÛÅ¢H~ã#f?Ö×p±Åݾ?G·ïÝÖut>x¶7í!QÙ!%xõÑ{÷¬ÏÁeÿ¤%S Ô±ê_AûÓ` hÕô4îîFRKu \ No newline at end of file
Binary file pal/.git/objects/be/6828b02d6d26fd82f58315138fc7633d8511bb has changed
Binary file pal/.git/objects/c4/4b94a18ecb815c85a26c111b146676e2edf242 has changed
Binary file pal/.git/objects/cc/e9ed86ba36082aa4609e90162c27d8fa0302b2 has changed
Binary file pal/.git/objects/de/e4410a7004e64226349b6d1aa8546e85ccae86 has changed
Binary file pal/.git/objects/e0/9a40d9d4ba33e0dba5fc054065205c9bbf26f5 has changed
Binary file pal/.git/objects/e6/a6d0f87ee89c5bd1b5c9cd1daf93c5d0e3ddd8 has changed
Binary file pal/.git/objects/f2/c9be9728da2139625d0bd50652c81943ba274f has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/f3/b70449f8877f8f35f8bbac066da2eb9ff0e08c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +x+)JMU0¶4c040031QJMLÉMÕËMa°üàì×>-FR]$÷Q½M²ÛNÖûPE9zÅ)ÃÞÖH~v§5Äþÿ)ÓüÓñÉiÅ%ùE©@ Bë oº¿a¸X{õççùb»²."+ÌÏKËL/-J,ÉÌÏ*?p¶Ègobô +Óä)-§®Ö}X½IyjQQ~Q1PÝë©9{.ªäï©4s»1ºÜÄä¢|:fÑ;b7®güà£)VÂû I]^jIy~Q6PáÆh9µîÅ4âeì_¾hβWZH +JÀÆåʯ:É®55ådÇA¦Cä8ø ©*©,HÙêÙ"muéÎ¥K»NjÄèüù 3áä$e¥)% ÀÉûn¡ÆÂy±!ùAmE¹YÛ Ç \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/objects/f6/ed72fe831dc05c511cd055d4967537b6e7d953 Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +xAnÅ D»æ¾@¿0 HUUõ¹æ +¾zû²øR¥®ºkÞxÆ9Çà ^Za0;iÐ[MhêÙO&Wkæy\»ÄI ÷8¢G¥«×-yk1h5¢fTxeÅ®¶«Vø¼ZâogeNûqÏÓÍù½çÉ8K¯rRôk/غý¨=#>Q±ðÈõQê_ÇUvJPÛQ±m@bâú]g!j[ÿÓ6Úáªq¿ÿÛñdC,ùÑ÷CÌtçÚÍ$~£nâm' \ No newline at end of file
Binary file pal/.git/objects/f7/81fa201e87b84d468defd8317d1b19828655eb has changed
Binary file pal/.git/objects/f7/c081d95a19fb5ed68fa80ceeeb9995e74b80c3 has changed
Binary file pal/.git/objects/pack/pack-b7b7a1a2d6d9b677998305fae8f7f08d7209824a.idx has changed
Binary file pal/.git/objects/pack/pack-b7b7a1a2d6d9b677998305fae8f7f08d7209824a.pack has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/packed-refs Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ +# pack-refs with: peeled +03d26ec0975c752144e16bd70585782481fe8eca refs/remotes/origin/ARCH_A9_fix +3b664c8bb1384fb1ef244821d054814fbbecf51b refs/remotes/origin/PAL-R0.8-IAR-build-fixes +dd3291844bc556bbed39038074d9151b94dcbc31 refs/remotes/origin/iar_fixes +3d4cbd817dd6e9887e7237e2cc1106af28dfee53 refs/remotes/origin/master +8f8f330213245fd1072de2fa9aa04d709e235f8d refs/remotes/origin/releaseCandidate +778b5bb2e8f9c23916227faa0999277cbe5d449a refs/tags/PAL-R0.8 +4e46c0ea870631bb5bec3e4aa9fd7eebf3db21f0 refs/tags/PAL-R1.0 +4e46c0ea870631bb5bec3e4aa9fd7eebf3db21f0 refs/tags/PAL-R1.0RC +6d088ca840faf4d08ad42be272b7e84424ffa480 refs/tags/PAL-R1.1 +c453dcb6b637002d6585a04edafdc7096b46ef8b refs/tags/PAL-R1.1RC +^8f8f330213245fd1072de2fa9aa04d709e235f8d +e6738b403b63174a10015acbe7e7dbb576872b5e refs/tags/mbedCloudClient-R1.1 +^6d088ca840faf4d08ad42be272b7e84424ffa480 +79b0d23d539cf09a153f0a399daaba9b35671fd1 refs/tags/mbedCloudClient-R1.1-RC1 +^6d088ca840faf4d08ad42be272b7e84424ffa480 +ff2db616074f491c6ddeddedda8c5d4f6fc46353 refs/tags/mbedCloudClient-R1.1-RC2 +^6d088ca840faf4d08ad42be272b7e84424ffa480 +84e39936d5a06c3842b9e30f97a180f694ef621b refs/tags/mbedCloudClient-R1.1-RC3 +^6d088ca840faf4d08ad42be272b7e84424ffa480 +83e084d2c90b8b6d796a8b430dfdd336f0d348a9 refs/tags/mbedCloudClient-r0.8 +^797a41b1ec7d5d7e495267cf485faba2fe0f4573 +4b31ee48cd64b0836031305863a3164b864a19f3 refs/tags/mbedCloudClient-r0.8.1 +^797a41b1ec7d5d7e495267cf485faba2fe0f4573 +25b3dd71affa02d7be7c9343ba0f142b4c25627b refs/tags/mbedCloudClient-r0.8.2 +^08f7c93f8e24b00817a817d6f36ac676f10251c2 +d456bf624ff44e2f5d155b15633f51dbd11101de refs/tags/mbedCloudClient-r1.0 +^4e46c0ea870631bb5bec3e4aa9fd7eebf3db21f0 +e2102fd27ab7ed604eba2849dc7d3a840b410017 refs/tags/place_holder_for_official_0.8 +c0742b2e32586a14d4ef87807674d21d3dfbbe39 refs/tags/test_tag +^797a41b1ec7d5d7e495267cf485faba2fe0f4573
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/refs/heads/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +3d4cbd817dd6e9887e7237e2cc1106af28dfee53
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/refs/remotes/origin/HEAD Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/refs/remotes/origin/feature-mbed-os-bootloader Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +f6ed72fe831dc05c511cd055d4967537b6e7d953
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/refs/remotes/origin/master Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +6e21a6901c5346681b091a70b865dd787311e255
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.git/refs/remotes/origin/releaseCandidate Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1 @@ +066663c08f1f43bf88f0298be59221031d59a3bb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.gitignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,51 @@ +*.o +*.so +*.a +*.user +*.aps +*.pch +*.vspscc +*_i.c +*_p.c +*.ncb +*.suo +*.bak +*.cache +*.ilk +*.log +*.obj +*.DxLog +*.sbr +*.exe +*.tlog +Thumbs.db +*.idb +*.pdb +*.bsc +*.pdb +*.sdf +*.opensdf +*.pyc +*.d +*.elf +*.bin +*.lst +*.*~ +*.map +*.hex +.cproject +.project +*.vc.* +Build/ +out/ +mbed-os/ +CMakeFiles/ +CMakeCache.txt +files.cmake +Makefile +cmake_install.cmake +Test/RTOS_tests/* +Workspace/VS2013/PAL/PAL.vcxproj.filters +Workspace/VS2013/PAL/PAL.vcxproj +Workspace/VS2013/PAL/PAL.sln +.vscode/*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/.mbedignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,5 @@ +Docs/* +Examples/* +Non-Dist/* +Test/* +Utils/* \ No newline at end of file
Binary file pal/Docs/PAL Porting Guide.pdf has changed
Binary file pal/Docs/PAL.chm has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/ReleaseNotes/R1.0-release.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,37 @@ +# Platform Abstraction Layer R1.0 Release Notes + +## Introduction +This version is the first release of the Platform Abstraction Layer (PAL) package. The target of PAL is to support easy porting of the mbed Cloud Client services to different platforms and operating systems. +The version also includes a reference porting to the mbedOS 5.2 (mbed-os-5.2) operating system, running on Cortex-M SoC. + +## Content +Version R1.0 includes the following features: + +1. Service APIs: + A set of APIs to be used by the mbed Cloud Client services. Currently supported: + 1. RTOS API: OS primitives: Threads, Semaphores, memory pools, ... + 2. Network API: networking API. Supporting TCP & UDP in synchronous & asynchronous modes. + +2. Platform APIs + Set of APIs the platform owner is expected to implement for the specific device and operating system. + +3. Documentation: + 1. API documentation + 2. Porting guide + +3. Reference implementation of the Platform APIs for the mbedOS 5.2 (mbed-os-5.2) OS. + +## Release +Unless differently stated in file, the PAL package is released as an Open Source, under the Apache-2.0 license model. You can find a copy of the license [here](https://github.com/ARMmbed/pal/blob/master/apache-2.0.txt). + +The repository of PAL can be found at: https://github.com/ARMmbed/pal + +The Release tag is: PAL-R1.0 + +## Known issues +No known issues exists at the time of release. + +Since not all interfaces needed by the services are covered yet, we assume [mbedTLS](https://tls.mbed.org) is supplied by the platform. + +## Reporting issues +Please report any issue on the PAL GitHub project.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/annotated.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Data Structures</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="classes.html"><span>Data Structure Index</span></a></li> + <li><a href="functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Data Structures</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory"> +<table class="directory"> +<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="d8/d19/struct__pal_buffer__t.html" target="_self">_palBuffer_t</a></td><td class="desc"></td></tr> +<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="d2/dab/struct__pal_const_buffer__t.html" target="_self">_palConstBuffer_t</a></td><td class="desc"></td></tr> +<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="df/d48/structpal__thread_local_store.html" target="_self">pal_threadLocalStore</a></td><td class="desc"></td></tr> +<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="de/dfc/structpal__time_val.html" target="_self">pal_timeVal</a></td><td class="desc"></td></tr> +<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="d9/d16/structpal_net_interface_info.html" target="_self">palNetInterfaceInfo</a></td><td class="desc"></td></tr> +<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="db/d42/structpal_socket_address.html" target="_self">palSocketAddress</a></td><td class="desc"></td></tr> +<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="d3/d30/structthreads_argument.html" target="_self">threadsArgument</a></td><td class="desc"></td></tr> +<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="dc/d2c/structtimer_argument.html" target="_self">timerArgument</a></td><td class="desc"></td></tr> +</table> +</div><!-- directory --> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
Binary file pal/Docs/html/arrowdown.png has changed
Binary file pal/Docs/html/arrowright.png has changed
Binary file pal/Docs/html/bc_s.png has changed
Binary file pal/Docs/html/bdwn.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/classes.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Data Structure Index</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="classes.html"><span>Data Structure Index</span></a></li> + <li><a href="functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Data Structure Index</div> </div> +</div><!--header--> +<div class="contents"> +<div class="qindex"><a class="qindex" href="#letter_P">P</a> | <a class="qindex" href="#letter_T">T</a> | <a class="qindex" href="#letter__">_</a></div> +<table class="classindex"> +<tr><td rowspan="2" valign="bottom"><a name="letter__"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  _  </div></td></tr></table> +</td><td valign="top"><a class="el" href="d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a>   </td><td valign="top"><a class="el" href="de/dfc/structpal__time_val.html">pal_timeVal</a>   </td><td rowspan="2" valign="bottom"><a name="letter_t"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  t  </div></td></tr></table> +</td><td valign="top"><a class="el" href="dc/d2c/structtimer_argument.html">timerArgument</a>   </td></tr> +<tr><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  p  </div></td></tr></table> +</td><td valign="top"><a class="el" href="d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo</a>   </td><td></td></tr> +<tr><td valign="top"><a class="el" href="d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a>   </td><td valign="top"><a class="el" href="db/d42/structpal_socket_address.html">palSocketAddress</a>   </td><td valign="top"><a class="el" href="d3/d30/structthreads_argument.html">threadsArgument</a>   </td><td></td></tr> +<tr><td></td><td valign="top"><a class="el" href="df/d48/structpal__thread_local_store.html">pal_threadLocalStore</a>   </td><td></td><td></td><td></td></tr> +<tr><td></td><td></td><td></td><td></td><td></td></tr> +</table> +<div class="qindex"><a class="qindex" href="#letter_P">P</a> | <a class="qindex" href="#letter_T">T</a> | <a class="qindex" href="#letter__">_</a></div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
Binary file pal/Docs/html/closed.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d0/d51/pal__test__utils_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_test_utils.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> </div> + <div class="headertitle"> +<div class="title">pal_test_utils.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><a href="../../d0/d51/pal__test__utils_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a7f0c3a0f2f1c4062d776a7bc64bed815"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d0/d51/pal__test__utils_8h.html#a7f0c3a0f2f1c4062d776a7bc64bed815">TEST_PRINTF</a>(ARGS...)   <a class="el" href="../../d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb">PAL_PRINTF</a>(ARGS)</td></tr> +<tr class="separator:a7f0c3a0f2f1c4062d776a7bc64bed815"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a7f0c3a0f2f1c4062d776a7bc64bed815"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define TEST_PRINTF</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">ARGS...</td><td>)</td> + <td>   <a class="el" href="../../d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb">PAL_PRINTF</a>(ARGS)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d0/d51/pal__test__utils_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_test_utils.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_test_utils.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d0/d51/pal__test__utils_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#ifndef TEST_UNITEST_PAL_TEST_UTILS_H_</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#define TEST_UNITEST_PAL_TEST_UTILS_H_</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"><a class="line" href="../../d0/d51/pal__test__utils_8h.html#a7f0c3a0f2f1c4062d776a7bc64bed815"> 21</a></span> <span class="preprocessor">#define TEST_PRINTF(ARGS...) PAL_PRINTF(ARGS)</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#endif </span><span class="comment">/* TEST_UNITEST_PAL_TEST_UTILS_H_ */</span><span class="preprocessor"></span></div></div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d1/d99/pal__update__test__runner_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_update_test_runner.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_update_test_runner.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ad550ecdbd7d30076749ad542e11670b4"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/d99/pal__update__test__runner_8c.html#ad550ecdbd7d30076749ad542e11670b4">TEST_GROUP_RUNNER</a> (pal_update)</td></tr> +<tr class="separator:ad550ecdbd7d30076749ad542e11670b4"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ad550ecdbd7d30076749ad542e11670b4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d1/dc4/pal__network_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,844 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Modules/Networking/pal_network.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></li><li class="navelem"><a class="el" href="../../dir_59e3d70b06141856a554dd7aab1293ae.html">Networking</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#typedef-members">Typedefs</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_network.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d2c/pal__plat__network_8h_source.html">pal_plat_network.h</a>"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:abd4e26912e35fc58e5bc0172765bdc6e"><td class="memItemLeft" align="right" valign="top">typedef struct pal_in_addr </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#abd4e26912e35fc58e5bc0172765bdc6e">pal_in_addr_t</a></td></tr> +<tr class="separator:abd4e26912e35fc58e5bc0172765bdc6e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abc2b368e206e7353e31a520fa573cd8a"><td class="memItemLeft" align="right" valign="top">typedef struct pal_socketAddressInternal </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#abc2b368e206e7353e31a520fa573cd8a">pal_socketAddressInternal_t</a></td></tr> +<tr class="separator:abc2b368e206e7353e31a520fa573cd8a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aaf4e46664d7b7f8902c69cb72a65c943"><td class="memItemLeft" align="right" valign="top">typedef struct pal_socketAddressInternal6 </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#aaf4e46664d7b7f8902c69cb72a65c943">pal_socketAddressInternal6_t</a></td></tr> +<tr class="separator:aaf4e46664d7b7f8902c69cb72a65c943"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a081cc2fd09644c41068673487b39f6b8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a081cc2fd09644c41068673487b39f6b8">pal_registerNetworkInterface</a> (void *networkInterfaceContext, uint32_t *interfaceIndex)</td></tr> +<tr class="separator:a081cc2fd09644c41068673487b39f6b8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abbeb1395896eb79ab564568b9ab8a628"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#abbeb1395896eb79ab564568b9ab8a628">pal_setSockAddrPort</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, uint16_t port)</td></tr> +<tr class="separator:abbeb1395896eb79ab564568b9ab8a628"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aed02a6f53b88e1d5e81607b1221a3efa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_setSockAddrIPV4Addr</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> ipV4Addr)</td></tr> +<tr class="separator:aed02a6f53b88e1d5e81607b1221a3efa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0cc13f7ef9ceb4a75884a8bebf0d831c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_setSockAddrIPV6Addr</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> ipV6Addr)</td></tr> +<tr class="separator:a0cc13f7ef9ceb4a75884a8bebf0d831c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ade5cf610808db5462666465b648e7724"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#ade5cf610808db5462666465b648e7724">pal_getSockAddrIPV4Addr</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> ipV4Addr)</td></tr> +<tr class="separator:ade5cf610808db5462666465b648e7724"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a153bc6165f64bbf3e6bcc79b0d39138f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_getSockAddrIPV6Addr</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> ipV6Addr)</td></tr> +<tr class="separator:a153bc6165f64bbf3e6bcc79b0d39138f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4658c7e8224b536d4fd71fed2602b12e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a4658c7e8224b536d4fd71fed2602b12e">pal_getSockAddrPort</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, uint16_t *port)</td></tr> +<tr class="separator:a4658c7e8224b536d4fd71fed2602b12e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa852fb6e271fb91efd65e2a1ead93b9a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, bool nonBlockingSocket, uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:aa852fb6e271fb91efd65e2a1ead93b9a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2d9d4e04e43995123efe134c767cd6e1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a2d9d4e04e43995123efe134c767cd6e1">pal_getSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> optionName, void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *optionLength)</td></tr> +<tr class="separator:a2d9d4e04e43995123efe134c767cd6e1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2e1bbe81a35a1cb54c351912bb97736f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_setSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, int optionName, const void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> optionLength)</td></tr> +<tr class="separator:a2e1bbe81a35a1cb54c351912bb97736f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac1ff0fb22cbd84e6c7920c095ddbde63"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_bind</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *myAddress, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> addressLength)</td></tr> +<tr class="separator:ac1ff0fb22cbd84e6c7920c095ddbde63"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6b5e705be1e7c3c16080f2b05b87ff7d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_receiveFrom</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, void *buffer, size_t length, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *from, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *fromLength, size_t *bytesReceived)</td></tr> +<tr class="separator:a6b5e705be1e7c3c16080f2b05b87ff7d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acce808f708e653b6bed317072888ca23"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#acce808f708e653b6bed317072888ca23">pal_sendTo</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, const void *buffer, size_t length, const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *to, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> toLength, size_t *bytesSent)</td></tr> +<tr class="separator:acce808f708e653b6bed317072888ca23"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a18197e0f047f17d2617461594f5ed644"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a18197e0f047f17d2617461594f5ed644">pal_close</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a18197e0f047f17d2617461594f5ed644"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a65df7c68bcf7a21db5d1a7a3830fd19c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_getNumberOfNetInterfaces</a> (uint32_t *numInterfaces)</td></tr> +<tr class="separator:a65df7c68bcf7a21db5d1a7a3830fd19c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5258efd8b21d9c881df29b29686674d8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a5258efd8b21d9c881df29b29686674d8">pal_getNetInterfaceInfo</a> (uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> *interfaceInfo)</td></tr> +<tr class="separator:a5258efd8b21d9c881df29b29686674d8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5cab4ea55a3d28cfd8d4dca8376a111c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dc4/pal__network_8c.html#a5cab4ea55a3d28cfd8d4dca8376a111c">pal_socketMiniSelect</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socketsToCheck[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t numberOfSockets, <a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> *timeout, uint8_t palSocketStatus[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t *numberOfSocketsSet)</td></tr> +<tr class="separator:a5cab4ea55a3d28cfd8d4dca8376a111c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="abd4e26912e35fc58e5bc0172765bdc6e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct pal_in_addr <a class="el" href="../../d1/dc4/pal__network_8c.html#abd4e26912e35fc58e5bc0172765bdc6e">pal_in_addr_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aaf4e46664d7b7f8902c69cb72a65c943"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct pal_socketAddressInternal6 <a class="el" href="../../d1/dc4/pal__network_8c.html#aaf4e46664d7b7f8902c69cb72a65c943">pal_socketAddressInternal6_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abc2b368e206e7353e31a520fa573cd8a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct pal_socketAddressInternal <a class="el" href="../../d1/dc4/pal__network_8c.html#abc2b368e206e7353e31a520fa573cd8a">pal_socketAddressInternal_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ac1ff0fb22cbd84e6c7920c095ddbde63"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_bind </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>myAddress</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>addressLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>bind a given socket to a local address </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket to bind </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">myAddress</td><td>the address to which to bind </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">addressLength</td><td>the length of the address passed in myAddress </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a18197e0f047f17d2617461594f5ed644"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_close </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>close a network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">socket</td><td>release and zero socket pointed to by given pointer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> +<dl class="section note"><dt>Note</dt><dd>recieves palSocket_t* and not palSocket_t so that it can zero the socket to avoid re-use. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5258efd8b21d9c881df29b29686674d8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getNetInterfaceInfo </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> * </td> + <td class="paramname"><em>interfaceInfo</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get information regarding the socket at the index/interface number given (this number is returned when registering the socket) </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>the number of the interface to get information for. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">interfaceInfo</td><td>will be set to the information for the given interface number. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a65df7c68bcf7a21db5d1a7a3830fd19c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getNumberOfNetInterfaces </td> + <td>(</td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numInterfaces</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get the number of current network interfaces </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">numInterfaces</td><td>will hold the number of interfaces after a successful call </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="ade5cf610808db5462666465b648e7724"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSockAddrIPV4Addr </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> </td> + <td class="paramname"><em>ipV4Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get an ipV4 address from a palSocketAddress_t </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">ipV4Addr</td><td>the address that is set in the address </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a153bc6165f64bbf3e6bcc79b0d39138f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSockAddrIPV6Addr </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> </td> + <td class="paramname"><em>ipV6Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get an ipV6 address from a palSocketAddress_t </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">ipV6Addr</td><td>the address that is set in the address </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a4658c7e8224b536d4fd71fed2602b12e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSockAddrPort </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint16_t * </td> + <td class="paramname"><em>port</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get a port from a palSocketAddress_t </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">port</td><td>the port that is set in the address </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a2d9d4e04e43995123efe134c767cd6e1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get options for a given network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket for which to get options </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>for which we are setting the option (see enum PAL_NET_SOCKET_OPTION for supported types) </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">optionValue</td><td>the buffer holding the option value returned by the function </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">optionLength</td><td>the size of the buffer provided for optionValue when calling the function after the call it will contain the length of data actually written to the optionValue buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a6b5e705be1e7c3c16080f2b05b87ff7d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_receiveFrom </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>from</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>fromLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesReceived</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>receive a payload from the given socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket to receive from [we expect sockets passed to this function to be of type PAL_SOCK_DGRAM ( the implementation may support other types as well) ] </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>the buffer for the payload data </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>of the buffer for the payload data </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">from</td><td>the address which sent the payload </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">fromLength</td><td>the length of the 'from' address, after completion will contain the amount of data actually written to the from address </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesReceived</td><td>after the call will contain the actual amount of payload data received to the buffer </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a081cc2fd09644c41068673487b39f6b8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_registerNetworkInterface </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>networkInterfaceContext</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>interfaceIndex</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Register a network interface for use with PAL sockets - must be called before other socket functions - most APIs will not work before a single interface is added. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">networkInterfaceContext</td><td>of the network interface to be added (OS specific , e.g. in MbedOS this is the NetworkInterface object pointer for the network adapter [note: we assume connect has already been called on this]) - if not available use NULL . </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">InterfaceIndex</td><td>will contain the index assigned to the interface in case it has been assigned successfully. this index can be used when creating a socket to bind the socket to the interface. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="acce808f708e653b6bed317072888ca23"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_sendTo </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>to</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>toLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesSent</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>send a payload to the given address using the given socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket to use for sending the payload [we expect sockets passed to this function to be of type PAL_SOCK_DGRAM ( the implementation may support other types as well) ] </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>the buffer for the payload data </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>of the buffer for the payload data </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">to</td><td>the address to which to payload should be sent </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">toLength</td><td>the length of the 'to' address </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesSent</td><td>after the call will contain the actual amount of payload data sent </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aed02a6f53b88e1d5e81607b1221a3efa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSockAddrIPV4Addr </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> </td> + <td class="paramname"><em>ipV4Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set an ipV4 address to a palSocketAddress_t and also set the addressType to ipv4 </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">ipV4Addr</td><td>the address value to set </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a0cc13f7ef9ceb4a75884a8bebf0d831c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSockAddrIPV6Addr </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> </td> + <td class="paramname"><em>ipV6Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set an ipV6 address to a palSocketAddress_t and also set the addressType to ipv6 </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">ipV6Addr</td><td>the address value to set </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="abbeb1395896eb79ab564568b9ab8a628"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSockAddrPort </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint16_t </td> + <td class="paramname"><em>port</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set a port to a palSocketAddress_t setting it can be done either directly or via the palSetSockAddrIPV4Addr or palSetSockAddrIPV6Addr functions </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">port</td><td>the port number to set </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> +<dl class="section note"><dt>Note</dt><dd>for the socket to be set correctly the addressType field of the address must be set correctly. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2e1bbe81a35a1cb54c351912bb97736f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set options for a given network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket for which to get options </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>for which we are setting the option (see enum PAL_NET_SOCKET_OPTION for supported types) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionValue</td><td>the buffer holding the option value to set for the given option </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionLength</td><td>the size of the buffer provided for optionValue </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aa852fb6e271fb91efd65e2a1ead93b9a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_socket </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> </td> + <td class="paramname"><em>domain</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> </td> + <td class="paramname"><em>type</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">bool </td> + <td class="paramname"><em>nonBlockingSocket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get a network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">domain</td><td>the domain for the created socket (see palSocketDomain_t for supported types) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">type</td><td>the type for the created socket (see palSocketType_t for supported types) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">nonBlockingSocket</td><td>if true the socket created is created as non-blocking (i.e. with O_NONBLOCK set) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>the number of the network interface used for this socket (info in interfaces supported via pal_getNumberOfNetInterfaces and pal_getNetInterfaceInfo ), choose PAL_NET_DEFAULT_INTERFACE for default interface. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">socket</td><td>socket is returned through this output parameter </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a5cab4ea55a3d28cfd8d4dca8376a111c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_socketMiniSelect </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socketsToCheck</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>numberOfSockets</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> * </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint8_t </td> + <td class="paramname"><em>palSocketStatus</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numberOfSocketsSet</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>check if one or more (up to PAL_NET_SOCKET_SELECT_MAX_SOCKETS) sockets given has data available for reading/writing/error, the function will block until data is available for one of the given sockets or the timeout expires. To use the function: set the sockets you want to check in the socketsToCheck array and set a timeout, when it returns the socketStatus output will indicate the status of each socket passed in. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socketsToCheck</td><td>on input: the array of up to 8 sockets handles to check. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">numberOfSockets</td><td>the number of sockets set in the input socketsToCheck array. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>the amount of time till timeout if no socket activity is detected </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">socketStatus</td><td>will provide information on each socket in the input array indicating which event was set (none, rx, tx, err) check for desired event using macros. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">numberOfSocketsSet</td><td>is the total number of sockets set in all three data sets (tx, rx, err)after the function completes </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the entry in index x in the socketStatus array corresponds to the socket at index x in the sockets to check array. </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d1/dee/pal__rtos__test__utils_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,338 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_rtos_test_utils.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos_test_utils.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d28/pal__rtos__test__utils_8h_source.html">pal_rtos_test_utils.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +<code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a0a153da028aee8f220377b516ff065c8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a0a153da028aee8f220377b516ff065c8">palThreadFunc1</a> (void const *argument)</td></tr> +<tr class="separator:a0a153da028aee8f220377b516ff065c8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a29dc69cbcc48b55d48a5fd668da7fe15"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a29dc69cbcc48b55d48a5fd668da7fe15">palThreadFunc2</a> (void const *argument)</td></tr> +<tr class="separator:a29dc69cbcc48b55d48a5fd668da7fe15"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acf68b041960be3c58f516986504fcd0f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#acf68b041960be3c58f516986504fcd0f">palThreadFunc3</a> (void const *argument)</td></tr> +<tr class="separator:acf68b041960be3c58f516986504fcd0f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a844c7469189866b502ef85df5063e79c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a844c7469189866b502ef85df5063e79c">palThreadFunc4</a> (void const *argument)</td></tr> +<tr class="separator:a844c7469189866b502ef85df5063e79c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5be7a07498de9cc847215e6aa8f77914"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a5be7a07498de9cc847215e6aa8f77914">palThreadFunc5</a> (void const *argument)</td></tr> +<tr class="separator:a5be7a07498de9cc847215e6aa8f77914"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a52dc025f6020b0d456bbbcacc3aa4e3e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a52dc025f6020b0d456bbbcacc3aa4e3e">palThreadFunc6</a> (void const *argument)</td></tr> +<tr class="separator:a52dc025f6020b0d456bbbcacc3aa4e3e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abac822ed4b356b85117101aa0d8701d6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#abac822ed4b356b85117101aa0d8701d6">palTimerFunc1</a> (void const *argument)</td></tr> +<tr class="separator:abac822ed4b356b85117101aa0d8701d6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8581bcb8f9f435a87c3dd651d65e32c8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a8581bcb8f9f435a87c3dd651d65e32c8">palTimerFunc2</a> (void const *argument)</td></tr> +<tr class="separator:a8581bcb8f9f435a87c3dd651d65e32c8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7c8c7a38fca8b62acc6094ba1f072ec7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a7c8c7a38fca8b62acc6094ba1f072ec7">palThreadFuncCustom1</a> (void const *argument)</td></tr> +<tr class="separator:a7c8c7a38fca8b62acc6094ba1f072ec7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a663a9130dc598399ec3bd9ab9e6680fa"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a663a9130dc598399ec3bd9ab9e6680fa">palThreadFuncCustom2</a> (void const *argument)</td></tr> +<tr class="separator:a663a9130dc598399ec3bd9ab9e6680fa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a300d95346a90a5f17aa6140647243b64"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a300d95346a90a5f17aa6140647243b64">palThreadFuncCustom3</a> (void const *argument)</td></tr> +<tr class="separator:a300d95346a90a5f17aa6140647243b64"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa5b1f9c927c18d821a46d99dfe533cb0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#aa5b1f9c927c18d821a46d99dfe533cb0">palThreadFuncCustom4</a> (void const *argument)</td></tr> +<tr class="separator:aa5b1f9c927c18d821a46d99dfe533cb0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a393f7a6e534c05e534cfdaf46473db45"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#a393f7a6e534c05e534cfdaf46473db45">palRunThreads</a> ()</td></tr> +<tr class="separator:a393f7a6e534c05e534cfdaf46473db45"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:aecb21b545f5a0c542dc82a8ef0b89b3f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#aecb21b545f5a0c542dc82a8ef0b89b3f">threadsArg</a></td></tr> +<tr class="separator:aecb21b545f5a0c542dc82a8ef0b89b3f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad4897778c444c8e8fbcb65c84901ac78"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d1/dee/pal__rtos__test__utils_8c.html#ad4897778c444c8e8fbcb65c84901ac78">timerArgs</a></td></tr> +<tr class="separator:ad4897778c444c8e8fbcb65c84901ac78"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a393f7a6e534c05e534cfdaf46473db45"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palRunThreads </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0a153da028aee8f220377b516ff065c8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc1 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a29dc69cbcc48b55d48a5fd668da7fe15"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc2 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="acf68b041960be3c58f516986504fcd0f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc3 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a844c7469189866b502ef85df5063e79c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc4 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a5be7a07498de9cc847215e6aa8f77914"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc5 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a52dc025f6020b0d456bbbcacc3aa4e3e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc6 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7c8c7a38fca8b62acc6094ba1f072ec7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom1 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a663a9130dc598399ec3bd9ab9e6680fa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom2 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a300d95346a90a5f17aa6140647243b64"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom3 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa5b1f9c927c18d821a46d99dfe533cb0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom4 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abac822ed4b356b85117101aa0d8701d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palTimerFunc1 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8581bcb8f9f435a87c3dd651d65e32c8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palTimerFunc2 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="aecb21b545f5a0c542dc82a8ef0b89b3f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a> threadsArg</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad4897778c444c8e8fbcb65c84901ac78"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a> timerArgs</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,198 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_rtos_test_main_FreeRTOS.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos_test_main_FreeRTOS.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "fsl_device_registers.h"</code><br /> +<code>#include "fsl_debug_console.h"</code><br /> +<code>#include "board.h"</code><br /> +<code>#include "pin_mux.h"</code><br /> +<code>#include "clock_config.h"</code><br /> +<code>#include "unity.c"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a37fa0e609ebaa8565ad388e41cc92a43"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#a37fa0e609ebaa8565ad388e41cc92a43">APP_DEBUG_UART_BAUDRATE</a>   9600 /* Debug console baud rate. */</td></tr> +<tr class="separator:a37fa0e609ebaa8565ad388e41cc92a43"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3b196c652283b89130c86ca7bd1559bc"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#a3b196c652283b89130c86ca7bd1559bc">APP_DEBUG_UART_CLKSRC_NAME</a>   kCLOCK_CoreSysClk /* System clock. */</td></tr> +<tr class="separator:a3b196c652283b89130c86ca7bd1559bc"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#a9e9aa39842df82b3f5086f3215cc74fc">TEST_pal_rtos_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a840291bc02cba5474a4cb46a9b9566fe"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#a840291bc02cba5474a4cb46a9b9566fe">main</a> (void)</td></tr> +<tr class="memdesc:a840291bc02cba5474a4cb46a9b9566fe"><td class="mdescLeft"> </td><td class="mdescRight">Main function. <a href="#a840291bc02cba5474a4cb46a9b9566fe">More...</a><br /></td></tr> +<tr class="separator:a840291bc02cba5474a4cb46a9b9566fe"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad7d1365a74953be39a9a7e65702b69a3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#ad7d1365a74953be39a9a7e65702b69a3">unity_output_char</a> (int c)</td></tr> +<tr class="separator:ad7d1365a74953be39a9a7e65702b69a3"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a37fa0e609ebaa8565ad388e41cc92a43"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define APP_DEBUG_UART_BAUDRATE   9600 /* Debug console baud rate. */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a3b196c652283b89130c86ca7bd1559bc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define APP_DEBUG_UART_CLKSRC_NAME   kCLOCK_CoreSysClk /* System clock. */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a840291bc02cba5474a4cb46a9b9566fe"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Main function. </p> + +</div> +</div> +<a class="anchor" id="a9e9aa39842df82b3f5086f3215cc74fc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_rtos_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad7d1365a74953be39a9a7e65702b69a3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void unity_output_char </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>c</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d2/d47/pal__plat__update_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,497 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Platform-API/pal_plat_update.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_plat_update.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../dd/df9/pal__update_8h_source.html">pal_update.h</a>"</code><br /> +</div> +<p><a href="../../d2/d47/pal__plat__update_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a3184f4433c02437d70307b21bc755cb8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a3184f4433c02437d70307b21bc755cb8">pal_plat_imageInitAPI</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> CBfunction)</td></tr> +<tr class="separator:a3184f4433c02437d70307b21bc755cb8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9974172099eb04fa008b12c6432e832a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a9974172099eb04fa008b12c6432e832a">pal_plat_imageDeInit</a> (void)</td></tr> +<tr class="separator:a9974172099eb04fa008b12c6432e832a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a459d4051428d92cf6e0d960b198c87d3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a459d4051428d92cf6e0d960b198c87d3">pal_plat_imageGetMaxNumberOfImages</a> (uint8_t *imageNumber)</td></tr> +<tr class="separator:a459d4051428d92cf6e0d960b198c87d3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab5a811ed8f4fff3a8f5317de00198ca4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#ab5a811ed8f4fff3a8f5317de00198ca4">pal_plat_imageReserveSpace</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t imageSize)</td></tr> +<tr class="separator:ab5a811ed8f4fff3a8f5317de00198ca4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5086927381d43a2ec2818209b20c2261"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a5086927381d43a2ec2818209b20c2261">pal_plat_imageSetHeader</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> *details)</td></tr> +<tr class="separator:a5086927381d43a2ec2818209b20c2261"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad6c3c91cf0da39abb1a4a50ff089936f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#ad6c3c91cf0da39abb1a4a50ff089936f">pal_plat_imageWrite</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *chunk)</td></tr> +<tr class="separator:ad6c3c91cf0da39abb1a4a50ff089936f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a90614195d6390f9cffb77e840c1eca0e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a90614195d6390f9cffb77e840c1eca0e">pal_plat_imageSetVersion</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *version)</td></tr> +<tr class="separator:a90614195d6390f9cffb77e840c1eca0e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af2c039c8331a9fb3444a209fc1de4cc3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#af2c039c8331a9fb3444a209fc1de4cc3">pal_plat_imageFlush</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId)</td></tr> +<tr class="separator:af2c039c8331a9fb3444a209fc1de4cc3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a04bdb18ea6bbad040310007e1c7dad52"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a04bdb18ea6bbad040310007e1c7dad52">pal_plat_imageGetDirectMemAccess</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, void **imagePtr, size_t *imageSizeInBytes)</td></tr> +<tr class="separator:a04bdb18ea6bbad040310007e1c7dad52"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1ea8421acb807fa8f769be11d3d24e7c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a1ea8421acb807fa8f769be11d3d24e7c">pal_plat_imageReadToBuffer</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *chunk)</td></tr> +<tr class="separator:a1ea8421acb807fa8f769be11d3d24e7c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0975a4b263074cd29ad2c048bd65fc57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a0975a4b263074cd29ad2c048bd65fc57">pal_plat_imageActivate</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId)</td></tr> +<tr class="separator:a0975a4b263074cd29ad2c048bd65fc57"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a13dee681c787b26269df36464a114bf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a13dee681c787b26269df36464a114bf9">pal_plat_imageGetActiveHash</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *hash)</td></tr> +<tr class="separator:a13dee681c787b26269df36464a114bf9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aac3002ca0559fa4a266f8ff7f10a653e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#aac3002ca0559fa4a266f8ff7f10a653e">pal_plat_imageGetActiveVersion</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *version)</td></tr> +<tr class="separator:aac3002ca0559fa4a266f8ff7f10a653e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a66c15f74e8d3e11e449531e41d39e20a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d47/pal__plat__update_8h.html#a66c15f74e8d3e11e449531e41d39e20a">pal_plat_imageWriteHashToMemory</a> (const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const hashValue)</td></tr> +<tr class="separator:a66c15f74e8d3e11e449531e41d39e20a"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a0975a4b263074cd29ad2c048bd65fc57"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageActivate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set the imageId to be the active image (after device reset). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a9974172099eb04fa008b12c6432e832a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageDeInit </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Clear all the resources used by the pal_update APIs. </p><dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="af2c039c8331a9fb3444a209fc1de4cc3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageFlush </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Flush the entire image data after writing ends for imageId. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a13dee681c787b26269df36464a114bf9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetActiveHash </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>hash</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the hash value of the active image to hash buffer with max size hash maxBufferLength, and set the hash bufferLength to the hash size. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">hash</td><td>The hash and actual size of hash read. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="aac3002ca0559fa4a266f8ff7f10a653e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetActiveVersion </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>version</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the version of the active image to version buffer with the size set to version bufferLength. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">version</td><td>The version and actual size of version read. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a04bdb18ea6bbad040310007e1c7dad52"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetDirectMemAccess </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void ** </td> + <td class="paramname"><em>imagePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>imageSizeInBytes</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Verify whether the imageId is readable and set imagePtr to point to the beginning of the image in the memory and imageSizeInBytes to the image size. In case of failure sets imagePtr to NULL and returns the relevant palStatus_t error. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imagePtr</td><td>A pointer to the start of the image. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imageSizeInBytes</td><td>The size of the image. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a459d4051428d92cf6e0d960b198c87d3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetMaxNumberOfImages </td> + <td>(</td> + <td class="paramtype">uint8_t * </td> + <td class="paramname"><em>imageNumber</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set the imageNumber to the number of available images. You can do this through hard coded define inside the linker script. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">imageNumber</td><td>The total number of images the system supports. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a3184f4433c02437d70307b21bc755cb8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageInitAPI </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> </td> + <td class="paramname"><em>CBfunction</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set the callback function that is called before the end of each API (except imageGetDirectMemAccess). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">CBfunction</td><td>A pointer to the callback function. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1ea8421acb807fa8f769be11d3d24e7c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageReadToBuffer </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Read the max of chunk maxBufferLength bytes from the imageId with relative offset and store it in chunk buffer. Set the chunk bufferLength value to the actual number of bytes read. Note: Please use this API in case the image is not directly accessible via the imageGetDirectMemAccess function. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset to start reading from. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">chunk</td><td>The data and actual bytes read. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="ab5a811ed8f4fff3a8f5317de00198ca4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageReserveSpace </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>imageSize</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Claim space in the relevant storage region for imageId with the size of the image. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">imageSize</td><td>The size of the images. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5086927381d43a2ec2818209b20c2261"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageSetHeader </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> * </td> + <td class="paramname"><em>details</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set up the details for the image header. The data is written when the image write is called for the first time. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">details</td><td>The data needed to build the image header. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a90614195d6390f9cffb77e840c1eca0e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageSetVersion </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> * </td> + <td class="paramname"><em>version</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Update the image version of imageId to version written in version buffer with version bufferLength. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">version</td><td>The image version and its length. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ad6c3c91cf0da39abb1a4a50ff089936f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageWrite </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Write the data in the chunk buffer with the size written in chunk bufferLength in the location of imageId adding the relative offset. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>the relative offset to write the data into </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">chunk</td><td>A pointer to struct containing the data and the data length to write. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a66c15f74e8d3e11e449531e41d39e20a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageWriteHashToMemory </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const </td> + <td class="paramname"><em>hashValue</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Write the dataId stored in dataBuffer to memory accessible to the bootloader. Currently, only HASH is available. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">hashValue</td><td>The data and size of the HASH. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d2/d47/pal__plat__update_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,82 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Platform-API/pal_plat_update.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_plat_update.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d2/d47/pal__plat__update_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef PAL_PLAT_UPDATE_HEADER</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define PAL_PLAT_UPDATE_HEADER</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#include "<a class="code" href="../../dd/df9/pal__update_8h.html">pal_update.h</a>"</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a3184f4433c02437d70307b21bc755cb8">pal_plat_imageInitAPI</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> CBfunction);</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> </div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a9974172099eb04fa008b12c6432e832a">pal_plat_imageDeInit</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a459d4051428d92cf6e0d960b198c87d3">pal_plat_imageGetMaxNumberOfImages</a>(uint8_t* imageNumber);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> </div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#ab5a811ed8f4fff3a8f5317de00198ca4">pal_plat_imageReserveSpace</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <span class="keywordtype">size_t</span> imageSize);</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a5086927381d43a2ec2818209b20c2261">pal_plat_imageSetHeader</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId,<a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html">palImageHeaderDeails_t</a>* details);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#ad6c3c91cf0da39abb1a4a50ff089936f">pal_plat_imageWrite</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <span class="keywordtype">size_t</span> offset, <a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html">palConstBuffer_t</a>* chunk);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> </div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a90614195d6390f9cffb77e840c1eca0e">pal_plat_imageSetVersion</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <span class="keyword">const</span> <a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html">palConstBuffer_t</a>* version);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#af2c039c8331a9fb3444a209fc1de4cc3">pal_plat_imageFlush</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a04bdb18ea6bbad040310007e1c7dad52">pal_plat_imageGetDirectMemAccess</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <span class="keywordtype">void</span>** imagePtr, <span class="keywordtype">size_t</span>* imageSizeInBytes);</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a1ea8421acb807fa8f769be11d3d24e7c">pal_plat_imageReadToBuffer</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <span class="keywordtype">size_t</span> offset, <a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a>* chunk);</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a0975a4b263074cd29ad2c048bd65fc57">pal_plat_imageActivate</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a13dee681c787b26269df36464a114bf9">pal_plat_imageGetActiveHash</a>(<a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a>* hash);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#aac3002ca0559fa4a266f8ff7f10a653e">pal_plat_imageGetActiveVersion</a> (<a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a>* version);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d2/d47/pal__plat__update_8h.html#a66c15f74e8d3e11e449531e41d39e20a">pal_plat_imageWriteHashToMemory</a>(<span class="keyword">const</span> <a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html">palConstBuffer_t</a>* <span class="keyword">const</span> hashValue);</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> </div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> </div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="preprocessor">#endif </span><span class="comment">/* SOURCE_PAL_IMPL_MODULES_UPDATE_PAL_PALT_UPDATE_H_ */</span><span class="preprocessor"></span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> }</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor">#endif</span></div><div class="ttc" id="struct__pal_buffer__t_html"><div class="ttname"><a href="../../d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a></div><div class="ttdef"><b>Definition:</b> pal_types.h:34</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a90614195d6390f9cffb77e840c1eca0e"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a90614195d6390f9cffb77e840c1eca0e">pal_plat_imageSetVersion</a></div><div class="ttdeci">palStatus_t pal_plat_imageSetVersion(palImageId_t imageId, const palConstBuffer_t *version)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:420</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a3184f4433c02437d70307b21bc755cb8"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a3184f4433c02437d70307b21bc755cb8">pal_plat_imageInitAPI</a></div><div class="ttdeci">palStatus_t pal_plat_imageInitAPI(palImageSignalEvent_t CBfunction)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:244</div></div> +<div class="ttc" id="struct__pal_image_header_deails__t_html"><div class="ttname"><a href="../../df/d0d/struct__pal_image_header_deails__t.html">_palImageHeaderDeails_t</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:33</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a66c15f74e8d3e11e449531e41d39e20a"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a66c15f74e8d3e11e449531e41d39e20a">pal_plat_imageWriteHashToMemory</a></div><div class="ttdeci">palStatus_t pal_plat_imageWriteHashToMemory(const palConstBuffer_t *const hashValue)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:551</div></div> +<div class="ttc" id="pal__plat__update_8h_html_aac3002ca0559fa4a266f8ff7f10a653e"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#aac3002ca0559fa4a266f8ff7f10a653e">pal_plat_imageGetActiveVersion</a></div><div class="ttdeci">palStatus_t pal_plat_imageGetActiveVersion(palBuffer_t *version)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:545</div></div> +<div class="ttc" id="pal__plat__update_8h_html_ad6c3c91cf0da39abb1a4a50ff089936f"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#ad6c3c91cf0da39abb1a4a50ff089936f">pal_plat_imageWrite</a></div><div class="ttdeci">palStatus_t pal_plat_imageWrite(palImageId_t imageId, size_t offset, palConstBuffer_t *chunk)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:926</div></div> +<div class="ttc" id="pal__plat__update_8h_html_af2c039c8331a9fb3444a209fc1de4cc3"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#af2c039c8331a9fb3444a209fc1de4cc3">pal_plat_imageFlush</a></div><div class="ttdeci">palStatus_t pal_plat_imageFlush(palImageId_t imageId)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:1175</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a459d4051428d92cf6e0d960b198c87d3"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a459d4051428d92cf6e0d960b198c87d3">pal_plat_imageGetMaxNumberOfImages</a></div><div class="ttdeci">palStatus_t pal_plat_imageGetMaxNumberOfImages(uint8_t *imageNumber)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:415</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a13dee681c787b26269df36464a114bf9"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a13dee681c787b26269df36464a114bf9">pal_plat_imageGetActiveHash</a></div><div class="ttdeci">palStatus_t pal_plat_imageGetActiveHash(palBuffer_t *hash)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:534</div></div> +<div class="ttc" id="struct__pal_const_buffer__t_html"><div class="ttname"><a href="../../d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a></div><div class="ttdef"><b>Definition:</b> pal_types.h:41</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a9974172099eb04fa008b12c6432e832a"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a9974172099eb04fa008b12c6432e832a">pal_plat_imageDeInit</a></div><div class="ttdeci">palStatus_t pal_plat_imageDeInit(void)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:251</div></div> +<div class="ttc" id="pal__update_8h_html_a9ac73ac0e2421507424182ebaffc8b21"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a></div><div class="ttdeci">void(* palImageSignalEvent_t)(palImageEvents_t event)</div><div class="ttdef"><b>Definition:</b> pal_update.h:64</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a5086927381d43a2ec2818209b20c2261"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a5086927381d43a2ec2818209b20c2261">pal_plat_imageSetHeader</a></div><div class="ttdeci">palStatus_t pal_plat_imageSetHeader(palImageId_t imageId, palImageHeaderDeails_t *details)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:697</div></div> +<div class="ttc" id="pal__update_8h_html"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html">pal_update.h</a></div></div> +<div class="ttc" id="pal__plat__update_8h_html_a1ea8421acb807fa8f769be11d3d24e7c"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a1ea8421acb807fa8f769be11d3d24e7c">pal_plat_imageReadToBuffer</a></div><div class="ttdeci">palStatus_t pal_plat_imageReadToBuffer(palImageId_t imageId, size_t offset, palBuffer_t *chunk)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:1055</div></div> +<div class="ttc" id="pal__update_8h_html_a4a9214b57530228af5cfba5ec05b406b"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a></div><div class="ttdeci">uint32_t palImageId_t</div><div class="ttdef"><b>Definition:</b> pal_update.h:31</div></div> +<div class="ttc" id="pal__plat__update_8h_html_ab5a811ed8f4fff3a8f5317de00198ca4"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#ab5a811ed8f4fff3a8f5317de00198ca4">pal_plat_imageReserveSpace</a></div><div class="ttdeci">palStatus_t pal_plat_imageReserveSpace(palImageId_t imageId, size_t imageSize)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:718</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a04bdb18ea6bbad040310007e1c7dad52"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a04bdb18ea6bbad040310007e1c7dad52">pal_plat_imageGetDirectMemAccess</a></div><div class="ttdeci">palStatus_t pal_plat_imageGetDirectMemAccess(palImageId_t imageId, void **imagePtr, size_t *imageSizeInBytes)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:425</div></div> +<div class="ttc" id="pal__plat__update_8h_html_a0975a4b263074cd29ad2c048bd65fc57"><div class="ttname"><a href="../../d2/d47/pal__plat__update_8h.html#a0975a4b263074cd29ad2c048bd65fc57">pal_plat_imageActivate</a></div><div class="ttdeci">palStatus_t pal_plat_imageActivate(palImageId_t imageId)</div><div class="ttdef"><b>Definition:</b> pal_plat_update.cpp:430</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d2/d87/pal__configuration_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,177 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_configuration.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> </div> + <div class="headertitle"> +<div class="title">pal_configuration.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><a href="../../d2/d87/pal__configuration_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a4662be64705952cfa0925001c9d917c3"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d87/pal__configuration_8h.html#a4662be64705952cfa0925001c9d917c3">PAL_NET_TCP_AND_TLS_SUPPORT</a>   true/* add pal support for TCP */</td></tr> +<tr class="memdesc:a4662be64705952cfa0925001c9d917c3"><td class="mdescLeft"> </td><td class="mdescRight">pal configuration options <a href="#a4662be64705952cfa0925001c9d917c3">More...</a><br /></td></tr> +<tr class="separator:a4662be64705952cfa0925001c9d917c3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a337c171a4cf5d7f04894051002d81eba"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d87/pal__configuration_8h.html#a337c171a4cf5d7f04894051002d81eba">PAL_NET_ASYNCHRONOUS_SOCKET_API</a>   true/* add pal support for asynchronous sockets */</td></tr> +<tr class="separator:a337c171a4cf5d7f04894051002d81eba"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad7e2f6ebd028faacc239229cce972fa7"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d87/pal__configuration_8h.html#ad7e2f6ebd028faacc239229cce972fa7">PAL_NET_DNS_SUPPORT</a>   true/* add pal support for DNS lookup */</td></tr> +<tr class="separator:ad7e2f6ebd028faacc239229cce972fa7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2c7f7687d719d388a67c1f18f200962d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d87/pal__configuration_8h.html#a2c7f7687d719d388a67c1f18f200962d">PAL_RTOS_64BIT_TICK_SUPPORTED</a>   false /* add pal support for asynchronous sockets */</td></tr> +<tr class="separator:a2c7f7687d719d388a67c1f18f200962d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4d2f5187ecd7e90c094e2f103e5b6839"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d87/pal__configuration_8h.html#a4d2f5187ecd7e90c094e2f103e5b6839">PAL_UNIQUE_THREAD_PRIORITY</a>   (!defined(PAL_IGNORE_UNIQUE_THREAD_PRIORITY))/* if defined code skips the uniqueness priority check */</td></tr> +<tr class="separator:a4d2f5187ecd7e90c094e2f103e5b6839"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abb1ceb83ff6a709614d1394e7e39391d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d">PAL_MAX_NUMBER_OF_THREADS</a>   7</td></tr> +<tr class="memdesc:abb1ceb83ff6a709614d1394e7e39391d"><td class="mdescLeft"> </td><td class="mdescRight">number of valid priorities limits the number of threads- if priorities are added this value should be increased <a href="#abb1ceb83ff6a709614d1394e7e39391d">More...</a><br /></td></tr> +<tr class="separator:abb1ceb83ff6a709614d1394e7e39391d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a79ed46284848e83d0dba68933c40f82a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/d87/pal__configuration_8h.html#a79ed46284848e83d0dba68933c40f82a">PAL_MAX_SUPORTED_NET_INTEFACES</a>   5</td></tr> +<tr class="memdesc:a79ed46284848e83d0dba68933c40f82a"><td class="mdescLeft"> </td><td class="mdescRight">the maximal number of interfaces that can be supported at once. <a href="#a79ed46284848e83d0dba68933c40f82a">More...</a><br /></td></tr> +<tr class="separator:a79ed46284848e83d0dba68933c40f82a"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="abb1ceb83ff6a709614d1394e7e39391d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_NUMBER_OF_THREADS   7</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>number of valid priorities limits the number of threads- if priorities are added this value should be increased </p> + +</div> +</div> +<a class="anchor" id="a79ed46284848e83d0dba68933c40f82a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_SUPORTED_NET_INTEFACES   5</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>the maximal number of interfaces that can be supported at once. </p> + +</div> +</div> +<a class="anchor" id="a337c171a4cf5d7f04894051002d81eba"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_ASYNCHRONOUS_SOCKET_API   true/* add pal support for asynchronous sockets */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad7e2f6ebd028faacc239229cce972fa7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_DNS_SUPPORT   true/* add pal support for DNS lookup */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4662be64705952cfa0925001c9d917c3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_TCP_AND_TLS_SUPPORT   true/* add pal support for TCP */</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>pal configuration options </p> + +</div> +</div> +<a class="anchor" id="a2c7f7687d719d388a67c1f18f200962d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_RTOS_64BIT_TICK_SUPPORTED   false /* add pal support for asynchronous sockets */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4d2f5187ecd7e90c094e2f103e5b6839"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_UNIQUE_THREAD_PRIORITY   (!defined(PAL_IGNORE_UNIQUE_THREAD_PRIORITY))/* if defined code skips the uniqueness priority check */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d2/d87/pal__configuration_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_configuration.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_configuration.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d2/d87/pal__configuration_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_COFIGURATION_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_COFIGURATION_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="../../d2/d87/pal__configuration_8h.html#a4662be64705952cfa0925001c9d917c3"> 26</a></span> <span class="preprocessor">#define PAL_NET_TCP_AND_TLS_SUPPORT true</span><span class="comment">/* add pal support for TCP */</span><span class="preprocessor"></span></div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="../../d2/d87/pal__configuration_8h.html#a337c171a4cf5d7f04894051002d81eba"> 27</a></span> <span class="preprocessor">#define PAL_NET_ASYNCHRONOUS_SOCKET_API true</span><span class="comment">/* add pal support for asynchronous sockets */</span><span class="preprocessor"></span></div><div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="../../d2/d87/pal__configuration_8h.html#ad7e2f6ebd028faacc239229cce972fa7"> 28</a></span> <span class="preprocessor">#define PAL_NET_DNS_SUPPORT true</span><span class="comment">/* add pal support for DNS lookup */</span><span class="preprocessor"></span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="../../d2/d87/pal__configuration_8h.html#a2c7f7687d719d388a67c1f18f200962d"> 30</a></span> <span class="preprocessor">#define PAL_RTOS_64BIT_TICK_SUPPORTED false </span><span class="comment">/* add pal support for asynchronous sockets */</span><span class="preprocessor"></span></div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="../../d2/d87/pal__configuration_8h.html#a4d2f5187ecd7e90c094e2f103e5b6839"> 31</a></span> <span class="preprocessor">#define PAL_UNIQUE_THREAD_PRIORITY (!defined(PAL_IGNORE_UNIQUE_THREAD_PRIORITY))</span><span class="comment">/* if defined code skips the uniqueness priority check */</span><span class="preprocessor"></span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="../../d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d"> 34</a></span> <span class="preprocessor">#define PAL_MAX_NUMBER_OF_THREADS 7 </span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> </div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="../../d2/d87/pal__configuration_8h.html#a79ed46284848e83d0dba68933c40f82a"> 37</a></span> <span class="preprocessor">#define PAL_MAX_SUPORTED_NET_INTEFACES 5</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#ifdef __GNUC__ // we are compiling using GCC/G++</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="preprocessor"> #define PAL_TARGET_POINTER_SIZE __SIZEOF_POINTER__</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="preprocessor"> #ifdef __BYTE_ORDER</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="preprocessor"> #if __BYTE_ORDER == __BIG_ENDIAN //if both are not defined it is TRUE!</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor"> #define PAL_COMPILATION_ENDIANITY 1 //define pal compilation endianity (0 is little endian, 1 is big endian)</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="preprocessor"> #elif __BYTE_ORDER == __LITTLE_ENDIAN</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="preprocessor"> #define PAL_COMPILATION_ENDIANITY 0//define pal compilation endianity (0 is little endian, 1 is big endian)</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="preprocessor"> #error missing endiantiy defintion for GCC</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="preprocessor"> #ifdef __arm__ // we are compiling using the ARM compiler</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="preprocessor"> #define PAL_TARGET_POINTER_SIZE __sizeof_ptr</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="preprocessor"> #ifdef __BIG_ENDIAN</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="preprocessor"> #define PAL_COMPILATION_ENDIANITY 1 //define pal compilation endianity (0 is little endian, 1 is big endian)</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="preprocessor"> #else </span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="preprocessor"> #define PAL_COMPILATION_ENDIANITY 0 //define pal compilation endianity (0 is little endian, 1 is big endian)</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="preprocessor"> #else</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="comment">//#error neither ARMCC nor GCC used for compilation - not supported</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="preprocessor"> #endif</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  </div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="preprocessor">#endif //_PAL_COFIGURATION_H</span></div></div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d2/dab/struct__pal_const_buffer__t.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: _palConstBuffer_t Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">_palConstBuffer_t Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:ad411a35599e0f8500f29e5bd2cb66cc7"><td class="memItemLeft" align="right" valign="top">const uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7">maxBufferLength</a></td></tr> +<tr class="separator:ad411a35599e0f8500f29e5bd2cb66cc7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8d4966dc771ad87628b4bd01ae4ea801"><td class="memItemLeft" align="right" valign="top">const uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801">bufferLength</a></td></tr> +<tr class="separator:a8d4966dc771ad87628b4bd01ae4ea801"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3660dfb9336b8d57a3c2223de14646d3"><td class="memItemLeft" align="right" valign="top">const uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3">buffer</a></td></tr> +<tr class="separator:a3660dfb9336b8d57a3c2223de14646d3"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="a3660dfb9336b8d57a3c2223de14646d3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">const uint8_t* _palConstBuffer_t::buffer</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8d4966dc771ad87628b4bd01ae4ea801"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">const uint32_t _palConstBuffer_t::bufferLength</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad411a35599e0f8500f29e5bd2cb66cc7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">const uint32_t _palConstBuffer_t::maxBufferLength</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d3/d30/structthreads_argument.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,168 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: threadsArgument Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">threadsArgument Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d9/d28/pal__rtos__test__utils_8h_source.html">pal_rtos_test_utils.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:a9532cb931dee4c326444e7c366019639"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639">arg1</a></td></tr> +<tr class="separator:a9532cb931dee4c326444e7c366019639"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acecc240150225e2786524a2e4b3adf78"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78">arg2</a></td></tr> +<tr class="separator:acecc240150225e2786524a2e4b3adf78"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abcba9882b15e3845a7794220a5c9e4f4"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4">arg3</a></td></tr> +<tr class="separator:abcba9882b15e3845a7794220a5c9e4f4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6fad7cea38d81eb88f9ff01d4baec32a"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a">arg4</a></td></tr> +<tr class="separator:a6fad7cea38d81eb88f9ff01d4baec32a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2720a7d49d96277778f83a2488859fe9"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9">arg5</a></td></tr> +<tr class="separator:a2720a7d49d96277778f83a2488859fe9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a460c4a55dba6130f386f648138184074"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074">arg6</a></td></tr> +<tr class="separator:a460c4a55dba6130f386f648138184074"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a200c590896768ffb09f8d90c774f6b74"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74">arg7</a></td></tr> +<tr class="separator:a200c590896768ffb09f8d90c774f6b74"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="a9532cb931dee4c326444e7c366019639"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t threadsArgument::arg1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="acecc240150225e2786524a2e4b3adf78"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t threadsArgument::arg2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abcba9882b15e3845a7794220a5c9e4f4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t threadsArgument::arg3</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6fad7cea38d81eb88f9ff01d4baec32a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t threadsArgument::arg4</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2720a7d49d96277778f83a2488859fe9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t threadsArgument::arg5</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a460c4a55dba6130f386f648138184074"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t threadsArgument::arg6</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a200c590896768ffb09f8d90c774f6b74"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t threadsArgument::arg7</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Test/Common/<a class="el" href="../../d9/d28/pal__rtos__test__utils_8h_source.html">pal_rtos_test_utils.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d3/d44/pal__plat__update_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1163 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/mbedOS/Update/pal_plat_update.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="../../dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></li><li class="navelem"><a class="el" href="../../dir_e0c4a7f8a7dec467104a1fe0064ec60f.html">Update</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#enum-members">Enumerations</a> | +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_plat_update.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d2/d47/pal__plat__update_8h_source.html">pal_plat_update.h</a>"</code><br /> +<code>#include "crc.h"</code><br /> +<code>#include <mbed.h></code><br /> +<code>#include <flash-journal-strategy-sequential/flash_journal_strategy_sequential.h></code><br /> +<code>#include <storage-volume-manager/storage_volume_manager.h></code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:aa4e05c8dbea6df808259b1adeff368df"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aa4e05c8dbea6df808259b1adeff368df">PAL_UPDATE_JOURNAL_SIZE</a>   0x80000UL</td></tr> +<tr class="separator:aa4e05c8dbea6df808259b1adeff368df"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a44ea4a279fb4c7322e7eedde623a868e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a44ea4a279fb4c7322e7eedde623a868e">PAL_UPDATE_JOURNAL_START_OFFSET</a>   0x80000UL</td></tr> +<tr class="separator:a44ea4a279fb4c7322e7eedde623a868e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a38372cedac04192680fb4b532e1dcaed"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a38372cedac04192680fb4b532e1dcaed">PAL_UPDATE_ACTIVE_METADATA_HEADER_OFFSET</a>   0x80000UL</td></tr> +<tr class="separator:a38372cedac04192680fb4b532e1dcaed"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a30455a95b24a21e7ef22e021d7b530bf"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a30455a95b24a21e7ef22e021d7b530bf">SIZEOF_SHA256</a>   256/8</td></tr> +<tr class="separator:a30455a95b24a21e7ef22e021d7b530bf"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9762be6170804525a2b45df94fd9293c"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a9762be6170804525a2b45df94fd9293c">FIRMWARE_HEADER_MAGIC</a>   0x5a51b3d4UL</td></tr> +<tr class="separator:a9762be6170804525a2b45df94fd9293c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af3abc5e3f32ad8114e385a7b137a602d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af3abc5e3f32ad8114e385a7b137a602d">FIRMWARE_HEADER_VERSION</a>   1</td></tr> +<tr class="separator:af3abc5e3f32ad8114e385a7b137a602d"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:ad53f6cbdcb10beae7d1bdf6a79d2a48f"><td class="memItemLeft" align="right" valign="top">typedef struct FirmwareHeader </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#ad53f6cbdcb10beae7d1bdf6a79d2a48f">FirmwareHeader_t</a></td></tr> +<tr class="separator:ad53f6cbdcb10beae7d1bdf6a79d2a48f"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a> +Enumerations</h2></td></tr> +<tr class="memitem:af6eff2fe90d3ca8092902993dd53a3b0"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0">pal_pi_mbed_fsm_t</a> { <br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0a5cf2a95bc6f4d8a51a6cf0aea1d58033">PAL_PI_MBED_FSM_NONE</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0a772f4a05fd47853ef0790561efde3a13">PAL_PI_MBED_FSM_SETUP</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0a8fc3ba51ba4cd0da9e48180e03aaa8dd">PAL_PI_MBED_FSM_WRITE</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0a07be41f5418b0058409c8bde84807ca9">PAL_PI_MBED_FSM_READ</a>, +<br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0aaa504471738039669d93625c9406d05f">PAL_PI_MBED_FSM_COMMIT</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0a7bec3fd0760122a3079c0a792cde5362">PAL_PI_MBED_FSM_GETACTIVEHASH</a> +<br /> + }</td></tr> +<tr class="separator:af6eff2fe90d3ca8092902993dd53a3b0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a176daf5f8b17cca4c81a449fdf7929e4"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a176daf5f8b17cca4c81a449fdf7929e4">pal_pi_mbed_getativehash_state_t</a> { <br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a176daf5f8b17cca4c81a449fdf7929e4a49c1eaa2e62d6a0a52e6757b9a84c6de">PAL_PI_GETATIVEHASH_UNINITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a176daf5f8b17cca4c81a449fdf7929e4a8a7e22eb2ed8c53a075b03f5105127d1">PAL_PI_GETATIVEHASH_VOLUME_MANAGER_INITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a176daf5f8b17cca4c81a449fdf7929e4a2b2b81919197445bf8f8124c16e6fefb">PAL_PI_GETATIVEHASH_STORAGE_DRIVER_INITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a176daf5f8b17cca4c81a449fdf7929e4a9b3aeae8375b10e62d6ed9eec032e1b6">PAL_PI_GETATIVEHASH_DONE</a>, +<br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a176daf5f8b17cca4c81a449fdf7929e4aa1ce360c32e0ce97d762ebc09f00ffc2">PAL_PI_GETATIVEHASH_ERROR</a> +<br /> + }</td></tr> +<tr class="separator:a176daf5f8b17cca4c81a449fdf7929e4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4c6cd7eb99781c3e521d223f31eb85d4"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a4c6cd7eb99781c3e521d223f31eb85d4">pal_pi_mbed_setup_state_t</a> { <br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a4c6cd7eb99781c3e521d223f31eb85d4a4f3b72371167ccaa8ce733cb24ca6c1d">PAL_PI_SETUP_UNINITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a4c6cd7eb99781c3e521d223f31eb85d4ae464fa95827d6a705b47c3d078448c86">PAL_PI_SETUP_VOLUME_MANAGER_INITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a4c6cd7eb99781c3e521d223f31eb85d4a1e88752d489258b3ed3e8fd74a906b8c">PAL_PI_SETUP_STORAGE_DRIVER_INITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a4c6cd7eb99781c3e521d223f31eb85d4a5fcdac218b94e7828e37cea02b287e8f">PAL_PI_SETUP_DONE</a>, +<br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a4c6cd7eb99781c3e521d223f31eb85d4a8aa67fddbf4a8a17f86d450d94dd1657">PAL_PI_SETUP_ERROR</a> = -1 +<br /> + }</td></tr> +<tr class="separator:a4c6cd7eb99781c3e521d223f31eb85d4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aea34e881864ec5991b8f41d4db2f20d6"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aea34e881864ec5991b8f41d4db2f20d6">pal_pi_mbed_read_state_t</a> { <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aea34e881864ec5991b8f41d4db2f20d6a5051dc71cfb98868baf2019cad9145c9">PAL_PI_READ_SKIP_METADATA</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aea34e881864ec5991b8f41d4db2f20d6affb00f509bebfc9107a3704e8153fe8a">PAL_PI_READ_UNINITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aea34e881864ec5991b8f41d4db2f20d6a83af438c78b1a2f3296100142477bb57">PAL_PI_READ_DONE</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aea34e881864ec5991b8f41d4db2f20d6a70b722a803e391eadfb77cb1c09f73ac">PAL_PI_READ_ERROR</a> + }</td></tr> +<tr class="separator:aea34e881864ec5991b8f41d4db2f20d6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3e95f6ee79a2062ac9b4ab62ac7a6494"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3e95f6ee79a2062ac9b4ab62ac7a6494">pal_pi_mbed_commit_state_t</a> { <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3e95f6ee79a2062ac9b4ab62ac7a6494ac2483588945dc3f18198c750cb264bb7">PAL_PI_COMMIT_UNINITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3e95f6ee79a2062ac9b4ab62ac7a6494a1c3902a003be99166f2fa06f375a58f8">PAL_PI_COMMIT_RESIDUAL_LOGGED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3e95f6ee79a2062ac9b4ab62ac7a6494a37684be839e05d3fd45c79fc6f280ccb">PAL_PI_COMMIT_DONE</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3e95f6ee79a2062ac9b4ab62ac7a6494a9732b652f3707bddc2dd9f011f81316e">PAL_PI_COMMIT_ERROR</a> + }</td></tr> +<tr class="separator:a3e95f6ee79a2062ac9b4ab62ac7a6494"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afbf088d926918e852b1eebfaff80e133"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afbf088d926918e852b1eebfaff80e133">pal_pi_mbed_write_state_t</a> { <br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afbf088d926918e852b1eebfaff80e133a03d1c45616dab53a1f70519e0e1842a3">PAL_PI_WRITE_UNINITIALIZED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afbf088d926918e852b1eebfaff80e133af7552fc42b2f4c2e8dab529e705c1aa5">PAL_PI_WRITE_METADATA_LOGGED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afbf088d926918e852b1eebfaff80e133ad6189a3b8a082992de381bcadb5b632c">PAL_PI_WRITE_RESIDUAL_LOGGED</a>, +<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afbf088d926918e852b1eebfaff80e133ab73cc7d38e31a075d76deb06a633b905">PAL_PI_WRITE_DONE</a>, +<br /> +  <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afbf088d926918e852b1eebfaff80e133a570a8ce15806e78709bc46db4d8d524b">PAL_PI_WRITE_ERROR</a> +<br /> + }</td></tr> +<tr class="separator:afbf088d926918e852b1eebfaff80e133"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a632d90687b332ec52acf7f2361fd677b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a632d90687b332ec52acf7f2361fd677b">PAL_PI_MBED_journal_callbackHandler</a> (int32_t status, FlashJournal_OpCode_t cmd_code)</td></tr> +<tr class="separator:a632d90687b332ec52acf7f2361fd677b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:affbf3a34b064837cbffa57ea03608ab1"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#affbf3a34b064837cbffa57ea03608ab1">PAL_PI_MBED_journalMTD_callbackHandler</a> (int32_t status, ARM_STORAGE_OPERATION operation)</td></tr> +<tr class="separator:affbf3a34b064837cbffa57ea03608ab1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad1c4ab554059ee9d9a4c09f1e205f18f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#ad1c4ab554059ee9d9a4c09f1e205f18f">PAL_PI_MBED_volumeManager_initializeCallbackHandler</a> (int32_t status)</td></tr> +<tr class="separator:ad1c4ab554059ee9d9a4c09f1e205f18f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6f9492bd4207f64185e224edc41b92a7"><td class="memItemLeft" align="right" valign="top">ARM_DRIVER_STORAGE </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a6f9492bd4207f64185e224edc41b92a7">ARM_Driver_Storage_</a> (0)</td></tr> +<tr class="separator:a6f9492bd4207f64185e224edc41b92a7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aae5619ca2f906c0525a5e94abc844fae"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aae5619ca2f906c0525a5e94abc844fae">PAL_PI_MBED_Setup_StateMachine_Enter</a> ()</td></tr> +<tr class="separator:aae5619ca2f906c0525a5e94abc844fae"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0a10f6d348c44271256ce351332a1545"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a0a10f6d348c44271256ce351332a1545">PAL_PI_MBED_Setup_StateMachine_Advance</a> (int32_t status)</td></tr> +<tr class="separator:a0a10f6d348c44271256ce351332a1545"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a39cf7e2ef5b8f65f1044b68527563d0f"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a39cf7e2ef5b8f65f1044b68527563d0f">PAL_PI_MBED_Write_StateMachine_Enter</a> (int32_t status)</td></tr> +<tr class="separator:a39cf7e2ef5b8f65f1044b68527563d0f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2294ef45a3a4e30cd1744bb99a717a46"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a2294ef45a3a4e30cd1744bb99a717a46">PAL_PI_MBED_Write_StateMachine_Advance</a> (int32_t status)</td></tr> +<tr class="separator:a2294ef45a3a4e30cd1744bb99a717a46"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aadb42b35dc018f8357ea253b39b51016"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aadb42b35dc018f8357ea253b39b51016">PAL_PI_MBED_Read_StateMachine_Enter</a> ()</td></tr> +<tr class="separator:aadb42b35dc018f8357ea253b39b51016"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afd4ce1b11218bf2b4bea9d1d26d148eb"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afd4ce1b11218bf2b4bea9d1d26d148eb">PAL_PI_MBED_Read_StateMachine_Advance</a> (int32_t status)</td></tr> +<tr class="separator:afd4ce1b11218bf2b4bea9d1d26d148eb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a47a7120931f8aae54f5cb63431718fa1"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a47a7120931f8aae54f5cb63431718fa1">PAL_PI_MBED_Commit_StateMachine_Enter</a> ()</td></tr> +<tr class="separator:a47a7120931f8aae54f5cb63431718fa1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2b615289b1b228eb37ed16a7a3d97e3a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a2b615289b1b228eb37ed16a7a3d97e3a">PAL_PI_MBED_Commit_StateMachine_Advance</a> (int32_t status)</td></tr> +<tr class="separator:a2b615289b1b228eb37ed16a7a3d97e3a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3184f4433c02437d70307b21bc755cb8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3184f4433c02437d70307b21bc755cb8">pal_plat_imageInitAPI</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> CBfunction)</td></tr> +<tr class="separator:a3184f4433c02437d70307b21bc755cb8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9974172099eb04fa008b12c6432e832a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a9974172099eb04fa008b12c6432e832a">pal_plat_imageDeInit</a> (void)</td></tr> +<tr class="separator:a9974172099eb04fa008b12c6432e832a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a459d4051428d92cf6e0d960b198c87d3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a459d4051428d92cf6e0d960b198c87d3">pal_plat_imageGetMaxNumberOfImages</a> (uint8_t *imageNumber)</td></tr> +<tr class="separator:a459d4051428d92cf6e0d960b198c87d3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a90614195d6390f9cffb77e840c1eca0e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a90614195d6390f9cffb77e840c1eca0e">pal_plat_imageSetVersion</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *version)</td></tr> +<tr class="separator:a90614195d6390f9cffb77e840c1eca0e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a04bdb18ea6bbad040310007e1c7dad52"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a04bdb18ea6bbad040310007e1c7dad52">pal_plat_imageGetDirectMemAccess</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, void **imagePtr, size_t *imageSizeInBytes)</td></tr> +<tr class="separator:a04bdb18ea6bbad040310007e1c7dad52"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0975a4b263074cd29ad2c048bd65fc57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a0975a4b263074cd29ad2c048bd65fc57">pal_plat_imageActivate</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId)</td></tr> +<tr class="separator:a0975a4b263074cd29ad2c048bd65fc57"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af3bb3231669b76fbb25bbd6698a88792"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af3bb3231669b76fbb25bbd6698a88792">PAL_PI_MBED_GetAtiveHash_StateMachine</a> ()</td></tr> +<tr class="separator:af3bb3231669b76fbb25bbd6698a88792"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a13dee681c787b26269df36464a114bf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a13dee681c787b26269df36464a114bf9">pal_plat_imageGetActiveHash</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *hash)</td></tr> +<tr class="separator:a13dee681c787b26269df36464a114bf9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aac3002ca0559fa4a266f8ff7f10a653e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aac3002ca0559fa4a266f8ff7f10a653e">pal_plat_imageGetActiveVersion</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *version)</td></tr> +<tr class="separator:aac3002ca0559fa4a266f8ff7f10a653e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a66c15f74e8d3e11e449531e41d39e20a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a66c15f74e8d3e11e449531e41d39e20a">pal_plat_imageWriteHashToMemory</a> (const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const hashValue)</td></tr> +<tr class="separator:a66c15f74e8d3e11e449531e41d39e20a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5086927381d43a2ec2818209b20c2261"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a5086927381d43a2ec2818209b20c2261">pal_plat_imageSetHeader</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> *details)</td></tr> +<tr class="separator:a5086927381d43a2ec2818209b20c2261"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab5a811ed8f4fff3a8f5317de00198ca4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#ab5a811ed8f4fff3a8f5317de00198ca4">pal_plat_imageReserveSpace</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t imageSize)</td></tr> +<tr class="separator:ab5a811ed8f4fff3a8f5317de00198ca4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa7cba922f992a315f79a4bb253b26216"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aa7cba922f992a315f79a4bb253b26216">PAL_PI_MBED_Write_LogResidual</a> ()</td></tr> +<tr class="separator:aa7cba922f992a315f79a4bb253b26216"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad6c3c91cf0da39abb1a4a50ff089936f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#ad6c3c91cf0da39abb1a4a50ff089936f">pal_plat_imageWrite</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *chunk)</td></tr> +<tr class="separator:ad6c3c91cf0da39abb1a4a50ff089936f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1ea8421acb807fa8f769be11d3d24e7c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a1ea8421acb807fa8f769be11d3d24e7c">pal_plat_imageReadToBuffer</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *chunk)</td></tr> +<tr class="separator:a1ea8421acb807fa8f769be11d3d24e7c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2ac43c37ca09395eaef46ac9c48747dc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a2ac43c37ca09395eaef46ac9c48747dc">pal_plat_imageFlush</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> package_id)</td></tr> +<tr class="separator:a2ac43c37ca09395eaef46ac9c48747dc"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:a531aff6f188904a2cfc794770ffad311"><td class="memItemLeft" align="right" valign="top">FlashJournal_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a531aff6f188904a2cfc794770ffad311">pal_pi_mbed_journal</a></td></tr> +<tr class="separator:a531aff6f188904a2cfc794770ffad311"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a120116f585e123cb4c022cae715a5b8f"><td class="memItemLeft" align="right" valign="top">FlashJournal_Info_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a120116f585e123cb4c022cae715a5b8f">pal_pi_mbed_journal_info</a></td></tr> +<tr class="separator:a120116f585e123cb4c022cae715a5b8f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aba5a953cdba2ddaab784ef9696d0de02"><td class="memItemLeft" align="right" valign="top">uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aba5a953cdba2ddaab784ef9696d0de02">pal_pi_mbed_overflow_buffer</a></td></tr> +<tr class="separator:aba5a953cdba2ddaab784ef9696d0de02"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3b830d51e5d967bf3b36e6a25fe39ebb"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3b830d51e5d967bf3b36e6a25fe39ebb">pal_pi_mbed_overflow_buffer_size</a> = 0</td></tr> +<tr class="separator:a3b830d51e5d967bf3b36e6a25fe39ebb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a735a834fc7071baefe08266ad9029da5"><td class="memItemLeft" align="right" valign="top">ARM_DRIVER_STORAGE * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a735a834fc7071baefe08266ad9029da5">mtd</a> = &<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a6f9492bd4207f64185e224edc41b92a7">ARM_Driver_Storage_</a>(0)</td></tr> +<tr class="separator:a735a834fc7071baefe08266ad9029da5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0a3810ba98c634252b033b78dff47f69"><td class="memItemLeft" align="right" valign="top">uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a0a3810ba98c634252b033b78dff47f69">pal_pi_mbed_metadata_logged</a></td></tr> +<tr class="separator:a0a3810ba98c634252b033b78dff47f69"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a9762be6170804525a2b45df94fd9293c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define FIRMWARE_HEADER_MAGIC   0x5a51b3d4UL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af3abc5e3f32ad8114e385a7b137a602d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define FIRMWARE_HEADER_VERSION   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a38372cedac04192680fb4b532e1dcaed"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_UPDATE_ACTIVE_METADATA_HEADER_OFFSET   0x80000UL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa4e05c8dbea6df808259b1adeff368df"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_UPDATE_JOURNAL_SIZE   0x80000UL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a44ea4a279fb4c7322e7eedde623a868e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_UPDATE_JOURNAL_START_OFFSET   0x80000UL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a30455a95b24a21e7ef22e021d7b530bf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define SIZEOF_SHA256   256/8</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="ad53f6cbdcb10beae7d1bdf6a79d2a48f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct FirmwareHeader <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#ad53f6cbdcb10beae7d1bdf6a79d2a48f">FirmwareHeader_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Enumeration Type Documentation</h2> +<a class="anchor" id="a3e95f6ee79a2062ac9b4ab62ac7a6494"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a3e95f6ee79a2062ac9b4ab62ac7a6494">pal_pi_mbed_commit_state_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a3e95f6ee79a2062ac9b4ab62ac7a6494ac2483588945dc3f18198c750cb264bb7"></a>PAL_PI_COMMIT_UNINITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a3e95f6ee79a2062ac9b4ab62ac7a6494a1c3902a003be99166f2fa06f375a58f8"></a>PAL_PI_COMMIT_RESIDUAL_LOGGED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a3e95f6ee79a2062ac9b4ab62ac7a6494a37684be839e05d3fd45c79fc6f280ccb"></a>PAL_PI_COMMIT_DONE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a3e95f6ee79a2062ac9b4ab62ac7a6494a9732b652f3707bddc2dd9f011f81316e"></a>PAL_PI_COMMIT_ERROR </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="af6eff2fe90d3ca8092902993dd53a3b0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#af6eff2fe90d3ca8092902993dd53a3b0">pal_pi_mbed_fsm_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="af6eff2fe90d3ca8092902993dd53a3b0a5cf2a95bc6f4d8a51a6cf0aea1d58033"></a>PAL_PI_MBED_FSM_NONE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="af6eff2fe90d3ca8092902993dd53a3b0a772f4a05fd47853ef0790561efde3a13"></a>PAL_PI_MBED_FSM_SETUP </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="af6eff2fe90d3ca8092902993dd53a3b0a8fc3ba51ba4cd0da9e48180e03aaa8dd"></a>PAL_PI_MBED_FSM_WRITE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="af6eff2fe90d3ca8092902993dd53a3b0a07be41f5418b0058409c8bde84807ca9"></a>PAL_PI_MBED_FSM_READ </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="af6eff2fe90d3ca8092902993dd53a3b0aaa504471738039669d93625c9406d05f"></a>PAL_PI_MBED_FSM_COMMIT </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="af6eff2fe90d3ca8092902993dd53a3b0a7bec3fd0760122a3079c0a792cde5362"></a>PAL_PI_MBED_FSM_GETACTIVEHASH </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="a176daf5f8b17cca4c81a449fdf7929e4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a176daf5f8b17cca4c81a449fdf7929e4">pal_pi_mbed_getativehash_state_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a176daf5f8b17cca4c81a449fdf7929e4a49c1eaa2e62d6a0a52e6757b9a84c6de"></a>PAL_PI_GETATIVEHASH_UNINITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a176daf5f8b17cca4c81a449fdf7929e4a8a7e22eb2ed8c53a075b03f5105127d1"></a>PAL_PI_GETATIVEHASH_VOLUME_MANAGER_INITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a176daf5f8b17cca4c81a449fdf7929e4a2b2b81919197445bf8f8124c16e6fefb"></a>PAL_PI_GETATIVEHASH_STORAGE_DRIVER_INITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a176daf5f8b17cca4c81a449fdf7929e4a9b3aeae8375b10e62d6ed9eec032e1b6"></a>PAL_PI_GETATIVEHASH_DONE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a176daf5f8b17cca4c81a449fdf7929e4aa1ce360c32e0ce97d762ebc09f00ffc2"></a>PAL_PI_GETATIVEHASH_ERROR </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="aea34e881864ec5991b8f41d4db2f20d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#aea34e881864ec5991b8f41d4db2f20d6">pal_pi_mbed_read_state_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="aea34e881864ec5991b8f41d4db2f20d6a5051dc71cfb98868baf2019cad9145c9"></a>PAL_PI_READ_SKIP_METADATA </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="aea34e881864ec5991b8f41d4db2f20d6affb00f509bebfc9107a3704e8153fe8a"></a>PAL_PI_READ_UNINITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="aea34e881864ec5991b8f41d4db2f20d6a83af438c78b1a2f3296100142477bb57"></a>PAL_PI_READ_DONE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="aea34e881864ec5991b8f41d4db2f20d6a70b722a803e391eadfb77cb1c09f73ac"></a>PAL_PI_READ_ERROR </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="a4c6cd7eb99781c3e521d223f31eb85d4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a4c6cd7eb99781c3e521d223f31eb85d4">pal_pi_mbed_setup_state_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a4c6cd7eb99781c3e521d223f31eb85d4a4f3b72371167ccaa8ce733cb24ca6c1d"></a>PAL_PI_SETUP_UNINITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a4c6cd7eb99781c3e521d223f31eb85d4ae464fa95827d6a705b47c3d078448c86"></a>PAL_PI_SETUP_VOLUME_MANAGER_INITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a4c6cd7eb99781c3e521d223f31eb85d4a1e88752d489258b3ed3e8fd74a906b8c"></a>PAL_PI_SETUP_STORAGE_DRIVER_INITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a4c6cd7eb99781c3e521d223f31eb85d4a5fcdac218b94e7828e37cea02b287e8f"></a>PAL_PI_SETUP_DONE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a4c6cd7eb99781c3e521d223f31eb85d4a8aa67fddbf4a8a17f86d450d94dd1657"></a>PAL_PI_SETUP_ERROR </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="afbf088d926918e852b1eebfaff80e133"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#afbf088d926918e852b1eebfaff80e133">pal_pi_mbed_write_state_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="afbf088d926918e852b1eebfaff80e133a03d1c45616dab53a1f70519e0e1842a3"></a>PAL_PI_WRITE_UNINITIALIZED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="afbf088d926918e852b1eebfaff80e133af7552fc42b2f4c2e8dab529e705c1aa5"></a>PAL_PI_WRITE_METADATA_LOGGED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="afbf088d926918e852b1eebfaff80e133ad6189a3b8a082992de381bcadb5b632c"></a>PAL_PI_WRITE_RESIDUAL_LOGGED </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="afbf088d926918e852b1eebfaff80e133ab73cc7d38e31a075d76deb06a633b905"></a>PAL_PI_WRITE_DONE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="afbf088d926918e852b1eebfaff80e133a570a8ce15806e78709bc46db4d8d524b"></a>PAL_PI_WRITE_ERROR </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a6f9492bd4207f64185e224edc41b92a7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">ARM_DRIVER_STORAGE ARM_Driver_Storage_ </td> + <td>(</td> + <td class="paramtype">0 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2b615289b1b228eb37ed16a7a3d97e3a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void PAL_PI_MBED_Commit_StateMachine_Advance </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a47a7120931f8aae54f5cb63431718fa1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int PAL_PI_MBED_Commit_StateMachine_Enter </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af3bb3231669b76fbb25bbd6698a88792"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int PAL_PI_MBED_GetAtiveHash_StateMachine </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a632d90687b332ec52acf7f2361fd677b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void PAL_PI_MBED_journal_callbackHandler </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">FlashJournal_OpCode_t </td> + <td class="paramname"><em>cmd_code</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="affbf3a34b064837cbffa57ea03608ab1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void PAL_PI_MBED_journalMTD_callbackHandler </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">ARM_STORAGE_OPERATION </td> + <td class="paramname"><em>operation</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="afd4ce1b11218bf2b4bea9d1d26d148eb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void PAL_PI_MBED_Read_StateMachine_Advance </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aadb42b35dc018f8357ea253b39b51016"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int PAL_PI_MBED_Read_StateMachine_Enter </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0a10f6d348c44271256ce351332a1545"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void PAL_PI_MBED_Setup_StateMachine_Advance </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aae5619ca2f906c0525a5e94abc844fae"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int PAL_PI_MBED_Setup_StateMachine_Enter </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad1c4ab554059ee9d9a4c09f1e205f18f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void PAL_PI_MBED_volumeManager_initializeCallbackHandler </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa7cba922f992a315f79a4bb253b26216"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int PAL_PI_MBED_Write_LogResidual </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2294ef45a3a4e30cd1744bb99a717a46"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void PAL_PI_MBED_Write_StateMachine_Advance </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a39cf7e2ef5b8f65f1044b68527563d0f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int PAL_PI_MBED_Write_StateMachine_Enter </td> + <td>(</td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>status</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0975a4b263074cd29ad2c048bd65fc57"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageActivate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set the imageId to be the active image (after device reset). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a9974172099eb04fa008b12c6432e832a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageDeInit </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Clear all the resources used by the pal_update APIs. </p><dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2ac43c37ca09395eaef46ac9c48747dc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageFlush </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Flush the entire image data after writing ends for imageId. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a13dee681c787b26269df36464a114bf9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetActiveHash </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>hash</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the hash value of the active image to hash buffer with max size hash maxBufferLength, and set the hash bufferLength to the hash size. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">hash</td><td>The hash and actual size of hash read. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="aac3002ca0559fa4a266f8ff7f10a653e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetActiveVersion </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>version</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the version of the active image to version buffer with the size set to version bufferLength. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">version</td><td>The version and actual size of version read. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a04bdb18ea6bbad040310007e1c7dad52"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetDirectMemAccess </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void ** </td> + <td class="paramname"><em>imagePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>imageSizeInBytes</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Verify whether the imageId is readable and set imagePtr to point to the beginning of the image in the memory and imageSizeInBytes to the image size. In case of failure sets imagePtr to NULL and returns the relevant palStatus_t error. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imagePtr</td><td>A pointer to the start of the image. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imageSizeInBytes</td><td>The size of the image. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a459d4051428d92cf6e0d960b198c87d3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageGetMaxNumberOfImages </td> + <td>(</td> + <td class="paramtype">uint8_t * </td> + <td class="paramname"><em>imageNumber</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set the imageNumber to the number of available images. You can do this through hard coded define inside the linker script. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">imageNumber</td><td>The total number of images the system supports. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a3184f4433c02437d70307b21bc755cb8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageInitAPI </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> </td> + <td class="paramname"><em>CBfunction</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set the callback function that is called before the end of each API (except imageGetDirectMemAccess). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">CBfunction</td><td>A pointer to the callback function. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1ea8421acb807fa8f769be11d3d24e7c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageReadToBuffer </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Read the max of chunk maxBufferLength bytes from the imageId with relative offset and store it in chunk buffer. Set the chunk bufferLength value to the actual number of bytes read. Note: Please use this API in case the image is not directly accessible via the imageGetDirectMemAccess function. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>The offset to start reading from. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">chunk</td><td>The data and actual bytes read. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="ab5a811ed8f4fff3a8f5317de00198ca4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageReserveSpace </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>imageSize</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Claim space in the relevant storage region for imageId with the size of the image. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">imageSize</td><td>The size of the images. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5086927381d43a2ec2818209b20c2261"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageSetHeader </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> * </td> + <td class="paramname"><em>details</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set up the details for the image header. The data is written when the image write is called for the first time. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">details</td><td>The data needed to build the image header. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a90614195d6390f9cffb77e840c1eca0e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageSetVersion </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> * </td> + <td class="paramname"><em>version</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Update the image version of imageId to version written in version buffer with version bufferLength. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">version</td><td>The image version and its length. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ad6c3c91cf0da39abb1a4a50ff089936f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageWrite </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Write the data in the chunk buffer with the size written in chunk bufferLength in the location of imageId adding the relative offset. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>The image ID. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>the relative offset to write the data into </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">chunk</td><td>A pointer to struct containing the data and the data length to write. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a66c15f74e8d3e11e449531e41d39e20a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_imageWriteHashToMemory </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const </td> + <td class="paramname"><em>hashValue</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Write the dataId stored in dataBuffer to memory accessible to the bootloader. Currently, only HASH is available. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">hashValue</td><td>The data and size of the HASH. </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="a735a834fc7071baefe08266ad9029da5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">ARM_DRIVER_STORAGE* mtd = &<a class="el" href="../../d3/d44/pal__plat__update_8cpp.html#a6f9492bd4207f64185e224edc41b92a7">ARM_Driver_Storage_</a>(0)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a531aff6f188904a2cfc794770ffad311"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">FlashJournal_t pal_pi_mbed_journal</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a120116f585e123cb4c022cae715a5b8f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">FlashJournal_Info_t pal_pi_mbed_journal_info</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0a3810ba98c634252b033b78dff47f69"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint8_t pal_pi_mbed_metadata_logged</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aba5a953cdba2ddaab784ef9696d0de02"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint8_t* pal_pi_mbed_overflow_buffer</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a3b830d51e5d967bf3b36e6a25fe39ebb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t pal_pi_mbed_overflow_buffer_size = 0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d3/dab/pal__all__test__runner_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,63 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_all_test_runner.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_all_test_runner.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +</div></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d3/dfb/pal__plat__network_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,837 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/mbedOS/Networking/pal_plat_network.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="../../dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></li><li class="navelem"><a class="el" href="../../dir_ddf5611ee10e8b15ebe1664d2c043f4e.html">Networking</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_plat_network.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d2c/pal__plat__network_8h_source.html">pal_plat_network.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +<code>#include "mbed.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a8c607fcbfa526e4485fcdb55b79b39d6"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a8c607fcbfa526e4485fcdb55b79b39d6">PAL_SOCKET_OPTION_ERROR</a>   (-1)</td></tr> +<tr class="separator:a8c607fcbfa526e4485fcdb55b79b39d6"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:abb42afef799c3d7409ba0c29d645cbaf"><td class="memItemLeft" align="right" valign="top">typedef void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf">palSelectCallbackFunction_t</a>) ()</td></tr> +<tr class="separator:abb42afef799c3d7409ba0c29d645cbaf"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ab92cca0e4facf3d62e03c0d0ca0523da"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_socketsInit</a> (void *context)</td></tr> +<tr class="separator:ab92cca0e4facf3d62e03c0d0ca0523da"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab37f007a0574ca73916b26240ff1126b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#ab37f007a0574ca73916b26240ff1126b">pal_plat_RegisterNetworkInterface</a> (void *context, uint32_t *interfaceIndex)</td></tr> +<tr class="separator:ab37f007a0574ca73916b26240ff1126b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6a2b36db2bb5d71ade0fe8cb00d3cecd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_socketsTerminate</a> (void *context)</td></tr> +<tr class="separator:a6a2b36db2bb5d71ade0fe8cb00d3cecd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a58a25ae30bb6225cc8b5344053fd705c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_socket</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, bool nonBlockingSocket, uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a58a25ae30bb6225cc8b5344053fd705c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a76c4e2adf95702c4db8f3792ae373bf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_getSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> optionName, void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *optionLength)</td></tr> +<tr class="separator:a76c4e2adf95702c4db8f3792ae373bf9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a08ea05dacec7f7d9dc892dab0318542d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_setSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, int optionName, const void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> optionLength)</td></tr> +<tr class="separator:a08ea05dacec7f7d9dc892dab0318542d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a53a267fd8ed0b7a5cf988224e95bd47c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_bind</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *myAddress, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> addressLength)</td></tr> +<tr class="separator:a53a267fd8ed0b7a5cf988224e95bd47c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa869b5eddbf4eb6aebbbb587ece84aac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_receiveFrom</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, void *buffer, size_t length, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *from, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *fromLength, size_t *bytesReceived)</td></tr> +<tr class="separator:aa869b5eddbf4eb6aebbbb587ece84aac"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a17365747ed8d29df153a336da3942187"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a17365747ed8d29df153a336da3942187">pal_plat_sendTo</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, const void *buffer, size_t length, const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *to, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> toLength, size_t *bytesSent)</td></tr> +<tr class="separator:a17365747ed8d29df153a336da3942187"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a071355a0ca4d4eece45f0ed85a9ab1da"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_close</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a071355a0ca4d4eece45f0ed85a9ab1da"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af36bf075867e5ed0be7479312469361f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#af36bf075867e5ed0be7479312469361f">pal_plat_getNumberOfNetInterfaces</a> (uint32_t *numInterfaces)</td></tr> +<tr class="separator:af36bf075867e5ed0be7479312469361f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6dc3b4c06e96b29068995809b98a935e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_getNetInterfaceInfo</a> (uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> *interfaceInfo)</td></tr> +<tr class="separator:a6dc3b4c06e96b29068995809b98a935e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a056dbb70ade63a6ebc47f1f11733b8da"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da">palSelectCallback0</a> ()</td></tr> +<tr class="separator:a056dbb70ade63a6ebc47f1f11733b8da"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4dcff46004af6c4d300d542de9c7d38e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e">palSelectCallback1</a> ()</td></tr> +<tr class="separator:a4dcff46004af6c4d300d542de9c7d38e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abe369a2a4de2c8e25ed47166f068918f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f">palSelectCallback2</a> ()</td></tr> +<tr class="separator:abe369a2a4de2c8e25ed47166f068918f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aeabad2d66db156a97447f6e22614e78c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c">palSelectCallback3</a> ()</td></tr> +<tr class="separator:aeabad2d66db156a97447f6e22614e78c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a521d96ff90d0b417e6749df8ae90bf8b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b">palSelectCallback4</a> ()</td></tr> +<tr class="separator:a521d96ff90d0b417e6749df8ae90bf8b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae937bf3f397b1642a29a44c6cf9bc075"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075">palSelectCallback5</a> ()</td></tr> +<tr class="separator:ae937bf3f397b1642a29a44c6cf9bc075"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6b99c0251a9efb7224658c8da6e3ad27"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27">palSelectCallback6</a> ()</td></tr> +<tr class="separator:a6b99c0251a9efb7224658c8da6e3ad27"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6e102ddea1bd5315a4224c2a1fdddd58"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58">palSelectCallback7</a> ()</td></tr> +<tr class="separator:a6e102ddea1bd5315a4224c2a1fdddd58"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa0c26dfeee80444e58eacab238206d09"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_socketMiniSelect</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socketsToCheck[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t numberOfSockets, <a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> *timeout, uint8_t palSocketStatus[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t *numberOfSocketsSet)</td></tr> +<tr class="separator:aa0c26dfeee80444e58eacab238206d09"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:a77af6aede7e9f4d41f8c87ebc381b517"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a77af6aede7e9f4d41f8c87ebc381b517">s_select_event_happened</a> [<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>]</td></tr> +<tr class="separator:a77af6aede7e9f4d41f8c87ebc381b517"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4f6fdfaea202b7b50e57e7253705d96e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf">palSelectCallbackFunction_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a4f6fdfaea202b7b50e57e7253705d96e">s_palSelectPalCallbackFunctions</a> [<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>] = { <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da">palSelectCallback0</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e">palSelectCallback1</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f">palSelectCallback2</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c">palSelectCallback3</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b">palSelectCallback4</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075">palSelectCallback5</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27">palSelectCallback6</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58">palSelectCallback7</a> }</td></tr> +<tr class="separator:a4f6fdfaea202b7b50e57e7253705d96e"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a8c607fcbfa526e4485fcdb55b79b39d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_SOCKET_OPTION_ERROR   (-1)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="abb42afef799c3d7409ba0c29d645cbaf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef void(* palSelectCallbackFunction_t) ()</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a53a267fd8ed0b7a5cf988224e95bd47c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_bind </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>myAddress</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>addressLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Bind a given socket to a local address. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to bind. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">myAddress</td><td>The address to bind to. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">addressLength</td><td>The length of the address passed in myAddress. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a071355a0ca4d4eece45f0ed85a9ab1da"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_close </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Close a network socket. NOTE: recieves palSocket_t* and not palSocket_t so that it can zero the socket to avoid re-use. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">socket</td><td>Release and zero socket pointed to by given pointer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a6dc3b4c06e96b29068995809b98a935e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getNetInterfaceInfo </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> * </td> + <td class="paramname"><em>interfaceInfo</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get information regarding the socket at the index/interface number given (this number is returned when registering the socket). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>The number of the interface to get information for. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">interfaceInfo</td><td>The information for the given interface number. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="af36bf075867e5ed0be7479312469361f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getNumberOfNetInterfaces </td> + <td>(</td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numInterfaces</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the number of current network interfaces (interfaces that have been registered through). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">numInterfaces</td><td>The number of interfaces after a successful call. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status as in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a76c4e2adf95702c4db8f3792ae373bf9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket for which to get options. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">optionValue</td><td>The buffer holding the option value returned by the function. </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">optionLength</td><td>The size of the buffer provided for optionValue when calling the function. After the call, it contains the length of data actually written to the optionValue buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa869b5eddbf4eb6aebbbb587ece84aac"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_receiveFrom </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>from</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>fromLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesReceived</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Receive a payload from the given socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to receive from [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the buffer for the payload data. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">from</td><td>The address that sent the payload [optional - if not required pass NULL]. </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">fromLength</td><td>The length of the 'from' address. When completed, this contains the amount of data actually written to the from address [optional - if not required pass NULL]. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesReceived</td><td>The actual amount of payload data received to the buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ab37f007a0574ca73916b26240ff1126b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_RegisterNetworkInterface </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>networkInterfaceContext</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>interfaceIndex</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Register a network interface for use with PAL sockets - must be called before other socket functions - most APIs will not work before a single interface is added. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">networkInterfaceContext</td><td>The context of the network interface to be added (OS specific. In mbed OS, this is the NetworkInterface object pointer for the network adapter [note: we assume connect has already been called on this]). - if not available use NULL (may not be required on some OSs). </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">interfaceIndex</td><td>Contains the index assigned to the interface in case it has been assigned successfully. This index can be used when creating a socket to bind the socket to the interface. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a17365747ed8d29df153a336da3942187"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_sendTo </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>to</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>toLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesSent</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Send a payload to the given address using the given socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to use for sending the payload [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">to</td><td>The address to which the payload should be sent. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">toLength</td><td>The length of the 'to' address. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesSent</td><td>The actual amount of payload data sent. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a08ea05dacec7f7d9dc892dab0318542d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_setSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket for which to get options. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionValue</td><td>The buffer holding the option value to set for the given option. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionLength</td><td>The size of the buffer provided for optionValue. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a58a25ae30bb6225cc8b5344053fd705c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socket </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> </td> + <td class="paramname"><em>domain</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> </td> + <td class="paramname"><em>type</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">bool </td> + <td class="paramname"><em>nonBlockingSocket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get a network socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">domain</td><td>The domain of the created socket (see palSocketDomain_t for supported types). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">type</td><td>The type of the created socket (see palSocketType_t for supported types). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">nonBlockingSocket</td><td>If true, the socket is non-blocking (with O_NONBLOCK set). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>The number of the network interface used for this socket (info in interfaces supported via pal_getNumberOfNetInterfaces and pal_getNetInterfaceInfo ), choose PAL_NET_DEFAULT_INTERFACE for default interface. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">socket</td><td>The socket is returned through this output parameter. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa0c26dfeee80444e58eacab238206d09"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socketMiniSelect </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socketsToCheck</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>numberOfSockets</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> * </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint8_t </td> + <td class="paramname"><em>palSocketStatus</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numberOfSocketsSet</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Check if one or more (up to PAL_NET_SOCKET_SELECT_MAX_SOCKETS) sockets has data available for reading/writing/error. The function blocks until data is available for one of the given sockets or the timeout expires. To use the function, set the sockets you want to check in the socketsToCheck array and set a timeout. When it returns the socketStatus output inidcates the status of each socket passed in. Note: The entry in index x in the socketStatus array corresponds to the socket at index x in the sockets to check array. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socketsToCheck</td><td>The array of up to 8 socket handles to check. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">numberOfSockets</td><td>The number of sockets set in the input socketsToCheck array. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>The time until timeout if no socket activity is detected. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">palSocketStatus</td><td>Information on each socket in the input array indicating which event was set (none, rx, tx, err). Check for a desired event using macros. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">numberOfSocketsSet</td><td>The total number of sockets set in all three data sets (tx, rx, err) after a completed function. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ab92cca0e4facf3d62e03c0d0ca0523da"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socketsInit </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>context</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL network socket API PAL network sockets configurations options: define PAL_NET_TCP_AND_TLS_SUPPORT if TCP is supported by the platform and is required. define PAL_NET_ASYNCHRONOUS_SOCKET_API if asynchronous socket API is supported by the platform. Currently MANDATORY. define PAL_NET_DNS_SUPPORT if DNS name resolution is supported. </p><pre class="fragment">Initialize sockets - must be called before other socket functions (is called from PAL init). +</pre> <dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">context</td><td>Optional context - if not available/applicable use NULL. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a6a2b36db2bb5d71ade0fe8cb00d3cecd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socketsTerminate </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>context</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initialize terminate - can be called when sockets are no longer needed to free socket resources allocated by init. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">context</td><td>Optional context - if not available use NULL. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a056dbb70ade63a6ebc47f1f11733b8da"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback0 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4dcff46004af6c4d300d542de9c7d38e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback1 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abe369a2a4de2c8e25ed47166f068918f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback2 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aeabad2d66db156a97447f6e22614e78c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback3 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a521d96ff90d0b417e6749df8ae90bf8b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback4 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ae937bf3f397b1642a29a44c6cf9bc075"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback5 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6b99c0251a9efb7224658c8da6e3ad27"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback6 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6e102ddea1bd5315a4224c2a1fdddd58"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palSelectCallback7 </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="a4f6fdfaea202b7b50e57e7253705d96e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf">palSelectCallbackFunction_t</a> s_palSelectPalCallbackFunctions[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>] = { <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da">palSelectCallback0</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e">palSelectCallback1</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f">palSelectCallback2</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c">palSelectCallback3</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b">palSelectCallback4</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075">palSelectCallback5</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27">palSelectCallback6</a>, <a class="el" href="../../d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58">palSelectCallback7</a> }</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a77af6aede7e9f4d41f8c87ebc381b517"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t s_select_event_happened[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>]</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d4/d01/pal__rtos_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1452 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_rtos.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#nested-classes">Data Structures</a> | +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#enum-members">Enumerations</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include <stdint.h></code><br /> +<code>#include "<a class="el" href="../../db/dcf/pal__macros_8h_source.html">pal_macros.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>"</code><br /> +</div> +<p><a href="../../d4/d01/pal__rtos_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> +Data Structures</h2></td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d48/structpal__thread_local_store.html">pal_threadLocalStore</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:ad19aa2a408e848a5f86d897ab50500ec"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ad19aa2a408e848a5f86d897ab50500ec">PAL_RTOS_WAIT_FOREVER</a>   <a class="el" href="../../db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e">PAL_MAX_UINT32</a></td></tr> +<tr class="memdesc:ad19aa2a408e848a5f86d897ab50500ec"><td class="mdescLeft"> </td><td class="mdescRight">Wait forever define. used for Semaphores and Mutexes. <a href="#ad19aa2a408e848a5f86d897ab50500ec">More...</a><br /></td></tr> +<tr class="separator:ad19aa2a408e848a5f86d897ab50500ec"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2e5b95b90c72b6bdf62897efd58f98fb"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb">PAL_PRINTF</a>(ARGS...)   <a class="el" href="../../d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353">dbgPrintf</a>(__FUNCTION__,__LINE__, ARGS);</td></tr> +<tr class="separator:a2e5b95b90c72b6bdf62897efd58f98fb"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:aa61aba50e0f2dba5c8571417c2bdd9a5"><td class="memItemLeft" align="right" valign="top">typedef uintptr_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a></td></tr> +<tr class="memdesc:aa61aba50e0f2dba5c8571417c2bdd9a5"><td class="mdescLeft"> </td><td class="mdescRight">Primitives IDs types declarations. <a href="#aa61aba50e0f2dba5c8571417c2bdd9a5">More...</a><br /></td></tr> +<tr class="separator:aa61aba50e0f2dba5c8571417c2bdd9a5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4b627efa48e79a6fbcafae87ae397985"><td class="memItemLeft" align="right" valign="top">typedef uintptr_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a></td></tr> +<tr class="separator:a4b627efa48e79a6fbcafae87ae397985"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac6b402eec0e5f2ab64c43abffd4d9901"><td class="memItemLeft" align="right" valign="top">typedef uintptr_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a></td></tr> +<tr class="separator:ac6b402eec0e5f2ab64c43abffd4d9901"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0a8206fc36c3dca549aed450f7777481"><td class="memItemLeft" align="right" valign="top">typedef uintptr_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a></td></tr> +<tr class="separator:a0a8206fc36c3dca549aed450f7777481"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a73ab99198ebc6e6af72064739b05bdcb"><td class="memItemLeft" align="right" valign="top">typedef uintptr_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a></td></tr> +<tr class="separator:a73ab99198ebc6e6af72064739b05bdcb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acb4162ac097039734d15916d29880910"><td class="memItemLeft" align="right" valign="top">typedef uintptr_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a></td></tr> +<tr class="separator:acb4162ac097039734d15916d29880910"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9858103df451aaf98a8af08c2583b94a"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">palTimerType</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a></td></tr> +<tr class="memdesc:a9858103df451aaf98a8af08c2583b94a"><td class="mdescLeft"> </td><td class="mdescRight">Timers types supported in PAL. <a href="#a9858103df451aaf98a8af08c2583b94a">More...</a><br /></td></tr> +<tr class="separator:a9858103df451aaf98a8af08c2583b94a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a21fd378211ce09c12c15c39ff579627b"><td class="memItemLeft" align="right" valign="top">typedef void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a>) (void const *funcArgument)</td></tr> +<tr class="memdesc:a21fd378211ce09c12c15c39ff579627b"><td class="mdescLeft"> </td><td class="mdescRight">PAL timer function prototype. <a href="#a21fd378211ce09c12c15c39ff579627b">More...</a><br /></td></tr> +<tr class="separator:a21fd378211ce09c12c15c39ff579627b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a54696b00a498a3c4a1346030acd18853"><td class="memItemLeft" align="right" valign="top">typedef void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a>) (void const *funcArgument)</td></tr> +<tr class="memdesc:a54696b00a498a3c4a1346030acd18853"><td class="mdescLeft"> </td><td class="mdescRight">PAL thread function prototype. <a href="#a54696b00a498a3c4a1346030acd18853">More...</a><br /></td></tr> +<tr class="separator:a54696b00a498a3c4a1346030acd18853"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a278568ee407204e02cbd783f612e55be"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_osPriority</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a></td></tr> +<tr class="memdesc:a278568ee407204e02cbd783f612e55be"><td class="mdescLeft"> </td><td class="mdescRight">Available priorities in PAL implementation, each priority can appear only once. <a href="#a278568ee407204e02cbd783f612e55be">More...</a><br /></td></tr> +<tr class="separator:a278568ee407204e02cbd783f612e55be"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a381fb3b26136f4983dcce371652fb20c"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../df/d48/structpal__thread_local_store.html">pal_threadLocalStore</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a></td></tr> +<tr class="separator:a381fb3b26136f4983dcce371652fb20c"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a> +Enumerations</h2></td></tr> +<tr class="memitem:a7ee094f262d03cbc97380f3fcd34c7d2"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">palTimerType</a> { <a class="el" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30">palOsTimerOnce</a> = 0, +<a class="el" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9">palOsTimerPeriodic</a> = 1 + }<tr class="memdesc:a7ee094f262d03cbc97380f3fcd34c7d2"><td class="mdescLeft"> </td><td class="mdescRight">Timers types supported in PAL. <a href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">More...</a><br /></td></tr> +</td></tr> +<tr class="separator:a7ee094f262d03cbc97380f3fcd34c7d2"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6f32dbade90ba4bf593f475f51fb6535"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_osPriority</a> { <br /> +  <a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a">PAL_osPriorityIdle</a> = -3, +<a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec">PAL_osPriorityLow</a> = -2, +<a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5">PAL_osPriorityBelowNormal</a> = -1, +<a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1">PAL_osPriorityNormal</a> = 0, +<br /> +  <a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af">PAL_osPriorityAboveNormal</a> = +1, +<a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2">PAL_osPriorityHigh</a> = +2, +<a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce">PAL_osPriorityRealtime</a> = +3, +<a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e">PAL_osPriorityError</a> = 0x84 +<br /> + }<tr class="memdesc:a6f32dbade90ba4bf593f475f51fb6535"><td class="mdescLeft"> </td><td class="mdescRight">Available priorities in PAL implementation, each priority can appear only once. <a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">More...</a><br /></td></tr> +</td></tr> +<tr class="separator:a6f32dbade90ba4bf593f475f51fb6535"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ab8ab0f31bbf4258b7684d22e7725a9f8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_osReboot</a> (void)</td></tr> +<tr class="separator:ab8ab0f31bbf4258b7684d22e7725a9f8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9800b8b9e057fe17e50c4259c809f898"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898">pal_osKernelSysTick</a> (void)</td></tr> +<tr class="separator:a9800b8b9e057fe17e50c4259c809f898"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af88551b6ca24a7a2bb6d94d423eb4401"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_osKernelSysTick64</a> (void)</td></tr> +<tr class="separator:af88551b6ca24a7a2bb6d94d423eb4401"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a34375ee82619a4064849daccbdfbc966"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966">pal_osKernelSysTickMicroSec</a> (uint64_t microseconds)</td></tr> +<tr class="separator:a34375ee82619a4064849daccbdfbc966"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a59e85747582417a1395ed0f9c140eb8a"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a">pal_osKernelSysMilliSecTick</a> (uint64_t sysTicks)</td></tr> +<tr class="separator:a59e85747582417a1395ed0f9c140eb8a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a087214ae87c20fd59f47fe3c96d0eefc"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_osKernelSysTickFrequency</a> (void)</td></tr> +<tr class="separator:a087214ae87c20fd59f47fe3c96d0eefc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2dae64d917f644982b893037adf562b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4">pal_osThreadCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> priority, uint32_t stackSize, uint32_t *stackPtr, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> *store, <a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:a2dae64d917f644982b893037adf562b4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abcfa47b411929b33d5d9cfaaff28ce18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_osThreadTerminate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:abcfa47b411929b33d5d9cfaaff28ce18"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2993b8f6b5e8d7ccd6121dc18330e4be"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_osThreadGetId</a> (void)</td></tr> +<tr class="separator:a2993b8f6b5e8d7ccd6121dc18330e4be"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac94f4efc4bad73969e57c8255c136a0d"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d">pal_osThreadGetLocalStore</a> (void)</td></tr> +<tr class="separator:ac94f4efc4bad73969e57c8255c136a0d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad6aaee432fd7ea5e35ab500a6278cc25"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_osDelay</a> (uint32_t milliseconds)</td></tr> +<tr class="separator:ad6aaee432fd7ea5e35ab500a6278cc25"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa4da36fbbba744a14d1bdfe2a26d1a18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_osTimerCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> timerType, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:aa4da36fbbba744a14d1bdfe2a26d1a18"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6c60c9e433bc6005bac6b02d5aba7363"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_osTimerStart</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID, uint32_t millisec)</td></tr> +<tr class="separator:a6c60c9e433bc6005bac6b02d5aba7363"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a94f4df594102e582cbd2114f6eebb57d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d">pal_osTimerStop</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID)</td></tr> +<tr class="separator:a94f4df594102e582cbd2114f6eebb57d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac7ca6e7c3c229f4092c9df4b69e7dd59"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_osTimerDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:ac7ca6e7c3c229f4092c9df4b69e7dd59"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af89aab14085207b1a0951f7aad24193c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c">pal_osMutexCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:af89aab14085207b1a0951f7aad24193c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acda0974247325955719b23494d66c622"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622">pal_osMutexWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID, uint32_t millisec)</td></tr> +<tr class="separator:acda0974247325955719b23494d66c622"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1d976a616a5c850b2016b2b87d8b47cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_osMutexRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID)</td></tr> +<tr class="separator:a1d976a616a5c850b2016b2b87d8b47cc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a03f43d7e53435d89f316862b48b573c4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4">pal_osMutexDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:a03f43d7e53435d89f316862b48b573c4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aaa7aee442a5c8cc274d3e52206984037"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037">pal_osSemaphoreCreate</a> (uint32_t count, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:aaa7aee442a5c8cc274d3e52206984037"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa2d998744dbc9504bfe0358f85457fc4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4">pal_osSemaphoreWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID, uint32_t millisec, int32_t *countersAvailable)</td></tr> +<tr class="separator:aa2d998744dbc9504bfe0358f85457fc4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a009d0c063119265f9c5c0c9bff379c14"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14">pal_osSemaphoreRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID)</td></tr> +<tr class="separator:a009d0c063119265f9c5c0c9bff379c14"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a45f071482f8669821b90264e0470b33d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d">pal_osSemaphoreDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:a45f071482f8669821b90264e0470b33d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1245f053abb3fdb7ab2ceb5a2899e8c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_osPoolCreate</a> (uint32_t blockSize, uint32_t blockCount, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a1245f053abb3fdb7ab2ceb5a2899e8c6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3a2b57685096d16a110ee38f7f29e099"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099">pal_osPoolAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a3a2b57685096d16a110ee38f7f29e099"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5d20661cd387a172450a2fe12993687a"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a">pal_osPoolCAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a5d20661cd387a172450a2fe12993687a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a79f4997069310aa7bbb6ae7995988dd7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7">pal_osPoolFree</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID, void *block)</td></tr> +<tr class="separator:a79f4997069310aa7bbb6ae7995988dd7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1c01464448f8d7bd95bf518d651484c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6">pal_osPoolDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a1c01464448f8d7bd95bf518d651484c6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0c7f0003e92b3494089966d53ab24a1b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b">pal_osMessageQueueCreate</a> (uint32_t messageQSize, <a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:a0c7f0003e92b3494089966d53ab24a1b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a966daa5b0bd9282fbffa7c462da1c417"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417">pal_osMessagePut</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t info, uint32_t timeout)</td></tr> +<tr class="separator:a966daa5b0bd9282fbffa7c462da1c417"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab70d0be45514258874c0406c2040372c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c">pal_osMessageGet</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t timeout, uint32_t *messageValue)</td></tr> +<tr class="separator:ab70d0be45514258874c0406c2040372c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:adba13212ec060092acdf6165e82be5b6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6">pal_osMessageQueueDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:adba13212ec060092acdf6165e82be5b6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9b33d260ee1022f5b5f6a9dfc3363f2a"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_osAtomicIncrement</a> (int32_t *valuePtr, int32_t increment)</td></tr> +<tr class="separator:a9b33d260ee1022f5b5f6a9dfc3363f2a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2b4f475c89ea263557d6529c4d9a9353"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353">dbgPrintf</a> (const char *function, uint32_t line, const char *format,...)</td></tr> +<tr class="separator:a2b4f475c89ea263557d6529c4d9a9353"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a2e5b95b90c72b6bdf62897efd58f98fb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_PRINTF</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">ARGS...</td><td>)</td> + <td>   <a class="el" href="../../d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353">dbgPrintf</a>(__FUNCTION__,__LINE__, ARGS);</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad19aa2a408e848a5f86d897ab50500ec"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_RTOS_WAIT_FOREVER   <a class="el" href="../../db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e">PAL_MAX_UINT32</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Wait forever define. used for Semaphores and Mutexes. </p> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="a73ab99198ebc6e6af72064739b05bdcb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uintptr_t <a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="acb4162ac097039734d15916d29880910"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uintptr_t <a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac6b402eec0e5f2ab64c43abffd4d9901"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uintptr_t <a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0a8206fc36c3dca549aed450f7777481"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uintptr_t <a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a54696b00a498a3c4a1346030acd18853"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef void(* palThreadFuncPtr) (void const *funcArgument)</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>PAL thread function prototype. </p> + +</div> +</div> +<a class="anchor" id="aa61aba50e0f2dba5c8571417c2bdd9a5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uintptr_t <a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Primitives IDs types declarations. </p> + +</div> +</div> +<a class="anchor" id="a381fb3b26136f4983dcce371652fb20c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../df/d48/structpal__thread_local_store.html">pal_threadLocalStore</a> <a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Thread priority levels for PAL threads - each thread must have a different priority Thread Local Store struct. Can be used to hold: State, configurations and etc inside the thread. </p> + +</div> +</div> +<a class="anchor" id="a278568ee407204e02cbd783f612e55be"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef enum <a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_osPriority</a> <a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Available priorities in PAL implementation, each priority can appear only once. </p> + +</div> +</div> +<a class="anchor" id="a21fd378211ce09c12c15c39ff579627b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef void(* palTimerFuncPtr) (void const *funcArgument)</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>PAL timer function prototype. </p> + +</div> +</div> +<a class="anchor" id="a4b627efa48e79a6fbcafae87ae397985"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uintptr_t <a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9858103df451aaf98a8af08c2583b94a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef enum <a class="el" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">palTimerType</a> <a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Timers types supported in PAL. </p> + +</div> +</div> +<h2 class="groupheader">Enumeration Type Documentation</h2> +<a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_osPriority</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Available priorities in PAL implementation, each priority can appear only once. </p> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a"></a>PAL_osPriorityIdle </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec"></a>PAL_osPriorityLow </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5"></a>PAL_osPriorityBelowNormal </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1"></a>PAL_osPriorityNormal </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af"></a>PAL_osPriorityAboveNormal </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2"></a>PAL_osPriorityHigh </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce"></a>PAL_osPriorityRealtime </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e"></a>PAL_osPriorityError </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="a7ee094f262d03cbc97380f3fcd34c7d2"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">palTimerType</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Timers types supported in PAL. </p> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30"></a>palOsTimerOnce </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9"></a>palOsTimerPeriodic </td><td class="fielddoc"> +<p>One shot timer </p> +</td></tr> +</table> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a2b4f475c89ea263557d6529c4d9a9353"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void dbgPrintf </td> + <td>(</td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>line</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>format</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname"><em>...</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Printf like function with prefix of function and line.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>name of the current function </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">line</td><td>line number to be printed </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>print format (just like printf)</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the value of the valuePtr after the increment operation. </dd></dl> + +</div> +</div> +<a class="anchor" id="a9b33d260ee1022f5b5f6a9dfc3363f2a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int32_t pal_osAtomicIncrement </td> + <td>(</td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>valuePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>increment</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Perform an atomic increment for a signed32 bit value</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">valuePtr</td><td>the address of the value to increment </td></tr> + <tr><td class="paramdir"></td><td class="paramname"></td><td></td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="ad6aaee432fd7ea5e35ab500a6278cc25"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osDelay </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>milliseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait for a specified time period in milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">milliseconds</td><td>the amount of milliseconds to wait before proceeding.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a59e85747582417a1395ed0f9c140eb8a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysMilliSecTick </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>sysTicks</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Converts value from kernel system ticks to milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">sysTicks</td><td>the amount of kernel system ticks to convert into millieseconds</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>converted value in system ticks </dd></dl> + +</div> +</div> +<a class="anchor" id="a9800b8b9e057fe17e50c4259c809f898"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t pal_osKernelSysTick </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the RTOS kernel system timer counter. </p><dl class="section note"><dt>Note</dt><dd>this counter will wrap around very often (e.g. once every 42 sec for 100Mhz) </dd></dl> +<dl class="section return"><dt>Returns</dt><dd>the RTOS kernel system timer counter </dd></dl> + +</div> +</div> +<a class="anchor" id="af88551b6ca24a7a2bb6d94d423eb4401"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysTick64 </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the RTOS kernel system timer counter. </p><dl class="section return"><dt>Returns</dt><dd>the RTOS kernel system timer counter </dd></dl> + +</div> +</div> +<a class="anchor" id="a087214ae87c20fd59f47fe3c96d0eefc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysTickFrequency </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the system tick frequency </p><dl class="section return"><dt>Returns</dt><dd>the system tick frequency </dd></dl> + +</div> +</div> +<a class="anchor" id="a34375ee82619a4064849daccbdfbc966"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysTickMicroSec </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>microseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Converts value from microseconds to kernel sys tick</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">microseconds</td><td>the amount of microseconds to convert into system ticks</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>converted value in system ticks </dd></dl> + +</div> +</div> +<a class="anchor" id="ab70d0be45514258874c0406c2040372c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessageGet </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>messageValue</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get a Message or Wait for a Message from a Queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>the handle for the memory pool </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>timeout in milliseconds </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">event</td><td>the data to send</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - in case semaphore was not available but not due to time out. PAL_ERR_RTOS_TIMEOUT - no message arrived during the timeout period. PAL_ERR_RTOS_RESOURCE - no message received and there was no timeout </dd></dl> + +</div> +</div> +<a class="anchor" id="a966daa5b0bd9282fbffa7c462da1c417"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessagePut </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>info</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Put a Message to a Queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>the handle for the memory pool </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">info</td><td>the data to send </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>timeout in milliseconds</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a0c7f0003e92b3494089966d53ab24a1b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessageQueueCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>messageQSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a message queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQSize</td><td>size of the message queue. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">memoryPoolID</td><td>holds the created memory pool ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when message queue created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create message queue object. </dd></dl> + +</div> +</div> +<a class="anchor" id="adba13212ec060092acdf6165e82be5b6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessageQueueDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a message queue object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">messageQID</td><td>the handle for the message queue, in success:(*messageQID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="af89aab14085207b1a0951f7aad24193c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize Mutex object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">mutexID</td><td>holds the created mutex ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when mutex created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create mutex object. </dd></dl> + +</div> +</div> +<a class="anchor" id="a03f43d7e53435d89f316862b48b573c4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a Mutex object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">mutexID</td><td>Mutex handle to delete, in success:(*mutexID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when mutex deleted successfully. PAL_ERR_RTOS_RESOURCE - mutex already released. PAL_ERR_RTOS_PARAMETER - mutex id is invalid. PAL_ERR_RTOS_ISR - cannot be called from interrupt service routines. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call the mutex_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1d976a616a5c850b2016b2b87d8b47cc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a Mutex that was obtained by osMutexWait.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>the handle for the mutex </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="acda0974247325955719b23494d66c622"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a Mutex becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>the handle for the mutex </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>the timeout for the waiting operation if the timeout expires before the semaphore is released and error will be returned from the function, PAL_RTOS_WAIT_FOREVER can be used.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - mutex not avaialbe but no time out set. PAL_ERR_RTOS_TIMEOUT - mutex was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - mutex id is invalid PAL_ERR_RTOS_ISR - cannot be called from interrupt service routines </dd></dl> + +</div> +</div> +<a class="anchor" id="a3a2b57685096d16a110ee38f7f29e099"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_osPoolAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>the handle for the memory pool</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns a pointer to a single allocated memory from the pool or NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5d20661cd387a172450a2fe12993687a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_osPoolCAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool and set memory block to zero.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>the handle for the memory pool</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns a pointer to a single allocated memory from the pool or NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1245f053abb3fdb7ab2ceb5a2899e8c6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osPoolCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockCount</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">blockSize</td><td>size of single block in bytes. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">blockCount</td><td>maximum number of blocks in memory pool. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">memoryPoolID</td><td>holds the created memory pool ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when memory pool created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create memory pool object. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1c01464448f8d7bd95bf518d651484c6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osPoolDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a memory pool object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">memoryPoolID</td><td>the handle for the memory pool, in success:(*memoryPoolID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a79f4997069310aa7bbb6ae7995988dd7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osPoolFree </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>block</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Return an memoryPoolID memory block back to a specific memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolHandle</td><td>the handle for the memory pool </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">block</td><td>the block to free</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="ab8ab0f31bbf4258b7684d22e7725a9f8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_osReboot </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initiates a system reboot </p> + +</div> +</div> +<a class="anchor" id="aaa7aee442a5c8cc274d3e52206984037"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>count</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a Semaphore object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">count</td><td>number of available resources </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">semaphoreID</td><td>holds the created semaphore ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when semaphore created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create semaphore object. </dd></dl> + +</div> +</div> +<a class="anchor" id="a45f071482f8669821b90264e0470b33d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a Semaphore object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">semaphoreID</td><td>Semaphore handle to delete, in success:(*semaphoreID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when semaphore deleted successfully. PAL_ERR_RTOS_RESOURCE - semaphore already released. PAL_ERR_RTOS_PARAMETER - semaphore id is invalid. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call the semaphore_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="a009d0c063119265f9c5c0c9bff379c14"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a Semaphore token.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>the handle for the semaphore</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aa2d998744dbc9504bfe0358f85457fc4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>countersAvailable</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a Semaphore token becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>the handle for the semaphore </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>the timeout for the waiting operation if the timeout expires before the semaphore is released and error will be returned from the function, PAL_RTOS_WAIT_FOREVER can be used. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">counteresAvailable</td><td>the number of semaphore available at the call if semaphore is available, if semaphore was not available (timeout/error) zero is returned. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and one of the following error codes in case of failure: PAL_ERR_RTOS_TIMEOUT - semaphore was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - semaphore id is invalid. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2dae64d917f644982b893037adf562b4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osThreadCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> </td> + <td class="paramname"><em>priority</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>stackSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>stackPtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> * </td> + <td class="paramname"><em>store</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Creates and starts thread function.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>function pointer to the thread callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>argument for the thread function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">priority</td><td>priotity of the thread. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackSize</td><td>the stack size of the thread can NOT be 0. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackPtr</td><td>pointer to the thread's stack can NOT be NULL. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">store</td><td>pointer to thread's local sotre, can be NULL. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">threadID</td><td>holds the created thread ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when thread created successfully. PAL_ERR_RTOS_PRIORITY : the given priority already used before in the system.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>Each thread MUST be with unique priority. </dd> +<dd> +When the priority of the created thread function is higher than the current running thread, the created thread function starts instantly and becomes the new running thread. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2993b8f6b5e8d7ccd6121dc18330e4be"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> pal_osThreadGetId </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get ID of the current thread </p><dl class="section return"><dt>Returns</dt><dd>the ID of the current thread - in case of error return PAL_MAX_UINT32 </dd></dl> +<dl class="section note"><dt>Note</dt><dd>for thread with Real Time priority the function will always return PAL_MAX_UINT32 </dd></dl> + +</div> +</div> +<a class="anchor" id="ac94f4efc4bad73969e57c8255c136a0d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_osThreadGetLocalStore </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the storage of current thread </p><dl class="section return"><dt>Returns</dt><dd>the storage of the current thread </dd></dl> + +</div> +</div> +<a class="anchor" id="abcfa47b411929b33d5d9cfaaff28ce18"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osThreadTerminate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Terminates and free allocated data for the thread.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">threadID</td><td>thread ID to stop and terminate.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure PAL_ERR_RTOS_RESOURCE: if the thread ID is not correct. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa4da36fbbba744a14d1bdfe2a26d1a18"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> </td> + <td class="paramname"><em>timerType</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Creates a Timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>function pointer to the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>funcArgument for the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timerType</td><td>timer type to be created - (periodic or oneShot). </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">timerID</td><td>holds the created timer ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when timer created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create timer object.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>the timer function runs according to the platform resources of stack-size and priority. </dd></dl> + +</div> +</div> +<a class="anchor" id="ac7ca6e7c3c229f4092c9df4b69e7dd59"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete the timer object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">timerID</td><td>the handle for the timer to delete, in success:(*timerID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when timer deleted successfully. PAL_ERR_RTOS_PARAMETER when timerID is incorrect. </dd></dl> + +</div> +</div> +<a class="anchor" id="a6c60c9e433bc6005bac6b02d5aba7363"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerStart </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Start or restart a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>the handle for the timer to start </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>the amount of time in milliseconds to set the timer to.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a94f4df594102e582cbd2114f6eebb57d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerStop </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Stop a timer. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>the handle for the timer to stop </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d4/d01/pal__rtos_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,123 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_rtos.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_rtos.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d4/d01/pal__rtos_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_RTOS_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_RTOS_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include <stdint.h></span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include "<a class="code" href="../../db/dcf/pal__macros_8h.html">pal_macros.h</a>"</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include "<a class="code" href="../../d6/dc2/pal__types_8h.html">pal_types.h</a>"</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#ad19aa2a408e848a5f86d897ab50500ec"> 31</a></span> <span class="preprocessor">#define PAL_RTOS_WAIT_FOREVER PAL_MAX_UINT32</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5"> 34</a></span> <span class="keyword">typedef</span> uintptr_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a>;</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985"> 35</a></span> <span class="keyword">typedef</span> uintptr_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a>;</div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901"> 36</a></span> <span class="keyword">typedef</span> uintptr_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481"> 37</a></span> <span class="keyword">typedef</span> uintptr_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb"> 38</a></span> <span class="keyword">typedef</span> uintptr_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910"> 39</a></span> <span class="keyword">typedef</span> uintptr_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2"> 42</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">palTimerType</a> {</div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30"> 43</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30">palOsTimerOnce</a> = 0, </div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9"> 44</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9">palOsTimerPeriodic</a> = 1 </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> } <a class="code" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a>;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b"> 48</a></span> <span class="keyword">typedef</span> void(*<a class="code" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a>)(<span class="keywordtype">void</span> <span class="keyword">const</span> *funcArgument);</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853"> 51</a></span> <span class="keyword">typedef</span> void(*<a class="code" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a>)(<span class="keywordtype">void</span> <span class="keyword">const</span> *funcArgument); </div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535"> 54</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_osPriority</a> {</div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a"> 55</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a">PAL_osPriorityIdle</a> = -3,</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec"> 56</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec">PAL_osPriorityLow</a> = -2,</div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5"> 57</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5">PAL_osPriorityBelowNormal</a> = -1,</div><div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1"> 58</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1">PAL_osPriorityNormal</a> = 0,</div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af"> 59</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af">PAL_osPriorityAboveNormal</a> = +1,</div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2"> 60</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2">PAL_osPriorityHigh</a> = +2,</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce"> 61</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce">PAL_osPriorityRealtime</a> = +3,</div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e"> 62</a></span>  <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e">PAL_osPriorityError</a> = 0x84</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> } <a class="code" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a>; </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../df/d48/structpal__thread_local_store.html">pal_threadLocalStore</a>{</div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="../../df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc"> 68</a></span>  <span class="keywordtype">void</span>* <a class="code" href="../../df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc">storeData</a>;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> } <a class="code" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a>;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment">//------- system general functions</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="comment"></span><span class="keywordtype">void</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_osReboot</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment">//------- system tick functions</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="comment"></span>uint32_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898">pal_osKernelSysTick</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> uint64_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_osKernelSysTick64</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> </div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> uint64_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966">pal_osKernelSysTickMicroSec</a>(uint64_t microseconds);</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> uint64_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a">pal_osKernelSysMilliSecTick</a>(uint64_t sysTicks);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> uint64_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_osKernelSysTickFrequency</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4">pal_osThreadCreate</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> <span class="keyword">function</span>, <span class="keywordtype">void</span>* funcArgument, <a class="code" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> priority, uint32_t stackSize, uint32_t* stackPtr, <a class="code" href="../../df/d48/structpal__thread_local_store.html">palThreadLocalStore_t</a>* store, palThreadID_t* threadID);</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> </div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_osThreadTerminate</a>(palThreadID_t* threadID);</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> </div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> palThreadID_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_osThreadGetId</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="keywordtype">void</span>* <a class="code" href="../../d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d">pal_osThreadGetLocalStore</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_osDelay</a>(uint32_t milliseconds);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_osTimerCreate</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> <span class="keyword">function</span>, <span class="keywordtype">void</span>* funcArgument, <a class="code" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> timerType, palTimerID_t* timerID);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> </div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_osTimerStart</a>(palTimerID_t timerID, uint32_t millisec);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d">pal_osTimerStop</a>(palTimerID_t timerID);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_osTimerDelete</a>(palTimerID_t* timerID);</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> </div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c">pal_osMutexCreate</a>(palMutexID_t* mutexID);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622">pal_osMutexWait</a>(palMutexID_t mutexID, uint32_t millisec);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> </div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_osMutexRelease</a>(palMutexID_t mutexID);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> </div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4">pal_osMutexDelete</a>(palMutexID_t* mutexID);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span> </div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037">pal_osSemaphoreCreate</a>(uint32_t count, palSemaphoreID_t* semaphoreID);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> </div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4">pal_osSemaphoreWait</a>(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t* countersAvailable);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14">pal_osSemaphoreRelease</a>(palSemaphoreID_t semaphoreID);</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> </div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d">pal_osSemaphoreDelete</a>(palSemaphoreID_t* semaphoreID);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> </div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_osPoolCreate</a>(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t* memoryPoolID);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> <span class="keywordtype">void</span>* <a class="code" href="../../d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099">pal_osPoolAlloc</a>(palMemoryPoolID_t memoryPoolID);</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <span class="keywordtype">void</span>* <a class="code" href="../../d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a">pal_osPoolCAlloc</a>(palMemoryPoolID_t memoryPoolID);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7">pal_osPoolFree</a>(palMemoryPoolID_t memoryPoolID, <span class="keywordtype">void</span>* block);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> </div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6">pal_osPoolDestroy</a>(palMemoryPoolID_t* memoryPoolID);</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> </div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b">pal_osMessageQueueCreate</a>(uint32_t messageQSize, palMessageQID_t* messageQID);</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> </div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417">pal_osMessagePut</a>(palMessageQID_t messageQID, uint32_t info, uint32_t timeout);</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> </div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c">pal_osMessageGet</a>(palMessageQID_t messageQID, uint32_t timeout, uint32_t* messageValue);</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> </div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6">pal_osMessageQueueDestroy</a>(palMessageQID_t* messageQID);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> </div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> int32_t <a class="code" href="../../d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_osAtomicIncrement</a>(int32_t* valuePtr, int32_t increment);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> </div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> </div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> </div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> <span class="keywordtype">void</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353">dbgPrintf</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">function</span>, uint32_t line, <span class="keyword">const</span> <span class="keywordtype">char</span> * format, ... );</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span> </div><div class="line"><a name="l00387"></a><span class="lineno"><a class="line" href="../../d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb"> 387</a></span> <span class="preprocessor">#define PAL_PRINTF( ARGS...) \</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> <span class="preprocessor"> dbgPrintf(__FUNCTION__,__LINE__, ARGS);</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> </div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> </div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> </div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span> </div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span> </div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> }</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span> <span class="preprocessor">#endif //_PAL_RTOS_H</span></div><div class="ttc" id="pal__rtos_8h_html_a009d0c063119265f9c5c0c9bff379c14"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14">pal_osSemaphoreRelease</a></div><div class="ttdeci">palStatus_t pal_osSemaphoreRelease(palSemaphoreID_t semaphoreID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:205</div></div> +<div class="ttc" id="pal__rtos_8h_html_a9b33d260ee1022f5b5f6a9dfc3363f2a"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_osAtomicIncrement</a></div><div class="ttdeci">int32_t pal_osAtomicIncrement(int32_t *valuePtr, int32_t increment)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:284</div></div> +<div class="ttc" id="pal__rtos_8h_html_a0a8206fc36c3dca549aed450f7777481"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a></div><div class="ttdeci">uintptr_t palSemaphoreID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:37</div></div> +<div class="ttc" id="structpal__thread_local_store_html"><div class="ttname"><a href="../../df/d48/structpal__thread_local_store.html">pal_threadLocalStore</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:67</div></div> +<div class="ttc" id="pal__rtos_8h_html_a0c7f0003e92b3494089966d53ab24a1b"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b">pal_osMessageQueueCreate</a></div><div class="ttdeci">palStatus_t pal_osMessageQueueCreate(uint32_t messageQSize, palMessageQID_t *messageQID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:256</div></div> +<div class="ttc" id="pal__rtos_8h_html_ac7ca6e7c3c229f4092c9df4b69e7dd59"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_osTimerDelete</a></div><div class="ttdeci">palStatus_t pal_osTimerDelete(palTimerID_t *timerID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:157</div></div> +<div class="ttc" id="pal__rtos_8h_html_a1c01464448f8d7bd95bf518d651484c6"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6">pal_osPoolDestroy</a></div><div class="ttdeci">palStatus_t pal_osPoolDestroy(palMemoryPoolID_t *memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:249</div></div> +<div class="ttc" id="pal__rtos_8h_html_a9800b8b9e057fe17e50c4259c809f898"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898">pal_osKernelSysTick</a></div><div class="ttdeci">uint32_t pal_osKernelSysTick(void)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:31</div></div> +<div class="ttc" id="pal__rtos_8h_html_a966daa5b0bd9282fbffa7c462da1c417"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417">pal_osMessagePut</a></div><div class="ttdeci">palStatus_t pal_osMessagePut(palMessageQID_t messageQID, uint32_t info, uint32_t timeout)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:263</div></div> +<div class="ttc" id="pal__rtos_8h_html_a2993b8f6b5e8d7ccd6121dc18330e4be"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_osThreadGetId</a></div><div class="ttdeci">palThreadID_t pal_osThreadGetId(void)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:114</div></div> +<div class="ttc" id="pal__rtos_8h_html_af89aab14085207b1a0951f7aad24193c"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c">pal_osMutexCreate</a></div><div class="ttdeci">palStatus_t pal_osMutexCreate(palMutexID_t *mutexID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:164</div></div> +<div class="ttc" id="pal__rtos_8h_html_aa4da36fbbba744a14d1bdfe2a26d1a18"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_osTimerCreate</a></div><div class="ttdeci">palStatus_t pal_osTimerCreate(palTimerFuncPtr function, void *funcArgument, palTimerType_t timerType, palTimerID_t *timerID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:136</div></div> +<div class="ttc" id="pal__rtos_8h_html_a9858103df451aaf98a8af08c2583b94a"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a></div><div class="ttdeci">enum palTimerType palTimerType_t</div><div class="ttdoc">Timers types supported in PAL. </div></div> +<div class="ttc" id="pal__rtos_8h_html_aaa7aee442a5c8cc274d3e52206984037"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037">pal_osSemaphoreCreate</a></div><div class="ttdeci">palStatus_t pal_osSemaphoreCreate(uint32_t count, palSemaphoreID_t *semaphoreID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:191</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6c60c9e433bc6005bac6b02d5aba7363"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_osTimerStart</a></div><div class="ttdeci">palStatus_t pal_osTimerStart(palTimerID_t timerID, uint32_t millisec)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:143</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2">PAL_osPriorityHigh</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:60</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e">PAL_osPriorityError</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:62</div></div> +<div class="ttc" id="pal__rtos_8h_html_a21fd378211ce09c12c15c39ff579627b"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a></div><div class="ttdeci">void(* palTimerFuncPtr)(void const *funcArgument)</div><div class="ttdoc">PAL timer function prototype. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:48</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec">PAL_osPriorityLow</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:56</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_osPriority</a></div><div class="ttdeci">pal_osPriority</div><div class="ttdoc">Available priorities in PAL implementation, each priority can appear only once. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:54</div></div> +<div class="ttc" id="pal__rtos_8h_html_a381fb3b26136f4983dcce371652fb20c"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a></div><div class="ttdeci">struct pal_threadLocalStore palThreadLocalStore_t</div></div> +<div class="ttc" id="pal__rtos_8h_html_a79f4997069310aa7bbb6ae7995988dd7"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7">pal_osPoolFree</a></div><div class="ttdeci">palStatus_t pal_osPoolFree(palMemoryPoolID_t memoryPoolID, void *block)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:241</div></div> +<div class="ttc" id="pal__rtos_8h_html_a1245f053abb3fdb7ab2ceb5a2899e8c6"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_osPoolCreate</a></div><div class="ttdeci">palStatus_t pal_osPoolCreate(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t *memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:219</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce">PAL_osPriorityRealtime</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:61</div></div> +<div class="ttc" id="pal__rtos_8h_html_ac6b402eec0e5f2ab64c43abffd4d9901"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a></div><div class="ttdeci">uintptr_t palMutexID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:36</div></div> +<div class="ttc" id="pal__rtos_8h_html_a54696b00a498a3c4a1346030acd18853"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a></div><div class="ttdeci">void(* palThreadFuncPtr)(void const *funcArgument)</div><div class="ttdoc">PAL thread function prototype. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:51</div></div> +<div class="ttc" id="pal__rtos_8h_html_acb4162ac097039734d15916d29880910"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a></div><div class="ttdeci">uintptr_t palMessageQID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:39</div></div> +<div class="ttc" id="pal__rtos_8h_html_a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9">palOsTimerPeriodic</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:44</div></div> +<div class="ttc" id="pal__rtos_8h_html_a5d20661cd387a172450a2fe12993687a"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a">pal_osPoolCAlloc</a></div><div class="ttdeci">void * pal_osPoolCAlloc(palMemoryPoolID_t memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:233</div></div> +<div class="ttc" id="pal__rtos_8h_html_a45f071482f8669821b90264e0470b33d"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d">pal_osSemaphoreDelete</a></div><div class="ttdeci">palStatus_t pal_osSemaphoreDelete(palSemaphoreID_t *semaphoreID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:212</div></div> +<div class="ttc" id="pal__rtos_8h_html_a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30">palOsTimerOnce</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:43</div></div> +<div class="ttc" id="pal__rtos_8h_html_abcfa47b411929b33d5d9cfaaff28ce18"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_osThreadTerminate</a></div><div class="ttdeci">palStatus_t pal_osThreadTerminate(palThreadID_t *threadID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:107</div></div> +<div class="ttc" id="pal__rtos_8h_html_a7ee094f262d03cbc97380f3fcd34c7d2"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">palTimerType</a></div><div class="ttdeci">palTimerType</div><div class="ttdoc">Timers types supported in PAL. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:42</div></div> +<div class="ttc" id="pal__rtos_8h_html_ab8ab0f31bbf4258b7684d22e7725a9f8"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_osReboot</a></div><div class="ttdeci">void pal_osReboot(void)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:26</div></div> +<div class="ttc" id="pal__types_8h_html"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html">pal_types.h</a></div></div> +<div class="ttc" id="pal__rtos_8h_html_a278568ee407204e02cbd783f612e55be"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a></div><div class="ttdeci">enum pal_osPriority palThreadPriority_t</div><div class="ttdoc">Available priorities in PAL implementation, each priority can appear only once. </div></div> +<div class="ttc" id="pal__rtos_8h_html_a1d976a616a5c850b2016b2b87d8b47cc"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_osMutexRelease</a></div><div class="ttdeci">palStatus_t pal_osMutexRelease(palMutexID_t mutexID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:178</div></div> +<div class="ttc" id="pal__rtos_8h_html_a59e85747582417a1395ed0f9c140eb8a"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a">pal_osKernelSysMilliSecTick</a></div><div class="ttdeci">uint64_t pal_osKernelSysMilliSecTick(uint64_t sysTicks)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:68</div></div> +<div class="ttc" id="pal__rtos_8h_html_a3a2b57685096d16a110ee38f7f29e099"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099">pal_osPoolAlloc</a></div><div class="ttdeci">void * pal_osPoolAlloc(palMemoryPoolID_t memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:226</div></div> +<div class="ttc" id="pal__rtos_8h_html_a94f4df594102e582cbd2114f6eebb57d"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d">pal_osTimerStop</a></div><div class="ttdeci">palStatus_t pal_osTimerStop(palTimerID_t timerID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:150</div></div> +<div class="ttc" id="pal__rtos_8h_html_a2dae64d917f644982b893037adf562b4"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4">pal_osThreadCreate</a></div><div class="ttdeci">palStatus_t pal_osThreadCreate(palThreadFuncPtr function, void *funcArgument, palThreadPriority_t priority, uint32_t stackSize, uint32_t *stackPtr, palThreadLocalStore_t *store, palThreadID_t *threadID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:82</div></div> +<div class="ttc" id="pal__rtos_8h_html_a73ab99198ebc6e6af72064739b05bdcb"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a></div><div class="ttdeci">uintptr_t palMemoryPoolID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:38</div></div> +<div class="ttc" id="pal__rtos_8h_html_a4b627efa48e79a6fbcafae87ae397985"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a></div><div class="ttdeci">uintptr_t palTimerID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:35</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af">PAL_osPriorityAboveNormal</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:59</div></div> +<div class="ttc" id="pal__macros_8h_html"><div class="ttname"><a href="../../db/dcf/pal__macros_8h.html">pal_macros.h</a></div></div> +<div class="ttc" id="pal__rtos_8h_html_a34375ee82619a4064849daccbdfbc966"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966">pal_osKernelSysTickMicroSec</a></div><div class="ttdeci">uint64_t pal_osKernelSysTickMicroSec(uint64_t microseconds)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:61</div></div> +<div class="ttc" id="pal__rtos_8h_html_af88551b6ca24a7a2bb6d94d423eb4401"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_osKernelSysTick64</a></div><div class="ttdeci">uint64_t pal_osKernelSysTick64(void)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:39</div></div> +<div class="ttc" id="pal__rtos_8h_html_a2b4f475c89ea263557d6529c4d9a9353"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353">dbgPrintf</a></div><div class="ttdeci">void dbgPrintf(const char *function, uint32_t line, const char *format,...)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:297</div></div> +<div class="ttc" id="pal__rtos_8h_html_acda0974247325955719b23494d66c622"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622">pal_osMutexWait</a></div><div class="ttdeci">palStatus_t pal_osMutexWait(palMutexID_t mutexID, uint32_t millisec)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:171</div></div> +<div class="ttc" id="pal__rtos_8h_html_adba13212ec060092acdf6165e82be5b6"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6">pal_osMessageQueueDestroy</a></div><div class="ttdeci">palStatus_t pal_osMessageQueueDestroy(palMessageQID_t *messageQID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:277</div></div> +<div class="ttc" id="pal__rtos_8h_html_aa2d998744dbc9504bfe0358f85457fc4"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4">pal_osSemaphoreWait</a></div><div class="ttdeci">palStatus_t pal_osSemaphoreWait(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t *countersAvailable)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:198</div></div> +<div class="ttc" id="pal__rtos_8h_html_ad6aaee432fd7ea5e35ab500a6278cc25"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_osDelay</a></div><div class="ttdeci">palStatus_t pal_osDelay(uint32_t milliseconds)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:128</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1">PAL_osPriorityNormal</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:58</div></div> +<div class="ttc" id="pal__rtos_8h_html_aa61aba50e0f2dba5c8571417c2bdd9a5"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a></div><div class="ttdeci">uintptr_t palThreadID_t</div><div class="ttdoc">Primitives IDs types declarations. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:34</div></div> +<div class="ttc" id="pal__rtos_8h_html_ac94f4efc4bad73969e57c8255c136a0d"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d">pal_osThreadGetLocalStore</a></div><div class="ttdeci">void * pal_osThreadGetLocalStore(void)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:121</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a">PAL_osPriorityIdle</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:55</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +<div class="ttc" id="pal__rtos_8h_html_ab70d0be45514258874c0406c2040372c"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c">pal_osMessageGet</a></div><div class="ttdeci">palStatus_t pal_osMessageGet(palMessageQID_t messageQID, uint32_t timeout, uint32_t *messageValue)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:270</div></div> +<div class="ttc" id="structpal__thread_local_store_html_abe68dca8335fc1c9e6da5359117625bc"><div class="ttname"><a href="../../df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc">pal_threadLocalStore::storeData</a></div><div class="ttdeci">void * storeData</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:68</div></div> +<div class="ttc" id="pal__rtos_8h_html_a087214ae87c20fd59f47fe3c96d0eefc"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_osKernelSysTickFrequency</a></div><div class="ttdeci">uint64_t pal_osKernelSysTickFrequency(void)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:75</div></div> +<div class="ttc" id="pal__rtos_8h_html_a03f43d7e53435d89f316862b48b573c4"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4">pal_osMutexDelete</a></div><div class="ttdeci">palStatus_t pal_osMutexDelete(palMutexID_t *mutexID)</div><div class="ttdef"><b>Definition:</b> pal_rtos.c:185</div></div> +<div class="ttc" id="pal__rtos_8h_html_a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5">PAL_osPriorityBelowNormal</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:57</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,273 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_rtos_test_main_mbedosClassic.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos_test_main_mbedosClassic.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "mbed.h"</code><br /> +<code>#include "rtos.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a6b71ffd718e2af00cebeb05560b44be7"><td class="memItemLeft" align="right" valign="top">DigitalOut </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">led1</a> (LED1)</td></tr> +<tr class="separator:a6b71ffd718e2af00cebeb05560b44be7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memItemLeft" align="right" valign="top">InterruptIn </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">sw2</a> (SW2)</td></tr> +<tr class="separator:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a21e1e181f00d9dc8dbb912650459bfde"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">sw2_press</a> (void)</td></tr> +<tr class="separator:a21e1e181f00d9dc8dbb912650459bfde"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">led_thread</a> (void const *argument)</td></tr> +<tr class="separator:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afe6a59684384290b7f8710db5203944a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#afe6a59684384290b7f8710db5203944a">button_thread</a> (void const *argument)</td></tr> +<tr class="separator:afe6a59684384290b7f8710db5203944a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc">TEST_pal_rtos_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0f2228420376f4db7e1274f2b41667c"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">main</a> (int argc, const char *argv[])</td></tr> +<tr class="separator:ac0f2228420376f4db7e1274f2b41667c"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">button_pressed</a></td></tr> +<tr class="separator:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7d37e93ff0246ad7bf396650eaf84487"><td class="memItemLeft" align="right" valign="top">Thread * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">thread2</a></td></tr> +<tr class="separator:a7d37e93ff0246ad7bf396650eaf84487"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="afe6a59684384290b7f8710db5203944a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void button_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6b71ffd718e2af00cebeb05560b44be7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">DigitalOut led1 </td> + <td>(</td> + <td class="paramtype">LED1 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a602cc5fb415f60615dbfa0643b3b3e26"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void led_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac0f2228420376f4db7e1274f2b41667c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[] </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af5543796fae8f0c3d5bfbd33f2389cb8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">InterruptIn sw2 </td> + <td>(</td> + <td class="paramtype">SW2 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a21e1e181f00d9dc8dbb912650459bfde"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void sw2_press </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9e9aa39842df82b3f5086f3215cc74fc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_rtos_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="ae8697e1a75bad4a53dd6d6ec81e486cb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t button_pressed</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7d37e93ff0246ad7bf396650eaf84487"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">Thread* thread2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d4/dc5/pal__plat__rtos_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1420 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/mbedOS/RTOS/pal_plat_rtos.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="../../dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></li><li class="navelem"><a class="el" href="../../dir_1460475e8e667d8c97e1be97dbcd2231.html">RTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_plat_rtos.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d5/d59/pal__plat__rtos_8h_source.html">pal_plat_rtos.h</a>"</code><br /> +<code>#include "<a class="el" href="../../da/dfe/pal__errors_8h_source.html">pal_errors.h</a>"</code><br /> +<code>#include "stdlib.h"</code><br /> +<code>#include "string.h"</code><br /> +<code>#include "cmsis_os.h"</code><br /> +<code>#include "critical.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:aa25bb23dc9f40c91f9872c585e649723"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aa25bb23dc9f40c91f9872c585e649723">PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE</a>(cmsisCode)   ((int32_t)(cmsisCode + <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a>))</td></tr> +<tr class="separator:aa25bb23dc9f40c91f9872c585e649723"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a31d6d9a16b9891d7eb84e2b974c2c92b"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a31d6d9a16b9891d7eb84e2b974c2c92b">PAL_RTOS_MEMORY_POOL_SIZE</a>(blockSize, blockCount)   (sizeof(uint32_t)*(3+((blockSize+3)/4)*(blockCount)))</td></tr> +<tr class="memdesc:a31d6d9a16b9891d7eb84e2b974c2c92b"><td class="mdescLeft"> </td><td class="mdescRight">the size of the memory to allocate was taken from CMSIS header (cmsis_os.h) <a href="#a31d6d9a16b9891d7eb84e2b974c2c92b">More...</a><br /></td></tr> +<tr class="separator:a31d6d9a16b9891d7eb84e2b974c2c92b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa1b17e5a20a5db09a3a3267f9a4191e0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aa1b17e5a20a5db09a3a3267f9a4191e0">PAL_RTOS_MESSAGE_Q_SIZE</a>(messageQSize)   (sizeof(uint32_t)*(4 + messageQSize))</td></tr> +<tr class="memdesc:aa1b17e5a20a5db09a3a3267f9a4191e0"><td class="mdescLeft"> </td><td class="mdescRight">the size of the memory to allocate was taken from CMSIS header (cmsis_os.h) <a href="#aa1b17e5a20a5db09a3a3267f9a4191e0">More...</a><br /></td></tr> +<tr class="separator:aa1b17e5a20a5db09a3a3267f9a4191e0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aba1d833ce13b78f5648ec26cdd25f639"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aba1d833ce13b78f5648ec26cdd25f639">PAL_TIMER_DATA_SIZE</a>   6</td></tr> +<tr class="separator:aba1d833ce13b78f5648ec26cdd25f639"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af12d673085039783ab1d2613eff7e4a4"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#af12d673085039783ab1d2613eff7e4a4">PAL_MUTEX_DATA_SIZE</a>   4</td></tr> +<tr class="separator:af12d673085039783ab1d2613eff7e4a4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a66dcd5bd7ca661597fecabb1795fa393"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a66dcd5bd7ca661597fecabb1795fa393">PAL_SEMAPHORE_DATA_SIZE</a>   2</td></tr> +<tr class="separator:a66dcd5bd7ca661597fecabb1795fa393"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9b3b50428d7ad199287a291137041c43"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a9b3b50428d7ad199287a291137041c43">PAL_NUM_OF_THREAD_INSTANCES</a>   1</td></tr> +<tr class="separator:a9b3b50428d7ad199287a291137041c43"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a78b1f63823e34bc82e272358701cbe67"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a78b1f63823e34bc82e272358701cbe67">PAL_TICK_TO_MILLI_FACTOR</a>   1000</td></tr> +<tr class="separator:a78b1f63823e34bc82e272358701cbe67"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:a3b3cdd4235f3b1a26e63840b91c98e18"><td class="memItemLeft" align="right" valign="top">typedef struct palThreadFuncWrapper </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a3b3cdd4235f3b1a26e63840b91c98e18">palThreadFuncWrapper_t</a></td></tr> +<tr class="separator:a3b3cdd4235f3b1a26e63840b91c98e18"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a06ecfc14d166863199ebfc4372d61127"><td class="memItemLeft" align="right" valign="top">typedef struct palThread </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a06ecfc14d166863199ebfc4372d61127">palThread_t</a></td></tr> +<tr class="memdesc:a06ecfc14d166863199ebfc4372d61127"><td class="mdescLeft"> </td><td class="mdescRight">Thread structure. <a href="#a06ecfc14d166863199ebfc4372d61127">More...</a><br /></td></tr> +<tr class="separator:a06ecfc14d166863199ebfc4372d61127"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2976c77ab047a577ddac4d82bfd40f10"><td class="memItemLeft" align="right" valign="top">typedef struct palTimer </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a2976c77ab047a577ddac4d82bfd40f10">palTimer_t</a></td></tr> +<tr class="memdesc:a2976c77ab047a577ddac4d82bfd40f10"><td class="mdescLeft"> </td><td class="mdescRight">Timer structure. <a href="#a2976c77ab047a577ddac4d82bfd40f10">More...</a><br /></td></tr> +<tr class="separator:a2976c77ab047a577ddac4d82bfd40f10"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a366960ed96b6cf998870481300a739d4"><td class="memItemLeft" align="right" valign="top">typedef struct palMutex </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a366960ed96b6cf998870481300a739d4">palMutex_t</a></td></tr> +<tr class="memdesc:a366960ed96b6cf998870481300a739d4"><td class="mdescLeft"> </td><td class="mdescRight">Mutex structure. <a href="#a366960ed96b6cf998870481300a739d4">More...</a><br /></td></tr> +<tr class="separator:a366960ed96b6cf998870481300a739d4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aaab2b2c34911a85e67be94866be7e515"><td class="memItemLeft" align="right" valign="top">typedef struct palSemaphore </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aaab2b2c34911a85e67be94866be7e515">palSemaphore_t</a></td></tr> +<tr class="memdesc:aaab2b2c34911a85e67be94866be7e515"><td class="mdescLeft"> </td><td class="mdescRight">Semaphore structure. <a href="#aaab2b2c34911a85e67be94866be7e515">More...</a><br /></td></tr> +<tr class="separator:aaab2b2c34911a85e67be94866be7e515"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afa12596f9e3d06ce0b6fde07eb52d07a"><td class="memItemLeft" align="right" valign="top">typedef struct palMemPool </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#afa12596f9e3d06ce0b6fde07eb52d07a">palMemoryPool_t</a></td></tr> +<tr class="memdesc:afa12596f9e3d06ce0b6fde07eb52d07a"><td class="mdescLeft"> </td><td class="mdescRight">Memoey Pool structure. <a href="#afa12596f9e3d06ce0b6fde07eb52d07a">More...</a><br /></td></tr> +<tr class="separator:afa12596f9e3d06ce0b6fde07eb52d07a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a550ebbfa0932f76e30a372710bff8f60"><td class="memItemLeft" align="right" valign="top">typedef struct palMessageQ </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a550ebbfa0932f76e30a372710bff8f60">palMessageQ_t</a></td></tr> +<tr class="memdesc:a550ebbfa0932f76e30a372710bff8f60"><td class="mdescLeft"> </td><td class="mdescRight">Message Queue structure. <a href="#a550ebbfa0932f76e30a372710bff8f60">More...</a><br /></td></tr> +<tr class="separator:a550ebbfa0932f76e30a372710bff8f60"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a1b47d17e90b6a03e7bd1ec6a0d549b46"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a1b47d17e90b6a03e7bd1ec6a0d549b46">NVIC_SystemReset</a> (void)</td></tr> +<tr class="separator:a1b47d17e90b6a03e7bd1ec6a0d549b46"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abdb6ab5827d588b9c2e908beda4c3154"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#abdb6ab5827d588b9c2e908beda4c3154">pal_plat_osReboot</a> ()</td></tr> +<tr class="separator:abdb6ab5827d588b9c2e908beda4c3154"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2e7aaf20f2cad3b04061e1c3fd748c42"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_RTOSInitialize</a> (void *opaqueContext)</td></tr> +<tr class="separator:a2e7aaf20f2cad3b04061e1c3fd748c42"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8a484abc75cf595862459d6ab21c7a0c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_RTOSDestroy</a> (void)</td></tr> +<tr class="separator:a8a484abc75cf595862459d6ab21c7a0c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a140b31a48ac23c909f1a94ad11b04aac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_osDelay</a> (uint32_t milliseconds)</td></tr> +<tr class="separator:a140b31a48ac23c909f1a94ad11b04aac"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae92f87b121a06e0062ee014025c0ba9e"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_osKernelSysTick</a> ()</td></tr> +<tr class="separator:ae92f87b121a06e0062ee014025c0ba9e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2d18206974bdf17c48b97e2e16505f19"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_osKernelSysTickMicroSec</a> (uint64_t microseconds)</td></tr> +<tr class="separator:a2d18206974bdf17c48b97e2e16505f19"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a82eade9e7b100bd9dc9ab8312f98f827"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_osKernelSysMilliSecTick</a> (uint64_t sysTicks)</td></tr> +<tr class="separator:a82eade9e7b100bd9dc9ab8312f98f827"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:addc790764a23a3e16344bd830ebe01ef"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#addc790764a23a3e16344bd830ebe01ef">pal_plat_osKernelSysTickFrequency</a> ()</td></tr> +<tr class="separator:addc790764a23a3e16344bd830ebe01ef"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9c965e0fdfd80fc86c901cf2bde88c64"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_osThreadCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> priority, uint32_t stackSize, uint32_t *stackPtr, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> *store, <a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:a9c965e0fdfd80fc86c901cf2bde88c64"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4c42c35d3d7b375833a51b4670febe92"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_osThreadGetId</a> ()</td></tr> +<tr class="separator:a4c42c35d3d7b375833a51b4670febe92"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3117f8911b3e83e27031f366aa652a4f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_osThreadTerminate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:a3117f8911b3e83e27031f366aa652a4f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aca6b1b2f34861cf8e3d2dcc076992270"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_osThreadGetLocalStore</a> ()</td></tr> +<tr class="separator:aca6b1b2f34861cf8e3d2dcc076992270"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aee15bcaba1ed33c264bc4c91c1dbb1cf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_osTimerCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> timerType, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:aee15bcaba1ed33c264bc4c91c1dbb1cf"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a80f5ca578197088e4cf84042c9efc2d7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_osTimerStart</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID, uint32_t millisec)</td></tr> +<tr class="separator:a80f5ca578197088e4cf84042c9efc2d7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2f1fdb410c4d6ae382622ef4f1884808"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_osTimerStop</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID)</td></tr> +<tr class="separator:a2f1fdb410c4d6ae382622ef4f1884808"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9723baa43780a1083f43d786fa53a73d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_osTimerDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:a9723baa43780a1083f43d786fa53a73d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae2425f958ab7d58eff5c5b3183f40305"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_osMutexCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:ae2425f958ab7d58eff5c5b3183f40305"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aea4ad5224c43ff0fff2b77798d19748c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_osMutexWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID, uint32_t millisec)</td></tr> +<tr class="separator:aea4ad5224c43ff0fff2b77798d19748c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:add4dbca7b11365e7301db1425c9fdf4d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_osMutexRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID)</td></tr> +<tr class="separator:add4dbca7b11365e7301db1425c9fdf4d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a909f4ae03b0acef0b84609d9b76679b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_osMutexDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:a909f4ae03b0acef0b84609d9b76679b4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6e7b3c23b094270b4e013c4412f2d3b1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_osSemaphoreCreate</a> (uint32_t count, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:a6e7b3c23b094270b4e013c4412f2d3b1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac9231eef550eb7b62a89e7a34b62d014"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_osSemaphoreWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID, uint32_t millisec, int32_t *countersAvailable)</td></tr> +<tr class="separator:ac9231eef550eb7b62a89e7a34b62d014"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a252f210ce8a502891821b5af24b09822"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a252f210ce8a502891821b5af24b09822">pal_plat_osSemaphoreRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID)</td></tr> +<tr class="separator:a252f210ce8a502891821b5af24b09822"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab37f3153b73dc87ca609c4c2e1bf8d6a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_osSemaphoreDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:ab37f3153b73dc87ca609c4c2e1bf8d6a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7a4fa20255fe38cf183f6c924419fe85"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_osPoolCreate</a> (uint32_t blockSize, uint32_t blockCount, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a7a4fa20255fe38cf183f6c924419fe85"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5938d16ea0c12594e8f8becd20acf3a7"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_osPoolAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a5938d16ea0c12594e8f8becd20acf3a7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8dff6b49f9798cdd4eed04f3dff30330"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_osPoolCAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a8dff6b49f9798cdd4eed04f3dff30330"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a84e2f41a587335de053e0b7f8a4163c2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_osPoolFree</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID, void *block)</td></tr> +<tr class="separator:a84e2f41a587335de053e0b7f8a4163c2"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a33ca5b5e9d3a80594de4977924e6bc1b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_osPoolDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a33ca5b5e9d3a80594de4977924e6bc1b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad25c8f7cb22985b077e893be5bc27d48"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_osMessageQueueCreate</a> (uint32_t messageQSize, <a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:ad25c8f7cb22985b077e893be5bc27d48"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa80549a557e50e0759991c6b11eb456a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_osMessagePut</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t info, uint32_t timeout)</td></tr> +<tr class="separator:aa80549a557e50e0759991c6b11eb456a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a67696b86a6116a82da7c26a433280e58"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a67696b86a6116a82da7c26a433280e58">pal_plat_osMessageGet</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t timeout, uint32_t *messageValue)</td></tr> +<tr class="separator:a67696b86a6116a82da7c26a433280e58"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0e0e6dc9958a9efd9beb62493bc3f67a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_osMessageQueueDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:a0e0e6dc9958a9efd9beb62493bc3f67a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac62a5b36fc159e12670c44a12dc08beb"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_osAtomicIncrement</a> (int32_t *valuePtr, int32_t increment)</td></tr> +<tr class="separator:ac62a5b36fc159e12670c44a12dc08beb"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="af12d673085039783ab1d2613eff7e4a4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MUTEX_DATA_SIZE   4</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9b3b50428d7ad199287a291137041c43"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NUM_OF_THREAD_INSTANCES   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a31d6d9a16b9891d7eb84e2b974c2c92b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_RTOS_MEMORY_POOL_SIZE</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">blockSize, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname">blockCount </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td>   (sizeof(uint32_t)*(3+((blockSize+3)/4)*(blockCount)))</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>the size of the memory to allocate was taken from CMSIS header (cmsis_os.h) </p> + +</div> +</div> +<a class="anchor" id="aa1b17e5a20a5db09a3a3267f9a4191e0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_RTOS_MESSAGE_Q_SIZE</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">messageQSize</td><td>)</td> + <td>   (sizeof(uint32_t)*(4 + messageQSize))</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>the size of the memory to allocate was taken from CMSIS header (cmsis_os.h) </p> + +</div> +</div> +<a class="anchor" id="aa25bb23dc9f40c91f9872c585e649723"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">cmsisCode</td><td>)</td> + <td>   ((int32_t)(cmsisCode + <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a>))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a66dcd5bd7ca661597fecabb1795fa393"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_SEMAPHORE_DATA_SIZE   2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a78b1f63823e34bc82e272358701cbe67"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_TICK_TO_MILLI_FACTOR   1000</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aba1d833ce13b78f5648ec26cdd25f639"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_TIMER_DATA_SIZE   6</td> + </tr> + </table> +</div><div class="memdoc"> +<p>This definitions should be under #ifdef for different CORTEX-X processors. The current vaules are for cortex-M these are the sizes of the internal data array in definitions arrays </p> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="afa12596f9e3d06ce0b6fde07eb52d07a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct palMemPool <a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#afa12596f9e3d06ce0b6fde07eb52d07a">palMemoryPool_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Memoey Pool structure. </p> + +</div> +</div> +<a class="anchor" id="a550ebbfa0932f76e30a372710bff8f60"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct palMessageQ <a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a550ebbfa0932f76e30a372710bff8f60">palMessageQ_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Message Queue structure. </p> + +</div> +</div> +<a class="anchor" id="a366960ed96b6cf998870481300a739d4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct palMutex <a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a366960ed96b6cf998870481300a739d4">palMutex_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Mutex structure. </p> + +</div> +</div> +<a class="anchor" id="aaab2b2c34911a85e67be94866be7e515"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct palSemaphore <a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#aaab2b2c34911a85e67be94866be7e515">palSemaphore_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Semaphore structure. </p> + +</div> +</div> +<a class="anchor" id="a06ecfc14d166863199ebfc4372d61127"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct palThread <a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a06ecfc14d166863199ebfc4372d61127">palThread_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Thread structure. </p> + +</div> +</div> +<a class="anchor" id="a3b3cdd4235f3b1a26e63840b91c98e18"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct palThreadFuncWrapper <a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a3b3cdd4235f3b1a26e63840b91c98e18">palThreadFuncWrapper_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2976c77ab047a577ddac4d82bfd40f10"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct palTimer <a class="el" href="../../d4/dc5/pal__plat__rtos_8c.html#a2976c77ab047a577ddac4d82bfd40f10">palTimer_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Timer structure. </p> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a1b47d17e90b6a03e7bd1ec6a0d549b46"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void NVIC_SystemReset </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac62a5b36fc159e12670c44a12dc08beb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int32_t pal_plat_osAtomicIncrement </td> + <td>(</td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>valuePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>increment</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Perform an atomic increment for a signed32 bit value.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">valuePtr</td><td>The address of the value to increment. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">increment</td><td>The number by which to increment.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The value of the valuePtr after the increment operation. </dd></dl> + +</div> +</div> +<a class="anchor" id="a140b31a48ac23c909f1a94ad11b04aac"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osDelay </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>milliseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait for a specified period of time in milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">milliseconds</td><td>The number of milliseconds to wait before proceeding.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a82eade9e7b100bd9dc9ab8312f98f827"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_plat_osKernelSysMilliSecTick </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>sysTicks</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Convert the value from kernel system ticks to milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">sysTicks</td><td>The number of kernel system ticks to convert into millieseconds.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The converted value in system ticks. </dd></dl> + +</div> +</div> +<a class="anchor" id="ae92f87b121a06e0062ee014025c0ba9e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t pal_plat_osKernelSysTick </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the RTOS kernel system timer counter.</p> +<dl class="section return"><dt>Returns</dt><dd>The RTOS kernel system timer counter.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>The required tick counter is the OS (platform) kernel system tick counter. </dd> +<dd> +This counter wraps around very often (for example, once every 42 sec for 100Mhz). </dd></dl> + +</div> +</div> +<a class="anchor" id="addc790764a23a3e16344bd830ebe01ef"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_plat_osKernelSysTickFrequency </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the system tick frequency. </p><dl class="section return"><dt>Returns</dt><dd>The system tick frequency. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2d18206974bdf17c48b97e2e16505f19"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_plat_osKernelSysTickMicroSec </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>microseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Convert the value from microseconds to kernel sys ticks. This is the same as CMSIS macro osKernelSysTickMicroSec. </p> + +</div> +</div> +<a class="anchor" id="a67696b86a6116a82da7c26a433280e58"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessageGet </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>messageValue</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get a message or wait for a message from a queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>The handle for the message queue. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>The timeout in milliseconds. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">messageValue</td><td>The data to send.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Semaphore was not available but not due to timeout. PAL_ERR_RTOS_TIMEOUT - No message arrived during the timeout period. PAL_ERR_RTOS_RESOURCE - No message received and there was no timeout. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa80549a557e50e0759991c6b11eb456a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessagePut </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>info</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Put a message to a queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>The handle for the message queue. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">info</td><td>The data to send. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>The timeout in milliseconds.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ad25c8f7cb22985b077e893be5bc27d48"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessageQueueCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>messageQSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a message queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQSize</td><td>The size of the message queue. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">messageQID</td><td>The ID of the created message queue, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the message queue was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create message queue object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a0e0e6dc9958a9efd9beb62493bc3f67a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessageQueueDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a message queue object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">messageQID</td><td>The handle for the message queue. In success, *messageQID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ae2425f958ab7d58eff5c5b3183f40305"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a mutex object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">mutexID</td><td>The created mutex ID handle, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the mutex was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create mutex object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a909f4ae03b0acef0b84609d9b76679b4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a mutex object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">mutexID</td><td>The ID of the mutex to delete. In success, *mutexID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the mutex was deleted successfully, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Mutex already released. PAL_ERR_RTOS_PARAMETER - Mutex ID is invalid. PAL_ERR_RTOS_ISR - Cannot be called from interrupt service routines. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call, mutex_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="add4dbca7b11365e7301db1425c9fdf4d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a mutex that was obtained by osMutexWait.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>The handle for the mutex.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aea4ad5224c43ff0fff2b77798d19748c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a mutex becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>The handle for the mutex. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>The timeout for the waiting operation if the timeout expires before the semaphore is released and an error is returned from the function.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Mutex not available but no timeout set. PAL_ERR_RTOS_TIMEOUT - Mutex was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - Mutex ID is invalid. PAL_ERR_RTOS_ISR - Cannot be called from interrupt service routines. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5938d16ea0c12594e8f8becd20acf3a7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_plat_osPoolAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>A pointer to a single allocated memory from the pool, NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a8dff6b49f9798cdd4eed04f3dff30330"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_plat_osPoolCAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool and set memory block to zero.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>A pointer to a single allocated memory from the pool, NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a7a4fa20255fe38cf183f6c924419fe85"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osPoolCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockCount</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">blockSize</td><td>The size of a single block in bytes. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">blockCount</td><td>The maximum number of blocks in the memory pool. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">memoryPoolID</td><td>The ID of the created memory pool, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the memory pool was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create memory pool object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a33ca5b5e9d3a80594de4977924e6bc1b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osPoolDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a memory pool object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool. In success, *memoryPoolID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a84e2f41a587335de053e0b7f8a4163c2"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osPoolFree </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>block</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Return the memoryPoolID of the memory block back to a specific memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">block</td><td>The block to be freed.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="abdb6ab5827d588b9c2e908beda4c3154"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_plat_osReboot </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initiate a system reboot. </p> + +</div> +</div> +<a class="anchor" id="a6e7b3c23b094270b4e013c4412f2d3b1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>count</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a semaphore object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">count</td><td>The number of available resources. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">semaphoreID</td><td>The ID of the created semaphore, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the semaphore was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create semaphore object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="ab37f3153b73dc87ca609c4c2e1bf8d6a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a semaphore object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">semaphoreID</td><td>The ID of the semaphore to delete. In success, *semaphoreID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the semaphore was deleted successfully, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Semaphore already released. PAL_ERR_RTOS_PARAMETER - Semaphore ID is invalid. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call, the semaphore_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="a252f210ce8a502891821b5af24b09822"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a semaphore token.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>The handle for the semaphore.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ac9231eef550eb7b62a89e7a34b62d014"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>countersAvailable</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a semaphore token becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>The handle for the semaphore. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>The timeout for the waiting operation if the timeout expires before the semaphore is released and an error is returned from the function. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">countersAvailable</td><td>The number of semaphores available, if semaphores are not available (timeout/error) zero is returned. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, one of the following error codes in case of failure: PAL_ERR_RTOS_TIMEOUT - Semaphore was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - Semaphore ID is invalid. </dd></dl> + +</div> +</div> +<a class="anchor" id="a9c965e0fdfd80fc86c901cf2bde88c64"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osThreadCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> </td> + <td class="paramname"><em>priority</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>stackSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>stackPtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> * </td> + <td class="paramname"><em>store</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and start a thread function.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>A function pointer to the thread callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>An argument for the thread function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">priority</td><td>The priority of the thread. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackSize</td><td>The stack size of the thread. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackPtr</td><td>A pointer to the thread's stack. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">store</td><td>A pointer to thread's local store, can be NULL. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">threadID</td><td>The created thread ID handle, zero indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The ID of the created thread, in case of error return zero. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>Each thread MUST have a unique priority. </dd> +<dd> +When the priority of the created thread function is higher than the current running thread, the created thread function starts instantly and becomes the new running thread. </dd> +<dd> +the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a4c42c35d3d7b375833a51b4670febe92"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> pal_plat_osThreadGetId </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the ID of the current thread. </p><dl class="section return"><dt>Returns</dt><dd>The ID of the current thread, in case of error return PAL_MAX_UINT32. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>For a thread with real time priority, the function always returns PAL_MAX_UINT32. </dd></dl> + +</div> +</div> +<a class="anchor" id="aca6b1b2f34861cf8e3d2dcc076992270"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_plat_osThreadGetLocalStore </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the storage of the current thread. </p><dl class="section return"><dt>Returns</dt><dd>The storage of the current thread. </dd></dl> + +</div> +</div> +<a class="anchor" id="a3117f8911b3e83e27031f366aa652a4f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osThreadTerminate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Terminate and free allocated data for the thread.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">threadID</td><td>The ID of the thread to stop and terminate.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aee15bcaba1ed33c264bc4c91c1dbb1cf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> </td> + <td class="paramname"><em>timerType</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>A function pointer to the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>An argument for the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timerType</td><td>The timer type to be created, periodic or oneShot. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">timerID</td><td>The ID of the created timer, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the timer was created successfully. A specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create timer object.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>the timer callback function runs according to the platform resources of stack-size and priority. </dd> +<dd> +the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a9723baa43780a1083f43d786fa53a73d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete the timer object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">timerID</td><td>The handle for the timer to delete. In success, *timerID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the timer was deleted successfully, PAL_ERR_RTOS_PARAMETER when the timerID is incorrect. </dd></dl> + +</div> +</div> +<a class="anchor" id="a80f5ca578197088e4cf84042c9efc2d7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerStart </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Start or restart a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>The handle for the timer to start. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>The time in milliseconds to set the timer to.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2f1fdb410c4d6ae382622ef4f1884808"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerStop </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Stop a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>The handle for the timer to stop.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a8a484abc75cf595862459d6ab21c7a0c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_plat_RTOSDestroy </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>De-Initialize thread objects. </p> + +</div> +</div> +<a class="anchor" id="a2e7aaf20f2cad3b04061e1c3fd748c42"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_RTOSInitialize </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>opaqueContext</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initialize all data structures (semaphores, mutexes, memory pools, message queues) at system initialization. In case of a failure in any of the initializations, the function returns with an error and stops the rest of the initializations. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">opaqueContext</td><td>The context passed to the initialization (not required for generic CMSIS, pass NULL in this case). </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd><a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, PAL_ERR_CREATION_FAILED in case of failure. </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d5/d2a/pal__socket__test_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,479 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_socket_test.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_socket_test.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d2c/pal__plat__network_8h_source.html">pal_plat_network.h</a>"</code><br /> +<code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +<code>#include "<a class="el" href="../../d0/d51/pal__test__utils_8h_source.html">pal_test_utils.h</a>"</code><br /> +<code>#include "<a class="el" href="../../df/d2a/pal__socket__test__utils_8h_source.html">pal_socket_test_utils.h</a>"</code><br /> +<code>#include "string.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:abc23815d68dafc619e2c2ba210d65bd0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#abc23815d68dafc619e2c2ba210d65bd0">PAL_NET_SUPPORT_LWIP</a>   1</td></tr> +<tr class="separator:abc23815d68dafc619e2c2ba210d65bd0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abbe7571a0fc631eb43561606f4d5bb0e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#abbe7571a0fc631eb43561606f4d5bb0e">PAL_NET_TEST_SERVER_NAME</a>   "e109180-lin.kfn.arm.com"</td></tr> +<tr class="separator:abbe7571a0fc631eb43561606f4d5bb0e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0570e783c7412d25d0c33817da54c02f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a0570e783c7412d25d0c33817da54c02f">PAL_NET_TEST_SERVER_IP</a>   {10,45,48,190}</td></tr> +<tr class="separator:a0570e783c7412d25d0c33817da54c02f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7175d943793d9a92ebe83d12f2a65063"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a7175d943793d9a92ebe83d12f2a65063">PAL_NET_TEST_SERVER_IP_STRING</a>   "10.45.48.190"</td></tr> +<tr class="separator:a7175d943793d9a92ebe83d12f2a65063"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7c3cef32674c412f87617e87a194e0e3"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a7c3cef32674c412f87617e87a194e0e3">PAL_NET_TEST_SERVER_HTTP_PORT</a>   8686</td></tr> +<tr class="separator:a7c3cef32674c412f87617e87a194e0e3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abc63439a9af70c80b125accdc2afbb12"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#abc63439a9af70c80b125accdc2afbb12">PAL_NET_TEST_SERVER_UDP_PORT</a>   8383</td></tr> +<tr class="separator:abc63439a9af70c80b125accdc2afbb12"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab1873f5ba58eb802dd808f05a1101670"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#ab1873f5ba58eb802dd808f05a1101670">PAL_NET_TEST_INCOMING_PORT</a>   8000</td></tr> +<tr class="separator:ab1873f5ba58eb802dd808f05a1101670"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0010ea5741ae7db441ef09f96eef47be"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a0010ea5741ae7db441ef09f96eef47be">PAL_TEST_BUFFER_SIZE</a>   50</td></tr> +<tr class="separator:a0010ea5741ae7db441ef09f96eef47be"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ad324fc284dd938317109a9fc47dd1732"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#ad324fc284dd938317109a9fc47dd1732">TEST_GROUP</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>)</td></tr> +<tr class="separator:ad324fc284dd938317109a9fc47dd1732"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad62b547b432124475c3f5a94d9befe6d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#ad62b547b432124475c3f5a94d9befe6d">socketCallback</a> ()</td></tr> +<tr class="separator:ad62b547b432124475c3f5a94d9befe6d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a26217052dc55731aa82231669a8cf0df"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a26217052dc55731aa82231669a8cf0df">TEST_SETUP</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>)</td></tr> +<tr class="separator:a26217052dc55731aa82231669a8cf0df"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac307640c84843ab78607af150bcbe143"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#ac307640c84843ab78607af150bcbe143">TEST_TEAR_DOWN</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>)</td></tr> +<tr class="separator:ac307640c84843ab78607af150bcbe143"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a89cecd4b07ef1acbb0b40c00189a0f36"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a89cecd4b07ef1acbb0b40c00189a0f36">TEST</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>, socketUDPCreationOptionsTest)</td></tr> +<tr class="separator:a89cecd4b07ef1acbb0b40c00189a0f36"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a16068d3b8c2ae529cc46a5eb5b238f44"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a16068d3b8c2ae529cc46a5eb5b238f44">TEST</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>, basicTCPclinetSendRecieve)</td></tr> +<tr class="separator:a16068d3b8c2ae529cc46a5eb5b238f44"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a38479981768fb5d46c11768870af9d8e"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a38479981768fb5d46c11768870af9d8e">TEST</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>, basicUDPclinetSendRecieve)</td></tr> +<tr class="separator:a38479981768fb5d46c11768870af9d8e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad2dc56bae3cc44082b05728caf3a8948"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#ad2dc56bae3cc44082b05728caf3a8948">TEST</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>, basicSocketScenario3)</td></tr> +<tr class="separator:ad2dc56bae3cc44082b05728caf3a8948"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab28ce473e377fbe30049cb41b31dfa4b"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#ab28ce473e377fbe30049cb41b31dfa4b">TEST</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>, basicSocketScenario4)</td></tr> +<tr class="separator:ab28ce473e377fbe30049cb41b31dfa4b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af5e8d34fc9aaaae9d9e2af143e1320e2"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#af5e8d34fc9aaaae9d9e2af143e1320e2">TEST</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>, basicSocketScenario5)</td></tr> +<tr class="separator:af5e8d34fc9aaaae9d9e2af143e1320e2"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abbfd14915bd054b23f91a485d4f8fb1e"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#abbfd14915bd054b23f91a485d4f8fb1e">TEST</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>, tProvUDPTest)</td></tr> +<tr class="separator:abbfd14915bd054b23f91a485d4f8fb1e"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:a702871d3d9057fa4fc99031298fb425c"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d2a/pal__socket__test_8c.html#a702871d3d9057fa4fc99031298fb425c">g_networkInterface</a> = NULL</td></tr> +<tr class="separator:a702871d3d9057fa4fc99031298fb425c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="abc23815d68dafc619e2c2ba210d65bd0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SUPPORT_LWIP   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ab1873f5ba58eb802dd808f05a1101670"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_TEST_INCOMING_PORT   8000</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7c3cef32674c412f87617e87a194e0e3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_TEST_SERVER_HTTP_PORT   8686</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0570e783c7412d25d0c33817da54c02f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_TEST_SERVER_IP   {10,45,48,190}</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7175d943793d9a92ebe83d12f2a65063"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_TEST_SERVER_IP_STRING   "10.45.48.190"</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abbe7571a0fc631eb43561606f4d5bb0e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_TEST_SERVER_NAME   "e109180-lin.kfn.arm.com"</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abc63439a9af70c80b125accdc2afbb12"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_TEST_SERVER_UDP_PORT   8383</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0010ea5741ae7db441ef09f96eef47be"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_TEST_BUFFER_SIZE   50</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ad62b547b432124475c3f5a94d9befe6d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void socketCallback </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a89cecd4b07ef1acbb0b40c00189a0f36"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">socketUDPCreationOptionsTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a16068d3b8c2ae529cc46a5eb5b238f44"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">basicTCPclinetSendRecieve </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a38479981768fb5d46c11768870af9d8e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">basicUDPclinetSendRecieve </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad2dc56bae3cc44082b05728caf3a8948"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">basicSocketScenario3 </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ab28ce473e377fbe30049cb41b31dfa4b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">basicSocketScenario4 </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af5e8d34fc9aaaae9d9e2af143e1320e2"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">basicSocketScenario5 </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abbfd14915bd054b23f91a485d4f8fb1e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">tProvUDPTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad324fc284dd938317109a9fc47dd1732"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_GROUP </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a26217052dc55731aa82231669a8cf0df"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_SETUP </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac307640c84843ab78607af150bcbe143"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_TEAR_DOWN </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="a702871d3d9057fa4fc99031298fb425c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* g_networkInterface = NULL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d5/d59/pal__plat__rtos_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1153 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Platform-API/pal_plat_rtos.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_plat_rtos.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d2/d87/pal__configuration_8h_source.html">pal_configuration.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>"</code><br /> +</div> +<p><a href="../../d5/d59/pal__plat__rtos_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a894db4d6fe636ef7a7ebf83d4334adbd"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd">pal_plat_osReboot</a> (void)</td></tr> +<tr class="separator:a894db4d6fe636ef7a7ebf83d4334adbd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2e7aaf20f2cad3b04061e1c3fd748c42"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_RTOSInitialize</a> (void *opaqueContext)</td></tr> +<tr class="separator:a2e7aaf20f2cad3b04061e1c3fd748c42"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8a484abc75cf595862459d6ab21c7a0c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_RTOSDestroy</a> (void)</td></tr> +<tr class="separator:a8a484abc75cf595862459d6ab21c7a0c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae92f87b121a06e0062ee014025c0ba9e"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_osKernelSysTick</a> ()</td></tr> +<tr class="separator:ae92f87b121a06e0062ee014025c0ba9e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad104e06e7b043305fdbfbc37e4ea2826"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826">pal_plat_osKernelSysTick64</a> (void)</td></tr> +<tr class="separator:ad104e06e7b043305fdbfbc37e4ea2826"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2d18206974bdf17c48b97e2e16505f19"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_osKernelSysTickMicroSec</a> (uint64_t microseconds)</td></tr> +<tr class="separator:a2d18206974bdf17c48b97e2e16505f19"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a82eade9e7b100bd9dc9ab8312f98f827"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_osKernelSysMilliSecTick</a> (uint64_t sysTicks)</td></tr> +<tr class="separator:a82eade9e7b100bd9dc9ab8312f98f827"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aacd58e95c23ad1c8f39b8b12ed2d83dd"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd">pal_plat_osKernelSysTickFrequency</a> (void)</td></tr> +<tr class="separator:aacd58e95c23ad1c8f39b8b12ed2d83dd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9c965e0fdfd80fc86c901cf2bde88c64"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_osThreadCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> priority, uint32_t stackSize, uint32_t *stackPtr, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> *store, <a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:a9c965e0fdfd80fc86c901cf2bde88c64"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3117f8911b3e83e27031f366aa652a4f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_osThreadTerminate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:a3117f8911b3e83e27031f366aa652a4f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4c42c35d3d7b375833a51b4670febe92"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_osThreadGetId</a> ()</td></tr> +<tr class="separator:a4c42c35d3d7b375833a51b4670febe92"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aca6b1b2f34861cf8e3d2dcc076992270"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_osThreadGetLocalStore</a> ()</td></tr> +<tr class="separator:aca6b1b2f34861cf8e3d2dcc076992270"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a140b31a48ac23c909f1a94ad11b04aac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_osDelay</a> (uint32_t milliseconds)</td></tr> +<tr class="separator:a140b31a48ac23c909f1a94ad11b04aac"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aee15bcaba1ed33c264bc4c91c1dbb1cf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_osTimerCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> timerType, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:aee15bcaba1ed33c264bc4c91c1dbb1cf"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a80f5ca578197088e4cf84042c9efc2d7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_osTimerStart</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID, uint32_t millisec)</td></tr> +<tr class="separator:a80f5ca578197088e4cf84042c9efc2d7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2f1fdb410c4d6ae382622ef4f1884808"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_osTimerStop</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID)</td></tr> +<tr class="separator:a2f1fdb410c4d6ae382622ef4f1884808"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9723baa43780a1083f43d786fa53a73d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_osTimerDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:a9723baa43780a1083f43d786fa53a73d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae2425f958ab7d58eff5c5b3183f40305"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_osMutexCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:ae2425f958ab7d58eff5c5b3183f40305"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aea4ad5224c43ff0fff2b77798d19748c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_osMutexWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID, uint32_t millisec)</td></tr> +<tr class="separator:aea4ad5224c43ff0fff2b77798d19748c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:add4dbca7b11365e7301db1425c9fdf4d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_osMutexRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID)</td></tr> +<tr class="separator:add4dbca7b11365e7301db1425c9fdf4d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a909f4ae03b0acef0b84609d9b76679b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_osMutexDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:a909f4ae03b0acef0b84609d9b76679b4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6e7b3c23b094270b4e013c4412f2d3b1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_osSemaphoreCreate</a> (uint32_t count, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:a6e7b3c23b094270b4e013c4412f2d3b1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac9231eef550eb7b62a89e7a34b62d014"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_osSemaphoreWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID, uint32_t millisec, int32_t *countersAvailable)</td></tr> +<tr class="separator:ac9231eef550eb7b62a89e7a34b62d014"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a252f210ce8a502891821b5af24b09822"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822">pal_plat_osSemaphoreRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID)</td></tr> +<tr class="separator:a252f210ce8a502891821b5af24b09822"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab37f3153b73dc87ca609c4c2e1bf8d6a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_osSemaphoreDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:ab37f3153b73dc87ca609c4c2e1bf8d6a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7a4fa20255fe38cf183f6c924419fe85"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_osPoolCreate</a> (uint32_t blockSize, uint32_t blockCount, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a7a4fa20255fe38cf183f6c924419fe85"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5938d16ea0c12594e8f8becd20acf3a7"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_osPoolAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a5938d16ea0c12594e8f8becd20acf3a7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8dff6b49f9798cdd4eed04f3dff30330"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_osPoolCAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a8dff6b49f9798cdd4eed04f3dff30330"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a84e2f41a587335de053e0b7f8a4163c2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_osPoolFree</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID, void *block)</td></tr> +<tr class="separator:a84e2f41a587335de053e0b7f8a4163c2"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a33ca5b5e9d3a80594de4977924e6bc1b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_osPoolDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a33ca5b5e9d3a80594de4977924e6bc1b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad25c8f7cb22985b077e893be5bc27d48"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_osMessageQueueCreate</a> (uint32_t messageQSize, <a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:ad25c8f7cb22985b077e893be5bc27d48"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa80549a557e50e0759991c6b11eb456a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_osMessagePut</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t info, uint32_t timeout)</td></tr> +<tr class="separator:aa80549a557e50e0759991c6b11eb456a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a67696b86a6116a82da7c26a433280e58"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58">pal_plat_osMessageGet</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t timeout, uint32_t *messageValue)</td></tr> +<tr class="separator:a67696b86a6116a82da7c26a433280e58"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0e0e6dc9958a9efd9beb62493bc3f67a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_osMessageQueueDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:a0e0e6dc9958a9efd9beb62493bc3f67a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac62a5b36fc159e12670c44a12dc08beb"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_osAtomicIncrement</a> (int32_t *valuePtr, int32_t increment)</td></tr> +<tr class="separator:ac62a5b36fc159e12670c44a12dc08beb"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ac62a5b36fc159e12670c44a12dc08beb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int32_t pal_plat_osAtomicIncrement </td> + <td>(</td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>valuePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>increment</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Perform an atomic increment for a signed32 bit value.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">valuePtr</td><td>The address of the value to increment. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">increment</td><td>The number by which to increment.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The value of the valuePtr after the increment operation. </dd></dl> + +</div> +</div> +<a class="anchor" id="a140b31a48ac23c909f1a94ad11b04aac"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osDelay </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>milliseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait for a specified period of time in milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">milliseconds</td><td>The number of milliseconds to wait before proceeding.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a82eade9e7b100bd9dc9ab8312f98f827"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_plat_osKernelSysMilliSecTick </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>sysTicks</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Convert the value from kernel system ticks to milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">sysTicks</td><td>The number of kernel system ticks to convert into millieseconds.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The converted value in system ticks. </dd></dl> + +</div> +</div> +<a class="anchor" id="ae92f87b121a06e0062ee014025c0ba9e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t pal_plat_osKernelSysTick </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the RTOS kernel system timer counter.</p> +<dl class="section return"><dt>Returns</dt><dd>The RTOS kernel system timer counter.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>The required tick counter is the OS (platform) kernel system tick counter. </dd> +<dd> +This counter wraps around very often (for example, once every 42 sec for 100Mhz). </dd></dl> + +</div> +</div> +<a class="anchor" id="ad104e06e7b043305fdbfbc37e4ea2826"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_plat_osKernelSysTick64 </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the RTOS kernel system timer counter.</p> +<dl class="section return"><dt>Returns</dt><dd>The RTOS kernel system timer counter.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>The required tick counter is the OS (platform) kernel system tick counter. </dd></dl> + +</div> +</div> +<a class="anchor" id="aacd58e95c23ad1c8f39b8b12ed2d83dd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_plat_osKernelSysTickFrequency </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the system tick frequency. </p><dl class="section return"><dt>Returns</dt><dd>The system tick frequency. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2d18206974bdf17c48b97e2e16505f19"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_plat_osKernelSysTickMicroSec </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>microseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Convert the value from microseconds to kernel sys ticks. This is the same as CMSIS macro osKernelSysTickMicroSec. </p> + +</div> +</div> +<a class="anchor" id="a67696b86a6116a82da7c26a433280e58"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessageGet </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>messageValue</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get a message or wait for a message from a queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>The handle for the message queue. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>The timeout in milliseconds. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">messageValue</td><td>The data to send.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Semaphore was not available but not due to timeout. PAL_ERR_RTOS_TIMEOUT - No message arrived during the timeout period. PAL_ERR_RTOS_RESOURCE - No message received and there was no timeout. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa80549a557e50e0759991c6b11eb456a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessagePut </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>info</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Put a message to a queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>The handle for the message queue. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">info</td><td>The data to send. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>The timeout in milliseconds.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ad25c8f7cb22985b077e893be5bc27d48"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessageQueueCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>messageQSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a message queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQSize</td><td>The size of the message queue. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">messageQID</td><td>The ID of the created message queue, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the message queue was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create message queue object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a0e0e6dc9958a9efd9beb62493bc3f67a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMessageQueueDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a message queue object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">messageQID</td><td>The handle for the message queue. In success, *messageQID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ae2425f958ab7d58eff5c5b3183f40305"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a mutex object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">mutexID</td><td>The created mutex ID handle, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the mutex was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create mutex object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a909f4ae03b0acef0b84609d9b76679b4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a mutex object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">mutexID</td><td>The ID of the mutex to delete. In success, *mutexID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the mutex was deleted successfully, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Mutex already released. PAL_ERR_RTOS_PARAMETER - Mutex ID is invalid. PAL_ERR_RTOS_ISR - Cannot be called from interrupt service routines. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call, mutex_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="add4dbca7b11365e7301db1425c9fdf4d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a mutex that was obtained by osMutexWait.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>The handle for the mutex.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aea4ad5224c43ff0fff2b77798d19748c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osMutexWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a mutex becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>The handle for the mutex. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>The timeout for the waiting operation if the timeout expires before the semaphore is released and an error is returned from the function.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Mutex not available but no timeout set. PAL_ERR_RTOS_TIMEOUT - Mutex was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - Mutex ID is invalid. PAL_ERR_RTOS_ISR - Cannot be called from interrupt service routines. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5938d16ea0c12594e8f8becd20acf3a7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_plat_osPoolAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>A pointer to a single allocated memory from the pool, NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a8dff6b49f9798cdd4eed04f3dff30330"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_plat_osPoolCAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool and set memory block to zero.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>A pointer to a single allocated memory from the pool, NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a7a4fa20255fe38cf183f6c924419fe85"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osPoolCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockCount</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">blockSize</td><td>The size of a single block in bytes. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">blockCount</td><td>The maximum number of blocks in the memory pool. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">memoryPoolID</td><td>The ID of the created memory pool, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the memory pool was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create memory pool object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a33ca5b5e9d3a80594de4977924e6bc1b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osPoolDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a memory pool object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool. In success, *memoryPoolID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a84e2f41a587335de053e0b7f8a4163c2"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osPoolFree </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>block</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Return the memoryPoolID of the memory block back to a specific memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>The handle for the memory pool. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">block</td><td>The block to be freed.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a894db4d6fe636ef7a7ebf83d4334adbd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_plat_osReboot </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initiate a system reboot. </p> + +</div> +</div> +<a class="anchor" id="a6e7b3c23b094270b4e013c4412f2d3b1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>count</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a semaphore object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">count</td><td>The number of available resources. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">semaphoreID</td><td>The ID of the created semaphore, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the semaphore was created successfully, a specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create semaphore object. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="ab37f3153b73dc87ca609c4c2e1bf8d6a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a semaphore object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">semaphoreID</td><td>The ID of the semaphore to delete. In success, *semaphoreID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the semaphore was deleted successfully, one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - Semaphore already released. PAL_ERR_RTOS_PARAMETER - Semaphore ID is invalid. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call, the semaphore_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="a252f210ce8a502891821b5af24b09822"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a semaphore token.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>The handle for the semaphore.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ac9231eef550eb7b62a89e7a34b62d014"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osSemaphoreWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>countersAvailable</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a semaphore token becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>The handle for the semaphore. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>The timeout for the waiting operation if the timeout expires before the semaphore is released and an error is returned from the function. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">countersAvailable</td><td>The number of semaphores available, if semaphores are not available (timeout/error) zero is returned. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, one of the following error codes in case of failure: PAL_ERR_RTOS_TIMEOUT - Semaphore was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - Semaphore ID is invalid. </dd></dl> + +</div> +</div> +<a class="anchor" id="a9c965e0fdfd80fc86c901cf2bde88c64"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osThreadCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> </td> + <td class="paramname"><em>priority</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>stackSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>stackPtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> * </td> + <td class="paramname"><em>store</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and start a thread function.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>A function pointer to the thread callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>An argument for the thread function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">priority</td><td>The priority of the thread. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackSize</td><td>The stack size of the thread. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackPtr</td><td>A pointer to the thread's stack. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">store</td><td>A pointer to thread's local store, can be NULL. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">threadID</td><td>The created thread ID handle, zero indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The ID of the created thread, in case of error return zero. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>Each thread MUST have a unique priority. </dd> +<dd> +When the priority of the created thread function is higher than the current running thread, the created thread function starts instantly and becomes the new running thread. </dd> +<dd> +the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a4c42c35d3d7b375833a51b4670febe92"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> pal_plat_osThreadGetId </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the ID of the current thread. </p><dl class="section return"><dt>Returns</dt><dd>The ID of the current thread, in case of error return PAL_MAX_UINT32. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>For a thread with real time priority, the function always returns PAL_MAX_UINT32. </dd></dl> + +</div> +</div> +<a class="anchor" id="aca6b1b2f34861cf8e3d2dcc076992270"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_plat_osThreadGetLocalStore </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the storage of the current thread. </p><dl class="section return"><dt>Returns</dt><dd>The storage of the current thread. </dd></dl> + +</div> +</div> +<a class="anchor" id="a3117f8911b3e83e27031f366aa652a4f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osThreadTerminate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Terminate and free allocated data for the thread.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">threadID</td><td>The ID of the thread to stop and terminate.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aee15bcaba1ed33c264bc4c91c1dbb1cf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> </td> + <td class="paramname"><em>timerType</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>A function pointer to the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>An argument for the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timerType</td><td>The timer type to be created, periodic or oneShot. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">timerID</td><td>The ID of the created timer, zero value indicates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the timer was created successfully. A specific error in case of failure. PAL_ERR_NO_MEMORY: no memory resource available to create timer object.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>the timer callback function runs according to the platform resources of stack-size and priority. </dd> +<dd> +the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. </dd></dl> + +</div> +</div> +<a class="anchor" id="a9723baa43780a1083f43d786fa53a73d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete the timer object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">timerID</td><td>The handle for the timer to delete. In success, *timerID = NULL.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when the timer was deleted successfully, PAL_ERR_RTOS_PARAMETER when the timerID is incorrect. </dd></dl> + +</div> +</div> +<a class="anchor" id="a80f5ca578197088e4cf84042c9efc2d7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerStart </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Start or restart a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>The handle for the timer to start. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>The time in milliseconds to set the timer to.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2f1fdb410c4d6ae382622ef4f1884808"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_osTimerStop </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Stop a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>The handle for the timer to stop.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, a negative value indicating a specific error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a8a484abc75cf595862459d6ab21c7a0c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_plat_RTOSDestroy </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>De-Initialize thread objects. </p> + +</div> +</div> +<a class="anchor" id="a2e7aaf20f2cad3b04061e1c3fd748c42"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_RTOSInitialize </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>opaqueContext</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initialize all data structures (semaphores, mutexes, memory pools, message queues) at system initialization. In case of a failure in any of the initializations, the function returns with an error and stops the rest of the initializations. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">opaqueContext</td><td>The context passed to the initialization (not required for generic CMSIS, pass NULL in this case). </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd><a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success, PAL_ERR_CREATION_FAILED in case of failure. </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d5/d59/pal__plat__rtos_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Platform-API/pal_plat_rtos.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_plat_rtos.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d5/d59/pal__plat__rtos_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_PLAT_RTOS_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_PLAT_RTOS_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include "<a class="code" href="../../d4/d01/pal__rtos_8h.html">pal_rtos.h</a>"</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#include "<a class="code" href="../../d2/d87/pal__configuration_8h.html">pal_configuration.h</a>"</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include "<a class="code" href="../../d6/dc2/pal__types_8h.html">pal_types.h</a>"</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#if PAL_UNIQUE_THREAD_PRIORITY</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="keyword">extern</span> uint8_t g_palThreadPriorities[<a class="code" href="../../d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d">PAL_MAX_NUMBER_OF_THREADS</a>];</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="preprocessor">#define PRIORYT_INDEX_OFFSET 3</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="preprocessor">#endif //PAL_UNIQUE_THREAD_PRIORITY</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keywordtype">void</span> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd">pal_plat_osReboot</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_RTOSInitialize</a>(<span class="keywordtype">void</span>* opaqueContext);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="keywordtype">void</span> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_RTOSDestroy</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> uint32_t <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_osKernelSysTick</a>();</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> uint64_t <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826">pal_plat_osKernelSysTick64</a>(<span class="keywordtype">void</span>); <span class="comment">// optional API - not part of original CMSIS API.</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> uint64_t <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_osKernelSysTickMicroSec</a>(uint64_t microseconds);</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> </div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span> uint64_t <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_osKernelSysMilliSecTick</a>(uint64_t sysTicks);</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> uint64_t <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd">pal_plat_osKernelSysTickFrequency</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> </div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_osThreadCreate</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> <span class="keyword">function</span>, <span class="keywordtype">void</span>* funcArgument, <a class="code" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> priority, uint32_t stackSize, uint32_t* stackPtr, <a class="code" href="../../df/d48/structpal__thread_local_store.html">palThreadLocalStore_t</a>* store, <a class="code" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a>* threadID);</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_osThreadTerminate</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a>* threadID);</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_osThreadGetId</a>();</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="keywordtype">void</span>* <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_osThreadGetLocalStore</a>();</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_osDelay</a>(uint32_t milliseconds);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_osTimerCreate</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> <span class="keyword">function</span>, <span class="keywordtype">void</span>* funcArgument, <a class="code" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> timerType, <a class="code" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a>* timerID);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_osTimerStart</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID, uint32_t millisec);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_osTimerStop</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID);</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> </div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_osTimerDelete</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a>* timerID);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_osMutexCreate</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a>* mutexID);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_osMutexWait</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID, uint32_t millisec);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> </div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_osMutexRelease</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID);</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> </div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_osMutexDelete</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a>* mutexID);</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> </div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_osSemaphoreCreate</a>(uint32_t count, <a class="code" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a>* semaphoreID);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_osSemaphoreWait</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID, uint32_t millisec, int32_t* countersAvailable);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822">pal_plat_osSemaphoreRelease</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID);</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_osSemaphoreDelete</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a>* semaphoreID);</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_osPoolCreate</a>(uint32_t blockSize, uint32_t blockCount, <a class="code" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a>* memoryPoolID);</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> <span class="keywordtype">void</span>* <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_osPoolAlloc</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> <span class="keywordtype">void</span>* <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_osPoolCAlloc</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID);</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_osPoolFree</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID, <span class="keywordtype">void</span>* block);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_osPoolDestroy</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a>* memoryPoolID);</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_osMessageQueueCreate</a>(uint32_t messageQSize, <a class="code" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a>* messageQID);</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> </div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_osMessagePut</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t info, uint32_t timeout);</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> </div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58">pal_plat_osMessageGet</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t timeout, uint32_t* messageValue);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> </div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_osMessageQueueDestroy</a>(<a class="code" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a>* messageQID);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> </div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> int32_t <a class="code" href="../../d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_osAtomicIncrement</a>(int32_t* valuePtr, int32_t increment);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> </div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> <span class="preprocessor">#ifdef DEBUG</span></div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> <span class="preprocessor">#include "stdio.h"</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> <span class="preprocessor">#define pal_plat_printf(ARGS...) printf(ARGS)</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> <span class="preprocessor">#define pal_plat_vprintf(FORMAT,LIST) vprintf(FORMAT,LIST) </span></div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span> </div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> }</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> <span class="preprocessor">#endif //_PAL_COMMON_H</span></div><div class="ttc" id="pal__plat__rtos_8h_html_a84e2f41a587335de053e0b7f8a4163c2"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_osPoolFree</a></div><div class="ttdeci">palStatus_t pal_plat_osPoolFree(palMemoryPoolID_t memoryPoolID, void *block)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:795</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_ab37f3153b73dc87ca609c4c2e1bf8d6a"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_osSemaphoreDelete</a></div><div class="ttdeci">palStatus_t pal_plat_osSemaphoreDelete(palSemaphoreID_t *semaphoreID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:686</div></div> +<div class="ttc" id="pal__rtos_8h_html_a0a8206fc36c3dca549aed450f7777481"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a></div><div class="ttdeci">uintptr_t palSemaphoreID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:37</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a894db4d6fe636ef7a7ebf83d4334adbd"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd">pal_plat_osReboot</a></div><div class="ttdeci">void pal_plat_osReboot(void)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:181</div></div> +<div class="ttc" id="structpal__thread_local_store_html"><div class="ttname"><a href="../../df/d48/structpal__thread_local_store.html">pal_threadLocalStore</a></div><div class="ttdef"><b>Definition:</b> pal_rtos.h:67</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_ad104e06e7b043305fdbfbc37e4ea2826"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826">pal_plat_osKernelSysTick64</a></div><div class="ttdeci">uint64_t pal_plat_osKernelSysTick64(void)</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a80f5ca578197088e4cf84042c9efc2d7"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_osTimerStart</a></div><div class="ttdeci">palStatus_t pal_plat_osTimerStart(palTimerID_t timerID, uint32_t millisec)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:411</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_aca6b1b2f34861cf8e3d2dcc076992270"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_osThreadGetLocalStore</a></div><div class="ttdeci">void * pal_plat_osThreadGetLocalStore()</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:357</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a2d18206974bdf17c48b97e2e16505f19"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_osKernelSysTickMicroSec</a></div><div class="ttdeci">uint64_t pal_plat_osKernelSysTickMicroSec(uint64_t microseconds)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:240</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a6e7b3c23b094270b4e013c4412f2d3b1"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_osSemaphoreCreate</a></div><div class="ttdeci">palStatus_t pal_plat_osSemaphoreCreate(uint32_t count, palSemaphoreID_t *semaphoreID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:603</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_ac9231eef550eb7b62a89e7a34b62d014"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_osSemaphoreWait</a></div><div class="ttdeci">palStatus_t pal_plat_osSemaphoreWait(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t *countersAvailable)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:638</div></div> +<div class="ttc" id="pal__rtos_8h_html_a9858103df451aaf98a8af08c2583b94a"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a></div><div class="ttdeci">enum palTimerType palTimerType_t</div><div class="ttdoc">Timers types supported in PAL. </div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_aee15bcaba1ed33c264bc4c91c1dbb1cf"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_osTimerCreate</a></div><div class="ttdeci">palStatus_t pal_plat_osTimerCreate(palTimerFuncPtr function, void *funcArgument, palTimerType_t timerType, palTimerID_t *timerID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:374</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a8a484abc75cf595862459d6ab21c7a0c"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_RTOSDestroy</a></div><div class="ttdeci">void pal_plat_RTOSDestroy(void)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:206</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a8dff6b49f9798cdd4eed04f3dff30330"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_osPoolCAlloc</a></div><div class="ttdeci">void * pal_plat_osPoolCAlloc(palMemoryPoolID_t memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:779</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_ac62a5b36fc159e12670c44a12dc08beb"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_osAtomicIncrement</a></div><div class="ttdeci">int32_t pal_plat_osAtomicIncrement(int32_t *valuePtr, int32_t increment)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:965</div></div> +<div class="ttc" id="pal__configuration_8h_html"><div class="ttname"><a href="../../d2/d87/pal__configuration_8h.html">pal_configuration.h</a></div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a0e0e6dc9958a9efd9beb62493bc3f67a"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_osMessageQueueDestroy</a></div><div class="ttdeci">palStatus_t pal_plat_osMessageQueueDestroy(palMessageQID_t *messageQID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:947</div></div> +<div class="ttc" id="pal__rtos_8h_html_a21fd378211ce09c12c15c39ff579627b"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a></div><div class="ttdeci">void(* palTimerFuncPtr)(void const *funcArgument)</div><div class="ttdoc">PAL timer function prototype. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:48</div></div> +<div class="ttc" id="pal__configuration_8h_html_abb1ceb83ff6a709614d1394e7e39391d"><div class="ttname"><a href="../../d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d">PAL_MAX_NUMBER_OF_THREADS</a></div><div class="ttdeci">#define PAL_MAX_NUMBER_OF_THREADS</div><div class="ttdoc">number of valid priorities limits the number of threads- if priorities are added this value should be...</div><div class="ttdef"><b>Definition:</b> pal_configuration.h:34</div></div> +<div class="ttc" id="pal__rtos_8h_html"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html">pal_rtos.h</a></div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_add4dbca7b11365e7301db1425c9fdf4d"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_osMutexRelease</a></div><div class="ttdeci">palStatus_t pal_plat_osMutexRelease(palMutexID_t mutexID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:551</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_aa80549a557e50e0759991c6b11eb456a"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_osMessagePut</a></div><div class="ttdeci">palStatus_t pal_plat_osMessagePut(palMessageQID_t messageQID, uint32_t info, uint32_t timeout)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:886</div></div> +<div class="ttc" id="pal__rtos_8h_html_ac6b402eec0e5f2ab64c43abffd4d9901"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a></div><div class="ttdeci">uintptr_t palMutexID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:36</div></div> +<div class="ttc" id="pal__rtos_8h_html_a54696b00a498a3c4a1346030acd18853"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a></div><div class="ttdeci">void(* palThreadFuncPtr)(void const *funcArgument)</div><div class="ttdoc">PAL thread function prototype. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:51</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a2f1fdb410c4d6ae382622ef4f1884808"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_osTimerStop</a></div><div class="ttdeci">palStatus_t pal_plat_osTimerStop(palTimerID_t timerID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:436</div></div> +<div class="ttc" id="pal__rtos_8h_html_acb4162ac097039734d15916d29880910"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a></div><div class="ttdeci">uintptr_t palMessageQID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:39</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a140b31a48ac23c909f1a94ad11b04aac"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_osDelay</a></div><div class="ttdeci">palStatus_t pal_plat_osDelay(uint32_t milliseconds)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:218</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a909f4ae03b0acef0b84609d9b76679b4"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_osMutexDelete</a></div><div class="ttdeci">palStatus_t pal_plat_osMutexDelete(palMutexID_t *mutexID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:576</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a33ca5b5e9d3a80594de4977924e6bc1b"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_osPoolDestroy</a></div><div class="ttdeci">palStatus_t pal_plat_osPoolDestroy(palMemoryPoolID_t *memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:820</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_ae2425f958ab7d58eff5c5b3183f40305"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_osMutexCreate</a></div><div class="ttdeci">palStatus_t pal_plat_osMutexCreate(palMutexID_t *mutexID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:489</div></div> +<div class="ttc" id="pal__types_8h_html"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html">pal_types.h</a></div></div> +<div class="ttc" id="pal__rtos_8h_html_a278568ee407204e02cbd783f612e55be"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a></div><div class="ttdeci">enum pal_osPriority palThreadPriority_t</div><div class="ttdoc">Available priorities in PAL implementation, each priority can appear only once. </div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_ad25c8f7cb22985b077e893be5bc27d48"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_osMessageQueueCreate</a></div><div class="ttdeci">palStatus_t pal_plat_osMessageQueueCreate(uint32_t messageQSize, palMessageQID_t *messageQID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:837</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a4c42c35d3d7b375833a51b4670febe92"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_osThreadGetId</a></div><div class="ttdeci">palThreadID_t pal_plat_osThreadGetId()</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:315</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a2e7aaf20f2cad3b04061e1c3fd748c42"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_RTOSInitialize</a></div><div class="ttdeci">palStatus_t pal_plat_RTOSInitialize(void *opaqueContext)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:186</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_ae92f87b121a06e0062ee014025c0ba9e"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_osKernelSysTick</a></div><div class="ttdeci">uint32_t pal_plat_osKernelSysTick()</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:233</div></div> +<div class="ttc" id="pal__rtos_8h_html_a73ab99198ebc6e6af72064739b05bdcb"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a></div><div class="ttdeci">uintptr_t palMemoryPoolID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:38</div></div> +<div class="ttc" id="pal__rtos_8h_html_a4b627efa48e79a6fbcafae87ae397985"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a></div><div class="ttdeci">uintptr_t palTimerID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:35</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a252f210ce8a502891821b5af24b09822"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822">pal_plat_osSemaphoreRelease</a></div><div class="ttdeci">palStatus_t pal_plat_osSemaphoreRelease(palSemaphoreID_t semaphoreID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:661</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_aea4ad5224c43ff0fff2b77798d19748c"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_osMutexWait</a></div><div class="ttdeci">palStatus_t pal_plat_osMutexWait(palMutexID_t mutexID, uint32_t millisec)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:525</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a9c965e0fdfd80fc86c901cf2bde88c64"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_osThreadCreate</a></div><div class="ttdeci">palStatus_t pal_plat_osThreadCreate(palThreadFuncPtr function, void *funcArgument, palThreadPriority_t priority, uint32_t stackSize, uint32_t *stackPtr, palThreadLocalStore_t *store, palThreadID_t *threadID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:258</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a5938d16ea0c12594e8f8becd20acf3a7"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_osPoolAlloc</a></div><div class="ttdeci">void * pal_plat_osPoolAlloc(palMemoryPoolID_t memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:763</div></div> +<div class="ttc" id="pal__rtos_8h_html_aa61aba50e0f2dba5c8571417c2bdd9a5"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a></div><div class="ttdeci">uintptr_t palThreadID_t</div><div class="ttdoc">Primitives IDs types declarations. </div><div class="ttdef"><b>Definition:</b> pal_rtos.h:34</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a67696b86a6116a82da7c26a433280e58"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58">pal_plat_osMessageGet</a></div><div class="ttdeci">palStatus_t pal_plat_osMessageGet(palMessageQID_t messageQID, uint32_t timeout, uint32_t *messageValue)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:911</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a82eade9e7b100bd9dc9ab8312f98f827"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_osKernelSysMilliSecTick</a></div><div class="ttdeci">uint64_t pal_plat_osKernelSysMilliSecTick(uint64_t sysTicks)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:247</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_aacd58e95c23ad1c8f39b8b12ed2d83dd"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd">pal_plat_osKernelSysTickFrequency</a></div><div class="ttdeci">uint64_t pal_plat_osKernelSysTickFrequency(void)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:253</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a3117f8911b3e83e27031f366aa652a4f"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_osThreadTerminate</a></div><div class="ttdeci">palStatus_t pal_plat_osThreadTerminate(palThreadID_t *threadID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:322</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a9723baa43780a1083f43d786fa53a73d"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_osTimerDelete</a></div><div class="ttdeci">palStatus_t pal_plat_osTimerDelete(palTimerID_t *timerID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:461</div></div> +<div class="ttc" id="pal__plat__rtos_8h_html_a7a4fa20255fe38cf183f6c924419fe85"><div class="ttname"><a href="../../d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_osPoolCreate</a></div><div class="ttdeci">palStatus_t pal_plat_osPoolCreate(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t *memoryPoolID)</div><div class="ttdef"><b>Definition:</b> pal_plat_rtos.c:713</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d5/de2/pal__all__test_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,63 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_all_test.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_all_test.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +</div></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,200 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_socket_test_main_FreeRTOS.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_socket_test_main_FreeRTOS.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "fsl_device_registers.h"</code><br /> +<code>#include "fsl_debug_console.h"</code><br /> +<code>#include "board.h"</code><br /> +<code>#include "pin_mux.h"</code><br /> +<code>#include "clock_config.h"</code><br /> +<code>#include "unity.c"</code><br /> +<code>#include "FreeRTOS.h"</code><br /> +<code>#include "task.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a37fa0e609ebaa8565ad388e41cc92a43"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#a37fa0e609ebaa8565ad388e41cc92a43">APP_DEBUG_UART_BAUDRATE</a>   9600 /* Debug console baud rate. */</td></tr> +<tr class="separator:a37fa0e609ebaa8565ad388e41cc92a43"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3b196c652283b89130c86ca7bd1559bc"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#a3b196c652283b89130c86ca7bd1559bc">APP_DEBUG_UART_CLKSRC_NAME</a>   kCLOCK_CoreSysClk /* System clock. */</td></tr> +<tr class="separator:a3b196c652283b89130c86ca7bd1559bc"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#a2393bacb0eb76d2dd1b0c200a8769cab">TEST_pal_socket_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a840291bc02cba5474a4cb46a9b9566fe"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#a840291bc02cba5474a4cb46a9b9566fe">main</a> (void)</td></tr> +<tr class="memdesc:a840291bc02cba5474a4cb46a9b9566fe"><td class="mdescLeft"> </td><td class="mdescRight">Main function. <a href="#a840291bc02cba5474a4cb46a9b9566fe">More...</a><br /></td></tr> +<tr class="separator:a840291bc02cba5474a4cb46a9b9566fe"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad7d1365a74953be39a9a7e65702b69a3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#ad7d1365a74953be39a9a7e65702b69a3">unity_output_char</a> (int c)</td></tr> +<tr class="separator:ad7d1365a74953be39a9a7e65702b69a3"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a37fa0e609ebaa8565ad388e41cc92a43"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define APP_DEBUG_UART_BAUDRATE   9600 /* Debug console baud rate. */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a3b196c652283b89130c86ca7bd1559bc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define APP_DEBUG_UART_CLKSRC_NAME   kCLOCK_CoreSysClk /* System clock. */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a840291bc02cba5474a4cb46a9b9566fe"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Main function. </p> + +</div> +</div> +<a class="anchor" id="a2393bacb0eb76d2dd1b0c200a8769cab"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_socket_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad7d1365a74953be39a9a7e65702b69a3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void unity_output_char </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>c</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d6/dc2/pal__types_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,156 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_types.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#nested-classes">Data Structures</a> | +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> </div> + <div class="headertitle"> +<div class="title">pal_types.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include <stdint.h></code><br /> +<code>#include <stdbool.h></code><br /> +<code>#include <stddef.h></code><br /> +</div> +<p><a href="../../d6/dc2/pal__types_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> +Data Structures</h2></td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a92e2ad3a6b8c71818b6a08720fa84ba5"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS</a>   0</td></tr> +<tr class="separator:a92e2ad3a6b8c71818b6a08720fa84ba5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3ef7eab8cd0e570b6586628cc9d5ccab"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">NULLPTR</a>   0</td></tr> +<tr class="separator:a3ef7eab8cd0e570b6586628cc9d5ccab"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:a160277354e86b9aea01d7689ec26d88d"><td class="memItemLeft" align="right" valign="top">typedef int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></td></tr> +<tr class="separator:a160277354e86b9aea01d7689ec26d88d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8c90171089db400b392bf0d3b68de0e4"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a></td></tr> +<tr class="separator:a8c90171089db400b392bf0d3b68de0e4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1fc5fbdbd83764292a7b4252e44e3b81"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a></td></tr> +<tr class="separator:a1fc5fbdbd83764292a7b4252e44e3b81"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a3ef7eab8cd0e570b6586628cc9d5ccab"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define NULLPTR   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a92e2ad3a6b8c71818b6a08720fa84ba5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_SUCCESS   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="a8c90171089db400b392bf0d3b68de0e4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a> <a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a1fc5fbdbd83764292a7b4252e44e3b81"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a> <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a160277354e86b9aea01d7689ec26d88d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef int32_t <a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d6/dc2/pal__types_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,72 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_types.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_types.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d6/dc2/pal__types_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_TYPES_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_TYPES_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#include <stdint.h></span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include <stdbool.h></span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#include <stddef.h></span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div><div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"> 28</a></span> <span class="preprocessor">#define PAL_SUCCESS 0</span></div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab"> 29</a></span> <span class="preprocessor">#define NULLPTR 0</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d"> 31</a></span> <span class="keyword">typedef</span> int32_t <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a>;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> </div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="../../d8/d19/struct__pal_buffer__t.html"> 34</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> {</div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="../../d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd"> 36</a></span>  uint32_t <a class="code" href="../../d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd">maxBufferLength</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="../../d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a"> 37</a></span>  uint32_t <a class="code" href="../../d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a">bufferLength</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="../../d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb"> 38</a></span>  uint8_t *<a class="code" href="../../d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb">buffer</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> } <a class="code" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="../../d2/dab/struct__pal_const_buffer__t.html"> 41</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> {</div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="../../d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7"> 43</a></span>  <span class="keyword">const</span> uint32_t <a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7">maxBufferLength</a>;</div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="../../d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801"> 44</a></span>  <span class="keyword">const</span> uint32_t <a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801">bufferLength</a>;</div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="../../d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3"> 45</a></span>  <span class="keyword">const</span> uint8_t *<a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3">buffer</a>;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> } <a class="code" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a>;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> }</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="preprocessor">#endif //_PAL_TYPES_H</span></div><div class="ttc" id="struct__pal_const_buffer__t_html_a8d4966dc771ad87628b4bd01ae4ea801"><div class="ttname"><a href="../../d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801">_palConstBuffer_t::bufferLength</a></div><div class="ttdeci">const uint32_t bufferLength</div><div class="ttdef"><b>Definition:</b> pal_types.h:44</div></div> +<div class="ttc" id="struct__pal_buffer__t_html_a7f87cfadd565637bee1de625d19f3d3a"><div class="ttname"><a href="../../d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a">_palBuffer_t::bufferLength</a></div><div class="ttdeci">uint32_t bufferLength</div><div class="ttdef"><b>Definition:</b> pal_types.h:37</div></div> +<div class="ttc" id="struct__pal_buffer__t_html"><div class="ttname"><a href="../../d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a></div><div class="ttdef"><b>Definition:</b> pal_types.h:34</div></div> +<div class="ttc" id="pal__types_8h_html_a8c90171089db400b392bf0d3b68de0e4"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a></div><div class="ttdeci">struct _palBuffer_t palBuffer_t</div></div> +<div class="ttc" id="pal__types_8h_html_a1fc5fbdbd83764292a7b4252e44e3b81"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a></div><div class="ttdeci">struct _palConstBuffer_t palConstBuffer_t</div></div> +<div class="ttc" id="struct__pal_const_buffer__t_html_a3660dfb9336b8d57a3c2223de14646d3"><div class="ttname"><a href="../../d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3">_palConstBuffer_t::buffer</a></div><div class="ttdeci">const uint8_t * buffer</div><div class="ttdef"><b>Definition:</b> pal_types.h:45</div></div> +<div class="ttc" id="struct__pal_buffer__t_html_a27cc969a96cc37cb772a3fd76dd860cd"><div class="ttname"><a href="../../d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd">_palBuffer_t::maxBufferLength</a></div><div class="ttdeci">uint32_t maxBufferLength</div><div class="ttdef"><b>Definition:</b> pal_types.h:36</div></div> +<div class="ttc" id="struct__pal_const_buffer__t_html"><div class="ttname"><a href="../../d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a></div><div class="ttdef"><b>Definition:</b> pal_types.h:41</div></div> +<div class="ttc" id="struct__pal_buffer__t_html_a80fff022df87cf0d4817ae19eb8257bb"><div class="ttname"><a href="../../d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb">_palBuffer_t::buffer</a></div><div class="ttdeci">uint8_t * buffer</div><div class="ttdef"><b>Definition:</b> pal_types.h:38</div></div> +<div class="ttc" id="struct__pal_const_buffer__t_html_ad411a35599e0f8500f29e5bd2cb66cc7"><div class="ttname"><a href="../../d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7">_palConstBuffer_t::maxBufferLength</a></div><div class="ttdeci">const uint32_t maxBufferLength</div><div class="ttdef"><b>Definition:</b> pal_types.h:43</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d7/d66/pal__init_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/pal_init.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_init.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d5/d59/pal__plat__rtos_8h_source.html">pal_plat_rtos.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d2c/pal__plat__network_8h_source.html">pal_plat_network.h</a>"</code><br /> +<code>#include "<a class="el" href="../../db/dcf/pal__macros_8h_source.html">pal_macros.h</a>"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a28095bec6e2c1c74ad3b08414f44b9d6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d7/d66/pal__init_8c.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal_init</a> ()</td></tr> +<tr class="separator:a28095bec6e2c1c74ad3b08414f44b9d6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a312dfda15122dbd2abff67b580c811ad"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d7/d66/pal__init_8c.html#a312dfda15122dbd2abff67b580c811ad">pal_destroy</a> ()</td></tr> +<tr class="separator:a312dfda15122dbd2abff67b580c811ad"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a312dfda15122dbd2abff67b580c811ad"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_destroy </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL destruction This function will call each module's destroy function (if exist) to free resources. </p> + +</div> +</div> +<a class="anchor" id="a28095bec6e2c1c74ad3b08414f44b9d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_init </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL initialization This function will call each module's initialization function (if exist) to allocate required resources and initiate them. </p><dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d8/d19/struct__pal_buffer__t.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: _palBuffer_t Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">_palBuffer_t Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:a27cc969a96cc37cb772a3fd76dd860cd"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd">maxBufferLength</a></td></tr> +<tr class="separator:a27cc969a96cc37cb772a3fd76dd860cd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7f87cfadd565637bee1de625d19f3d3a"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a">bufferLength</a></td></tr> +<tr class="separator:a7f87cfadd565637bee1de625d19f3d3a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a80fff022df87cf0d4817ae19eb8257bb"><td class="memItemLeft" align="right" valign="top">uint8_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb">buffer</a></td></tr> +<tr class="separator:a80fff022df87cf0d4817ae19eb8257bb"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="a80fff022df87cf0d4817ae19eb8257bb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint8_t* _palBuffer_t::buffer</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7f87cfadd565637bee1de625d19f3d3a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t _palBuffer_t::bufferLength</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a27cc969a96cc37cb772a3fd76dd860cd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t _palBuffer_t::maxBufferLength</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d8/d5f/pal__socket__test__utils_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_socket_test_utils.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_socket_test_utils.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a>"</code><br /> +<code>#include "<a class="el" href="../../df/d2a/pal__socket__test__utils_8h_source.html">pal_socket_test_utils.h</a>"</code><br /> +<code>#include "NetworkInterface.h"</code><br /> +<code>#include "EthernetInterface.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:ac641d6ab2d8d2f23e89e7c36694d85dd"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/d5f/pal__socket__test__utils_8cpp.html#ac641d6ab2d8d2f23e89e7c36694d85dd">TEST_PRINTF</a>   printf</td></tr> +<tr class="separator:ac641d6ab2d8d2f23e89e7c36694d85dd"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a5e4a39a385159acfd150a2e6098351cf"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/d5f/pal__socket__test__utils_8cpp.html#a5e4a39a385159acfd150a2e6098351cf">palTestGetNetWorkInterfaceContext</a> ()</td></tr> +<tr class="separator:a5e4a39a385159acfd150a2e6098351cf"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="ac641d6ab2d8d2f23e89e7c36694d85dd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define TEST_PRINTF   printf</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a5e4a39a385159acfd150a2e6098351cf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* palTestGetNetWorkInterfaceContext </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d8/ddd/pal__update__test_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,628 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_update_test.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#enum-members">Enumerations</a> | +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_update_test.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "pal_update.h"</code><br /> +<code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +<code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +<code>#include "<a class="el" href="../../d0/d51/pal__test__utils_8h_source.html">pal_test_utils.h</a>"</code><br /> +<code>#include "string.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a35721ed2d9f78cd139ea6f6c35432a4a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a35721ed2d9f78cd139ea6f6c35432a4a">KILOBYTE</a>   1024</td></tr> +<tr class="separator:a35721ed2d9f78cd139ea6f6c35432a4a"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:a547526e0a5665bed054e5e1b140293f9"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713">_updateTestState</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a547526e0a5665bed054e5e1b140293f9">updateTestState</a></td></tr> +<tr class="separator:a547526e0a5665bed054e5e1b140293f9"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a> +Enumerations</h2></td></tr> +<tr class="memitem:abf05e786fbc30213ff2ab66f6369d713"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713">_updateTestState</a> { <a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713a4350eb18d5ff16dd8a84b3249056ae2e">test_init</a> = 1, +<a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713ad983e5411d9ec47c285a8dd393f02a6e">test_write</a>, +<a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713a0ead5736ab3d192c275b996803eba149">test_commit</a>, +<a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713a1b3c73ee83014627ad0da186a2c1a2fb">test_read</a> + }</td></tr> +<tr class="separator:abf05e786fbc30213ff2ab66f6369d713"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a19cca449868c9c3f0d8991c341ea839c"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a19cca449868c9c3f0d8991c341ea839c">TEST_GROUP</a> (pal_update)</td></tr> +<tr class="separator:a19cca449868c9c3f0d8991c341ea839c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9ae4fbf6e981e26dcb6749930b21b08d"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a9ae4fbf6e981e26dcb6749930b21b08d">TEST_SETUP</a> (pal_update)</td></tr> +<tr class="separator:a9ae4fbf6e981e26dcb6749930b21b08d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4fdba49feaaa03412cc15e81319f4f4f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a4fdba49feaaa03412cc15e81319f4f4f">printBuffer</a> (uint8_t *buffer, size_t bufSize)</td></tr> +<tr class="separator:a4fdba49feaaa03412cc15e81319f4f4f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9156028c0096109280c0c52cb0f2e812"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a9156028c0096109280c0c52cb0f2e812">TEST_TEAR_DOWN</a> (pal_update)</td></tr> +<tr class="separator:a9156028c0096109280c0c52cb0f2e812"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a800bf9c86bfc062602a83dc67185e30b"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a800bf9c86bfc062602a83dc67185e30b">TEST</a> (pal_update, pal_update_start)</td></tr> +<tr class="separator:a800bf9c86bfc062602a83dc67185e30b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aff301a468282a4d9147b1434a06381f9"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#aff301a468282a4d9147b1434a06381f9">TEST</a> (pal_update, pal_update_init)</td></tr> +<tr class="separator:aff301a468282a4d9147b1434a06381f9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acc0da3328c3a58d974675b6bd56edd1e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#acc0da3328c3a58d974675b6bd56edd1e">pal_update_xK</a> (int sizeInK)</td></tr> +<tr class="separator:acc0da3328c3a58d974675b6bd56edd1e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afecfa17c6110a0895f52431cd532092f"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#afecfa17c6110a0895f52431cd532092f">TEST</a> (pal_update, pal_update_1k)</td></tr> +<tr class="separator:afecfa17c6110a0895f52431cd532092f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa48cff0f3f13d922ded90664c75791fa"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#aa48cff0f3f13d922ded90664c75791fa">TEST</a> (pal_update, pal_update_2k)</td></tr> +<tr class="separator:aa48cff0f3f13d922ded90664c75791fa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a882b0ade875866f896cb88174512bb30"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a882b0ade875866f896cb88174512bb30">TEST</a> (pal_update, pal_update_4k)</td></tr> +<tr class="separator:a882b0ade875866f896cb88174512bb30"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac3e0ff918f632867c5fe44c3b270facf"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#ac3e0ff918f632867c5fe44c3b270facf">TEST</a> (pal_update, pal_update_8k)</td></tr> +<tr class="separator:ac3e0ff918f632867c5fe44c3b270facf"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0da24bdd2a325e3dbd2413f41775406"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#ac0da24bdd2a325e3dbd2413f41775406">TEST</a> (pal_update, pal_update_16k)</td></tr> +<tr class="separator:ac0da24bdd2a325e3dbd2413f41775406"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3dd80d217f7b7a8bdba04d47c5e21741"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a3dd80d217f7b7a8bdba04d47c5e21741">TEST</a> (pal_update, pal_update_4k_write_1k_4_times)</td></tr> +<tr class="separator:a3dd80d217f7b7a8bdba04d47c5e21741"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acf68771c3ac1f79337f71f1e808b2153"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#acf68771c3ac1f79337f71f1e808b2153">TEST</a> (pal_update, pal_update_stressTest)</td></tr> +<tr class="separator:acf68771c3ac1f79337f71f1e808b2153"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5d26b75e42d95d624a3bdae2efee96a5"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a5d26b75e42d95d624a3bdae2efee96a5">TEST</a> (pal_update, pal_update_Read)</td></tr> +<tr class="separator:a5d26b75e42d95d624a3bdae2efee96a5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acd4f695bbb4568387dbc95a2f7173811"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#acd4f695bbb4568387dbc95a2f7173811">TEST</a> (pal_update, pal_update_getActiveHash)</td></tr> +<tr class="separator:acd4f695bbb4568387dbc95a2f7173811"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:af6a911649425f88a1716a01216ea7e09"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#af6a911649425f88a1716a01216ea7e09">g_writeBuffer</a> = {0}</td></tr> +<tr class="separator:af6a911649425f88a1716a01216ea7e09"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a88c0b91a86e5aa487b1db6e9e21a3fd5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a88c0b91a86e5aa487b1db6e9e21a3fd5">g_readBuffer</a> = {0}</td></tr> +<tr class="separator:a88c0b91a86e5aa487b1db6e9e21a3fd5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae66263351db36073be343d46a85317dd"><td class="memItemLeft" align="right" valign="top">palImageHeaderDeails_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#ae66263351db36073be343d46a85317dd">g_imageHeader</a> = {0}</td></tr> +<tr class="separator:ae66263351db36073be343d46a85317dd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab2289c97851e687884bbdc27abbe066f"><td class="memItemLeft" align="right" valign="top">uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#ab2289c97851e687884bbdc27abbe066f">g_isTestDone</a></td></tr> +<tr class="separator:ab2289c97851e687884bbdc27abbe066f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8aa629fedb643fb85f3624300008091c"><td class="memItemLeft" align="right" valign="top">uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d8/ddd/pal__update__test_8c.html#a8aa629fedb643fb85f3624300008091c">numberofBlocks</a> = 0</td></tr> +<tr class="separator:a8aa629fedb643fb85f3624300008091c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a35721ed2d9f78cd139ea6f6c35432a4a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define KILOBYTE   1024</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="a547526e0a5665bed054e5e1b140293f9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef enum <a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713">_updateTestState</a> <a class="el" href="../../d8/ddd/pal__update__test_8c.html#a547526e0a5665bed054e5e1b140293f9">updateTestState</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Enumeration Type Documentation</h2> +<a class="anchor" id="abf05e786fbc30213ff2ab66f6369d713"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d8/ddd/pal__update__test_8c.html#abf05e786fbc30213ff2ab66f6369d713">_updateTestState</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="abf05e786fbc30213ff2ab66f6369d713a4350eb18d5ff16dd8a84b3249056ae2e"></a>test_init </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="abf05e786fbc30213ff2ab66f6369d713ad983e5411d9ec47c285a8dd393f02a6e"></a>test_write </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="abf05e786fbc30213ff2ab66f6369d713a0ead5736ab3d192c275b996803eba149"></a>test_commit </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="abf05e786fbc30213ff2ab66f6369d713a1b3c73ee83014627ad0da186a2c1a2fb"></a>test_read </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="acc0da3328c3a58d974675b6bd56edd1e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_update_xK </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>sizeInK</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4fdba49feaaa03412cc15e81319f4f4f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void printBuffer </td> + <td>(</td> + <td class="paramtype">uint8_t * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>bufSize</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a800bf9c86bfc062602a83dc67185e30b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_start </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aff301a468282a4d9147b1434a06381f9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_init </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="afecfa17c6110a0895f52431cd532092f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_1k </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa48cff0f3f13d922ded90664c75791fa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_2k </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a882b0ade875866f896cb88174512bb30"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_4k </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac3e0ff918f632867c5fe44c3b270facf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_8k </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac0da24bdd2a325e3dbd2413f41775406"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_16k </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a3dd80d217f7b7a8bdba04d47c5e21741"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_4k_write_1k_4_times </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="acf68771c3ac1f79337f71f1e808b2153"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_stressTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a5d26b75e42d95d624a3bdae2efee96a5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_Read </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="acd4f695bbb4568387dbc95a2f7173811"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_update_getActiveHash </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a19cca449868c9c3f0d8991c341ea839c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_GROUP </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9ae4fbf6e981e26dcb6749930b21b08d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_SETUP </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9156028c0096109280c0c52cb0f2e812"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_TEAR_DOWN </td> + <td>(</td> + <td class="paramtype">pal_update </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="ae66263351db36073be343d46a85317dd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">palImageHeaderDeails_t g_imageHeader = {0}</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ab2289c97851e687884bbdc27abbe066f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint8_t g_isTestDone</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a88c0b91a86e5aa487b1db6e9e21a3fd5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> g_readBuffer = {0}</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af6a911649425f88a1716a01216ea7e09"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> g_writeBuffer = {0}</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8aa629fedb643fb85f3624300008091c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint8_t numberofBlocks = 0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d16/pal_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,111 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../db/dcf/pal__macros_8h_source.html">pal_macros.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d2/d87/pal__configuration_8h_source.html">pal_configuration.h</a>"</code><br /> +<code>#include "<a class="el" href="../../da/dfe/pal__errors_8h_source.html">pal_errors.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +</div> +<p><a href="../../d9/d16/pal_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a28095bec6e2c1c74ad3b08414f44b9d6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal_init</a> ()</td></tr> +<tr class="separator:a28095bec6e2c1c74ad3b08414f44b9d6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a312dfda15122dbd2abff67b580c811ad"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad">pal_destroy</a> ()</td></tr> +<tr class="separator:a312dfda15122dbd2abff67b580c811ad"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a312dfda15122dbd2abff67b580c811ad"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_destroy </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL destruction This function will call each module's destroy function (if exist) to free resources. </p> + +</div> +</div> +<a class="anchor" id="a28095bec6e2c1c74ad3b08414f44b9d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_init </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL initialization This function will call each module's initialization function (if exist) to allocate required resources and initiate them. </p><dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d16/pal_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d9/d16/pal_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment">//includes for common headers in PAL</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include "<a class="code" href="../../db/dcf/pal__macros_8h.html">pal_macros.h</a>"</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include "<a class="code" href="../../d2/d87/pal__configuration_8h.html">pal_configuration.h</a>"</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include "<a class="code" href="../../da/dfe/pal__errors_8h.html">pal_errors.h</a>"</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="../../d6/dc2/pal__types_8h.html">pal_types.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> </div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment">//includes for modules headers.</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="../../d4/d01/pal__rtos_8h.html">pal_rtos.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment">//#include "pal_socket.h"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> </div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment">//declarations for global init and destroy of PAL</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal_init</a>();</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad">pal_destroy</a>();</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> }</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="preprocessor">#endif //_PAL_H</span></div><div class="ttc" id="pal__configuration_8h_html"><div class="ttname"><a href="../../d2/d87/pal__configuration_8h.html">pal_configuration.h</a></div></div> +<div class="ttc" id="pal__rtos_8h_html"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html">pal_rtos.h</a></div></div> +<div class="ttc" id="pal__types_8h_html"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html">pal_types.h</a></div></div> +<div class="ttc" id="pal__errors_8h_html"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html">pal_errors.h</a></div></div> +<div class="ttc" id="pal__macros_8h_html"><div class="ttname"><a href="../../db/dcf/pal__macros_8h.html">pal_macros.h</a></div></div> +<div class="ttc" id="pal_8h_html_a312dfda15122dbd2abff67b580c811ad"><div class="ttname"><a href="../../d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad">pal_destroy</a></div><div class="ttdeci">void pal_destroy()</div><div class="ttdef"><b>Definition:</b> pal_init.c:64</div></div> +<div class="ttc" id="pal_8h_html_a28095bec6e2c1c74ad3b08414f44b9d6"><div class="ttname"><a href="../../d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal_init</a></div><div class="ttdeci">palStatus_t pal_init()</div><div class="ttdef"><b>Definition:</b> pal_init.c:27</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d16/structpal_net_interface_info.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,114 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: palNetInterfaceInfo Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">palNetInterfaceInfo Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:ad028021cafddc5355dfccfac1345f4f6"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6">interfaceName</a> [16]</td></tr> +<tr class="separator:ad028021cafddc5355dfccfac1345f4f6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:affc930af87e8696f63b30b911cf8b03d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d">address</a></td></tr> +<tr class="separator:affc930af87e8696f63b30b911cf8b03d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9b816dd947f25d303e32fca36d04080e"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e">addressSize</a></td></tr> +<tr class="separator:a9b816dd947f25d303e32fca36d04080e"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> +<div class="textblock"><p>address data structure with enough room to support IPV4 and IPV6 </p> +</div><h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="affc930af87e8696f63b30b911cf8b03d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> palNetInterfaceInfo::address</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9b816dd947f25d303e32fca36d04080e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t palNetInterfaceInfo::addressSize</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad028021cafddc5355dfccfac1345f4f6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">char palNetInterfaceInfo::interfaceName[16]</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d17/pal__network_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1195 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_network.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#nested-classes">Data Structures</a> | +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#enum-members">Enumerations</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_network.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +</div> +<p><a href="../../d9/d17/pal__network_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> +Data Structures</h2></td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/d42/structpal_socket_address.html">palSocketAddress</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/dfc/structpal__time_val.html">pal_timeVal</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:ac831e2e5064065e10c741da1003ff039"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039">PAL_NET_MAX_ADDR_SIZE</a>   32</td></tr> +<tr class="separator:ac831e2e5064065e10c741da1003ff039"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aefc09884590381a71433c34b3f2e2aa5"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#aefc09884590381a71433c34b3f2e2aa5">PAL_NET_DEFAULT_INTERFACE</a>   0xFFFFFFFF</td></tr> +<tr class="separator:aefc09884590381a71433c34b3f2e2aa5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad7a3e182cb430da7c139858b0bfbb27f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f">PAL_IPV4_ADDRESS_SIZE</a>   4</td></tr> +<tr class="separator:ad7a3e182cb430da7c139858b0bfbb27f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9903ebae215b70520c8dcc9f0aa03e24"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24">PAL_IPV6_ADDRESS_SIZE</a>   16</td></tr> +<tr class="separator:a9903ebae215b70520c8dcc9f0aa03e24"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5607f2af4b642ef0548bd47c891c6d31"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>   8</td></tr> +<tr class="separator:a5607f2af4b642ef0548bd47c891c6d31"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aae14933b48cd31821913f2bfb15e18b2"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2">PAL_NET_SOCKET_SELECT_RX_BIT</a>   (1)</td></tr> +<tr class="separator:aae14933b48cd31821913f2bfb15e18b2"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad8ddc879cf2eace65036137660b8b53d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d">PAL_NET_SOCKET_SELECT_TX_BIT</a>   (2)</td></tr> +<tr class="separator:ad8ddc879cf2eace65036137660b8b53d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa66d7131cc6c44ac6c5ab6a9dda3f69a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a">PAL_NET_SOCKET_SELECT_ERR_BIT</a>   (4)</td></tr> +<tr class="separator:aa66d7131cc6c44ac6c5ab6a9dda3f69a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8894a96773018ba6058811087b4b2ac8"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a8894a96773018ba6058811087b4b2ac8">PAL_NET_SELECT_IS_RX</a>(socketStatus, index)    ((socketStatus[index] | <a class="el" href="../../d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2">PAL_NET_SOCKET_SELECT_RX_BIT</a>) != 0) /*! check if RX bit is set in select result for a given socket index*/</td></tr> +<tr class="separator:a8894a96773018ba6058811087b4b2ac8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a31ca79ac9ae5c2ddd890263a989fc4d8"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a31ca79ac9ae5c2ddd890263a989fc4d8">PAL_NET_SELECT_IS_TX</a>(socketStatus, index)    ((socketStatus[index] | <a class="el" href="../../d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d">PAL_NET_SOCKET_SELECT_TX_BIT</a>) != 0) /*! check if TX bit is set in select result for a given socket index*/</td></tr> +<tr class="separator:a31ca79ac9ae5c2ddd890263a989fc4d8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac2b7451d38e150079fbef20b57ee3fe9"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ac2b7451d38e150079fbef20b57ee3fe9">PAL_NET_SELECT_IS_ERR</a>(socketStatus, index)   ((socketStatus[index] | <a class="el" href="../../d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a">PAL_NET_SOCKET_SELECT_ERR_BIT</a>) != 0) /*! check if ERR bit is set in select result for a given socket index*/</td></tr> +<tr class="separator:ac2b7451d38e150079fbef20b57ee3fe9"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:ac844634680241bad287771f1ab8b0901"><td class="memItemLeft" align="right" valign="top">typedef uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a></td></tr> +<tr class="separator:ac844634680241bad287771f1ab8b0901"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0bd9e160ca4973db4d846a4369ea996"><td class="memItemLeft" align="right" valign="top">typedef void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a></td></tr> +<tr class="separator:ac0bd9e160ca4973db4d846a4369ea996"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9e444742ff895f63c34f727b4fcfba10"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../db/d42/structpal_socket_address.html">palSocketAddress</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a></td></tr> +<tr class="separator:a9e444742ff895f63c34f727b4fcfba10"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab74987f80f6b9b025ed9f067a2c654da"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a></td></tr> +<tr class="separator:ab74987f80f6b9b025ed9f067a2c654da"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a03e2ae5a01f21cf32933bf4bdca5e5b1"><td class="memItemLeft" align="right" valign="top">typedef uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a>[<a class="el" href="../../d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f">PAL_IPV4_ADDRESS_SIZE</a>]</td></tr> +<tr class="separator:a03e2ae5a01f21cf32933bf4bdca5e5b1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad47edc267b97d7b32e30b45ad4674192"><td class="memItemLeft" align="right" valign="top">typedef uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a>[<a class="el" href="../../d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24">PAL_IPV6_ADDRESS_SIZE</a>]</td></tr> +<tr class="separator:ad47edc267b97d7b32e30b45ad4674192"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab8ff1c2207a2f7c219088008fbc99ff4"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../de/dfc/structpal__time_val.html">pal_timeVal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a></td></tr> +<tr class="separator:ab8ff1c2207a2f7c219088008fbc99ff4"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a> +Enumerations</h2></td></tr> +<tr class="memitem:a01b7e0ab9c2845885f6a7e012002dba7"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> { <a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3">PAL_AF_UNSPEC</a> = 0, +<a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f">PAL_AF_INET</a> = 2, +<a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7">PAL_AF_INET6</a> = 10 + }</td></tr> +<tr class="separator:a01b7e0ab9c2845885f6a7e012002dba7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab5d2c3c0d3b2f0e08afcd0d53ff4c418"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> { <a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941">PAL_SOCK_DGRAM</a> = 2 + }</td></tr> +<tr class="separator:ab5d2c3c0d3b2f0e08afcd0d53ff4c418"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2694f5de0fb810ddd7ff249ea1478f51"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> { <a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001">PAL_SO_REUSEADDR</a> = 0x0004, +<a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de">PAL_SO_SNDTIMEO</a> = 0x1005, +<a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca">PAL_SO_RCVTIMEO</a> = 0x1006 + }</td></tr> +<tr class="separator:a2694f5de0fb810ddd7ff249ea1478f51"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a081cc2fd09644c41068673487b39f6b8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8">pal_registerNetworkInterface</a> (void *networkInterfaceContext, uint32_t *interfaceIndex)</td></tr> +<tr class="separator:a081cc2fd09644c41068673487b39f6b8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abbeb1395896eb79ab564568b9ab8a628"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628">pal_setSockAddrPort</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, uint16_t port)</td></tr> +<tr class="separator:abbeb1395896eb79ab564568b9ab8a628"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aed02a6f53b88e1d5e81607b1221a3efa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_setSockAddrIPV4Addr</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> ipV4Addr)</td></tr> +<tr class="separator:aed02a6f53b88e1d5e81607b1221a3efa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0cc13f7ef9ceb4a75884a8bebf0d831c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_setSockAddrIPV6Addr</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> ipV6Addr)</td></tr> +<tr class="separator:a0cc13f7ef9ceb4a75884a8bebf0d831c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ade5cf610808db5462666465b648e7724"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724">pal_getSockAddrIPV4Addr</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> ipV4Addr)</td></tr> +<tr class="separator:ade5cf610808db5462666465b648e7724"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a153bc6165f64bbf3e6bcc79b0d39138f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_getSockAddrIPV6Addr</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, <a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> ipV6Addr)</td></tr> +<tr class="separator:a153bc6165f64bbf3e6bcc79b0d39138f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4658c7e8224b536d4fd71fed2602b12e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e">pal_getSockAddrPort</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *address, uint16_t *port)</td></tr> +<tr class="separator:a4658c7e8224b536d4fd71fed2602b12e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa852fb6e271fb91efd65e2a1ead93b9a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, bool nonBlockingSocket, uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:aa852fb6e271fb91efd65e2a1ead93b9a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2d9d4e04e43995123efe134c767cd6e1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1">pal_getSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> optionName, void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *optionLength)</td></tr> +<tr class="separator:a2d9d4e04e43995123efe134c767cd6e1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2e1bbe81a35a1cb54c351912bb97736f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_setSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, int optionName, const void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> optionLength)</td></tr> +<tr class="separator:a2e1bbe81a35a1cb54c351912bb97736f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac1ff0fb22cbd84e6c7920c095ddbde63"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_bind</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *myAddress, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> addressLength)</td></tr> +<tr class="separator:ac1ff0fb22cbd84e6c7920c095ddbde63"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6b5e705be1e7c3c16080f2b05b87ff7d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_receiveFrom</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, void *buffer, size_t length, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *from, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *fromLength, size_t *bytesReceived)</td></tr> +<tr class="separator:a6b5e705be1e7c3c16080f2b05b87ff7d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acce808f708e653b6bed317072888ca23"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23">pal_sendTo</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, const void *buffer, size_t length, const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *to, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> toLength, size_t *bytesSent)</td></tr> +<tr class="separator:acce808f708e653b6bed317072888ca23"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a18197e0f047f17d2617461594f5ed644"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644">pal_close</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a18197e0f047f17d2617461594f5ed644"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a65df7c68bcf7a21db5d1a7a3830fd19c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_getNumberOfNetInterfaces</a> (uint32_t *numInterfaces)</td></tr> +<tr class="separator:a65df7c68bcf7a21db5d1a7a3830fd19c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5258efd8b21d9c881df29b29686674d8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8">pal_getNetInterfaceInfo</a> (uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> *interfaceInfo)</td></tr> +<tr class="separator:a5258efd8b21d9c881df29b29686674d8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5cab4ea55a3d28cfd8d4dca8376a111c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d17/pal__network_8h.html#a5cab4ea55a3d28cfd8d4dca8376a111c">pal_socketMiniSelect</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socketsToCheck[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t numberOfSockets, <a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> *timeout, uint8_t palSocketStatus[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t *numberOfSocketsSet)</td></tr> +<tr class="separator:a5cab4ea55a3d28cfd8d4dca8376a111c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="ad7a3e182cb430da7c139858b0bfbb27f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_IPV4_ADDRESS_SIZE   4</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9903ebae215b70520c8dcc9f0aa03e24"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_IPV6_ADDRESS_SIZE   16</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aefc09884590381a71433c34b3f2e2aa5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_DEFAULT_INTERFACE   0xFFFFFFFF</td> + </tr> + </table> +</div><div class="memdoc"> +<p>socket options supported by PAL </p> + +</div> +</div> +<a class="anchor" id="ac831e2e5064065e10c741da1003ff039"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_MAX_ADDR_SIZE   32</td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL socket handle type </p> + +</div> +</div> +<a class="anchor" id="ac2b7451d38e150079fbef20b57ee3fe9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SELECT_IS_ERR</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">socketStatus, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname">index </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td>   ((socketStatus[index] | <a class="el" href="../../d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a">PAL_NET_SOCKET_SELECT_ERR_BIT</a>) != 0) /*! check if ERR bit is set in select result for a given socket index*/</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8894a96773018ba6058811087b4b2ac8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SELECT_IS_RX</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">socketStatus, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname">index </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td>   ((socketStatus[index] | <a class="el" href="../../d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2">PAL_NET_SOCKET_SELECT_RX_BIT</a>) != 0) /*! check if RX bit is set in select result for a given socket index*/</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a31ca79ac9ae5c2ddd890263a989fc4d8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SELECT_IS_TX</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">socketStatus, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname">index </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td>   ((socketStatus[index] | <a class="el" href="../../d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d">PAL_NET_SOCKET_SELECT_TX_BIT</a>) != 0) /*! check if TX bit is set in select result for a given socket index*/</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa66d7131cc6c44ac6c5ab6a9dda3f69a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SOCKET_SELECT_ERR_BIT   (4)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a5607f2af4b642ef0548bd47c891c6d31"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SOCKET_SELECT_MAX_SOCKETS   8</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aae14933b48cd31821913f2bfb15e18b2"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SOCKET_SELECT_RX_BIT   (1)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad8ddc879cf2eace65036137660b8b53d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NET_SOCKET_SELECT_TX_BIT   (2)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="ab8ff1c2207a2f7c219088008fbc99ff4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../de/dfc/structpal__time_val.html">pal_timeVal</a> <a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a03e2ae5a01f21cf32933bf4bdca5e5b1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uint8_t palIpV4Addr_t[<a class="el" href="../../d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f">PAL_IPV4_ADDRESS_SIZE</a>]</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad47edc267b97d7b32e30b45ad4674192"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uint8_t palIpV6Addr_t[<a class="el" href="../../d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24">PAL_IPV6_ADDRESS_SIZE</a>]</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ab74987f80f6b9b025ed9f067a2c654da"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo</a> <a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<p>address data structure with enough room to support IPV4 and IPV6 </p> + +</div> +</div> +<a class="anchor" id="ac0bd9e160ca4973db4d846a4369ea996"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef void* <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<p>length of data </p> + +</div> +</div> +<a class="anchor" id="a9e444742ff895f63c34f727b4fcfba10"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../db/d42/structpal_socket_address.html">palSocketAddress</a> <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac844634680241bad287771f1ab8b0901"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uint32_t <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL network socket API pal network sockets configurations options: set PAL_NET_TCP_AND_TLS_SUPPORT to true TCP is supported by the platform and is required set PAL_NET_ASYNCHRONOUS_SOCKET_API to true if asynchronous socket API supported by the platform and is required : CURRENTLY MANDATORY set PAL_NET_DNS_SUPPORT to true if you DNS url lookup API is supported. </p> + +</div> +</div> +<h2 class="groupheader">Enumeration Type Documentation</h2> +<a class="anchor" id="a01b7e0ab9c2845885f6a7e012002dba7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3"></a>PAL_AF_UNSPEC </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f"></a>PAL_AF_INET </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7"></a>PAL_AF_INET6 </td><td class="fielddoc"> +<p>Internet IP Protocol </p> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="a2694f5de0fb810ddd7ff249ea1478f51"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<p>socket types supported by PAL </p> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001"></a>PAL_SO_REUSEADDR </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de"></a>PAL_SO_SNDTIMEO </td><td class="fielddoc"> +<p>allow local address reuse </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca"></a>PAL_SO_RCVTIMEO </td><td class="fielddoc"> +<p>send timeout </p> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="ab5d2c3c0d3b2f0e08afcd0d53ff4c418"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<p>network domains supported by PAL </p> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941"></a>PAL_SOCK_DGRAM </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ac1ff0fb22cbd84e6c7920c095ddbde63"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_bind </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>myAddress</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>addressLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>bind a given socket to a local address </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket to bind </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">myAddress</td><td>the address to which to bind </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">addressLength</td><td>the length of the address passed in myAddress </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a18197e0f047f17d2617461594f5ed644"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_close </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>close a network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">socket</td><td>release and zero socket pointed to by given pointer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> +<dl class="section note"><dt>Note</dt><dd>recieves palSocket_t* and not palSocket_t so that it can zero the socket to avoid re-use. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5258efd8b21d9c881df29b29686674d8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getNetInterfaceInfo </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> * </td> + <td class="paramname"><em>interfaceInfo</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get information regarding the socket at the index/interface number given (this number is returned when registering the socket) </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>the number of the interface to get information for. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">interfaceInfo</td><td>will be set to the information for the given interface number. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a65df7c68bcf7a21db5d1a7a3830fd19c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getNumberOfNetInterfaces </td> + <td>(</td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numInterfaces</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get the number of current network interfaces </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">numInterfaces</td><td>will hold the number of interfaces after a successful call </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="ade5cf610808db5462666465b648e7724"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSockAddrIPV4Addr </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> </td> + <td class="paramname"><em>ipV4Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get an ipV4 address from a palSocketAddress_t </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">ipV4Addr</td><td>the address that is set in the address </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a153bc6165f64bbf3e6bcc79b0d39138f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSockAddrIPV6Addr </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> </td> + <td class="paramname"><em>ipV6Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get an ipV6 address from a palSocketAddress_t </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">ipV6Addr</td><td>the address that is set in the address </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a4658c7e8224b536d4fd71fed2602b12e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSockAddrPort </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint16_t * </td> + <td class="paramname"><em>port</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get a port from a palSocketAddress_t </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">port</td><td>the port that is set in the address </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a2d9d4e04e43995123efe134c767cd6e1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get options for a given network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket for which to get options </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>for which we are setting the option (see enum PAL_NET_SOCKET_OPTION for supported types) </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">optionValue</td><td>the buffer holding the option value returned by the function </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">optionLength</td><td>the size of the buffer provided for optionValue when calling the function after the call it will contain the length of data actually written to the optionValue buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a6b5e705be1e7c3c16080f2b05b87ff7d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_receiveFrom </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>from</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>fromLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesReceived</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>receive a payload from the given socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket to receive from [we expect sockets passed to this function to be of type PAL_SOCK_DGRAM ( the implementation may support other types as well) ] </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>the buffer for the payload data </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>of the buffer for the payload data </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">from</td><td>the address which sent the payload </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">fromLength</td><td>the length of the 'from' address, after completion will contain the amount of data actually written to the from address </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesReceived</td><td>after the call will contain the actual amount of payload data received to the buffer </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a081cc2fd09644c41068673487b39f6b8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_registerNetworkInterface </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>networkInterfaceContext</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>interfaceIndex</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Register a network interface for use with PAL sockets - must be called before other socket functions - most APIs will not work before a single interface is added. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">networkInterfaceContext</td><td>of the network interface to be added (OS specific , e.g. in MbedOS this is the NetworkInterface object pointer for the network adapter [note: we assume connect has already been called on this]) - if not available use NULL . </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">InterfaceIndex</td><td>will contain the index assigned to the interface in case it has been assigned successfully. this index can be used when creating a socket to bind the socket to the interface. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="acce808f708e653b6bed317072888ca23"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_sendTo </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>to</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>toLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesSent</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>send a payload to the given address using the given socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket to use for sending the payload [we expect sockets passed to this function to be of type PAL_SOCK_DGRAM ( the implementation may support other types as well) ] </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>the buffer for the payload data </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>of the buffer for the payload data </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">to</td><td>the address to which to payload should be sent </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">toLength</td><td>the length of the 'to' address </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesSent</td><td>after the call will contain the actual amount of payload data sent </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aed02a6f53b88e1d5e81607b1221a3efa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSockAddrIPV4Addr </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a> </td> + <td class="paramname"><em>ipV4Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set an ipV4 address to a palSocketAddress_t and also set the addressType to ipv4 </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">ipV4Addr</td><td>the address value to set </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a0cc13f7ef9ceb4a75884a8bebf0d831c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSockAddrIPV6Addr </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a> </td> + <td class="paramname"><em>ipV6Addr</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set an ipV6 address to a palSocketAddress_t and also set the addressType to ipv6 </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">ipV6Addr</td><td>the address value to set </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="abbeb1395896eb79ab564568b9ab8a628"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSockAddrPort </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>address</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint16_t </td> + <td class="paramname"><em>port</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set a port to a palSocketAddress_t setting it can be done either directly or via the palSetSockAddrIPV4Addr or palSetSockAddrIPV6Addr functions </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">address</td><td>the address to set </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">port</td><td>the port number to set </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> +<dl class="section note"><dt>Note</dt><dd>for the socket to be set correctly the addressType field of the address must be set correctly. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2e1bbe81a35a1cb54c351912bb97736f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_setSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>set options for a given network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>the socket for which to get options </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>for which we are setting the option (see enum PAL_NET_SOCKET_OPTION for supported types) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionValue</td><td>the buffer holding the option value to set for the given option </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionLength</td><td>the size of the buffer provided for optionValue </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aa852fb6e271fb91efd65e2a1ead93b9a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_socket </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> </td> + <td class="paramname"><em>domain</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> </td> + <td class="paramname"><em>type</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">bool </td> + <td class="paramname"><em>nonBlockingSocket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>get a network socket </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">domain</td><td>the domain for the created socket (see palSocketDomain_t for supported types) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">type</td><td>the type for the created socket (see palSocketType_t for supported types) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">nonBlockingSocket</td><td>if true the socket created is created as non-blocking (i.e. with O_NONBLOCK set) </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>the number of the network interface used for this socket (info in interfaces supported via pal_getNumberOfNetInterfaces and pal_getNetInterfaceInfo ), choose PAL_NET_DEFAULT_INTERFACE for default interface. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">socket</td><td>socket is returned through this output parameter </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a5cab4ea55a3d28cfd8d4dca8376a111c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_socketMiniSelect </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socketsToCheck</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>numberOfSockets</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> * </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint8_t </td> + <td class="paramname"><em>palSocketStatus</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numberOfSocketsSet</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>check if one or more (up to PAL_NET_SOCKET_SELECT_MAX_SOCKETS) sockets given has data available for reading/writing/error, the function will block until data is available for one of the given sockets or the timeout expires. To use the function: set the sockets you want to check in the socketsToCheck array and set a timeout, when it returns the socketStatus output will indicate the status of each socket passed in. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socketsToCheck</td><td>on input: the array of up to 8 sockets handles to check. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">numberOfSockets</td><td>the number of sockets set in the input socketsToCheck array. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>the amount of time till timeout if no socket activity is detected </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">socketStatus</td><td>will provide information on each socket in the input array indicating which event was set (none, rx, tx, err) check for desired event using macros. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">numberOfSocketsSet</td><td>is the total number of sockets set in all three data sets (tx, rx, err)after the function completes </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure </dd></dl> +<dl class="section note"><dt>Note</dt><dd>the entry in index x in the socketStatus array corresponds to the socket at index x in the sockets to check array. </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d17/pal__network_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_network.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_network.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d9/d17/pal__network_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_SOCKET_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_SOCKET_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include "<a class="code" href="../../d9/d16/pal_8h.html">pal.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> </div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901"> 32</a></span> <span class="keyword">typedef</span> uint32_t <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a>; </div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996"> 33</a></span> <span class="keyword">typedef</span> <span class="keywordtype">void</span>* <a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a>; </div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039"> 35</a></span> <span class="preprocessor">#define PAL_NET_MAX_ADDR_SIZE 32 // check if we can make this more efficient</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="../../db/d42/structpal_socket_address.html"> 37</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress</a> {</div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="../../db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221"> 38</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="../../db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221">addressType</a>; </div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="../../db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c"> 39</a></span>  <span class="keywordtype">char</span> <a class="code" href="../../db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c">addressData</a>[<a class="code" href="../../d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039">PAL_NET_MAX_ADDR_SIZE</a>]; </div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> } <a class="code" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a>; </div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="../../d9/d16/structpal_net_interface_info.html"> 42</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo</a>{</div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="../../d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6"> 43</a></span>  <span class="keywordtype">char</span> interfaceName[16]; <span class="comment">//15 + \0</span></div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="../../d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d"> 44</a></span>  <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a> <a class="code" href="../../d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d">address</a>;</div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="../../d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e"> 45</a></span>  uint32_t <a class="code" href="../../d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e">addressSize</a>;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> } <a class="code" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a>;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7"> 48</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> {</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3"> 49</a></span>  <a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3">PAL_AF_UNSPEC</a> = 0,</div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f"> 50</a></span>  <a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f">PAL_AF_INET</a> = 2, </div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7"> 51</a></span>  <a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7">PAL_AF_INET6</a> = 10, </div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> } <a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a>;</div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418"> 54</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> {</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="preprocessor">#if PAL_NET_TCP_AND_TLS_SUPPORT</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  PAL_SOCK_STREAM = 1, </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  PAL_SOCK_STREAM_SERVER = 99, </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="preprocessor">#endif //PAL_NET_TCP_AND_TLS_SUPPORT</span></div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941"> 59</a></span>  <a class="code" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941">PAL_SOCK_DGRAM</a> = 2 </div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> } <a class="code" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a>;</div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51"> 63</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> {</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001"> 64</a></span>  <a class="code" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001">PAL_SO_REUSEADDR</a> = 0x0004, </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="preprocessor">#if PAL_NET_TCP_AND_TLS_SUPPORT // socket options below supported only if TCP is supported.</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  PAL_SO_KEEPALIVE = 0x0008, </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="preprocessor">#endif //PAL_NET_TCP_AND_TLS_SUPPORT</span></div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de"> 68</a></span>  <a class="code" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de">PAL_SO_SNDTIMEO</a> = 0x1005, </div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca"> 69</a></span>  <a class="code" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca">PAL_SO_RCVTIMEO</a> = 0x1006, </div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> } <a class="code" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a>;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#aefc09884590381a71433c34b3f2e2aa5"> 72</a></span> <span class="preprocessor">#define PAL_NET_DEFAULT_INTERFACE 0xFFFFFFFF</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f"> 74</a></span> <span class="preprocessor">#define PAL_IPV4_ADDRESS_SIZE 4</span></div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24"> 75</a></span> <span class="preprocessor">#define PAL_IPV6_ADDRESS_SIZE 16</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1"> 77</a></span> <span class="keyword">typedef</span> uint8_t <a class="code" href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a>[<a class="code" href="../../d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f">PAL_IPV4_ADDRESS_SIZE</a>];</div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192"> 78</a></span> <span class="keyword">typedef</span> uint8_t <a class="code" href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a>[<a class="code" href="../../d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24">PAL_IPV6_ADDRESS_SIZE</a>];</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> </div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="../../de/dfc/structpal__time_val.html"> 80</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../de/dfc/structpal__time_val.html">pal_timeVal</a>{</div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="../../de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf"> 81</a></span>  int32_t <a class="code" href="../../de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf">pal_tv_sec</a>; </div><div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="../../de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c"> 82</a></span>  int32_t <a class="code" href="../../de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c">pal_tv_usec</a>; </div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> } <a class="code" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a>;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span> </div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8">pal_registerNetworkInterface</a>(<span class="keywordtype">void</span>* networkInterfaceContext, uint32_t* interfaceIndex);</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628">pal_setSockAddrPort</a>(<a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, uint16_t port);</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_setSockAddrIPV4Addr</a>(<a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, palIpV4Addr_t ipV4Addr);</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_setSockAddrIPV6Addr</a>(<a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, palIpV6Addr_t ipV6Addr);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> </div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724">pal_getSockAddrIPV4Addr</a>(<span class="keyword">const</span> <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, palIpV4Addr_t ipV4Addr);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_getSockAddrIPV6Addr</a>(<span class="keyword">const</span> <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, palIpV6Addr_t ipV6Addr);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e">pal_getSockAddrPort</a>(<span class="keyword">const</span> <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, uint16_t* port);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="code" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, <span class="keywordtype">bool</span> nonBlockingSocket, uint32_t interfaceNum, palSocket_t* socket);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1">pal_getSocketOptions</a>(palSocket_t socket, <a class="code" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> optionName, <span class="keywordtype">void</span>* optionValue, palSocketLength_t* optionLength);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_setSocketOptions</a>(palSocket_t socket, <span class="keywordtype">int</span> optionName, <span class="keyword">const</span> <span class="keywordtype">void</span>* optionValue, palSocketLength_t optionLength);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_bind</a>(palSocket_t socket, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* myAddress, palSocketLength_t addressLength);</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> </div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_receiveFrom</a>(palSocket_t socket, <span class="keywordtype">void</span>* buffer, <span class="keywordtype">size_t</span> length, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* from, palSocketLength_t* fromLength, <span class="keywordtype">size_t</span>* bytesReceived);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> </div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23">pal_sendTo</a>(palSocket_t socket, <span class="keyword">const</span> <span class="keywordtype">void</span>* buffer, <span class="keywordtype">size_t</span> length, <span class="keyword">const</span> <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* to, palSocketLength_t toLength, <span class="keywordtype">size_t</span>* bytesSent);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644">pal_close</a>(palSocket_t* socket);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_getNumberOfNetInterfaces</a>(uint32_t* numInterfaces);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> </div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8">pal_getNetInterfaceInfo</a>(uint32_t interfaceNum, <a class="code" href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo_t</a>* interfaceInfo);</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> </div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> </div><div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31"> 216</a></span> <span class="preprocessor">#define PAL_NET_SOCKET_SELECT_MAX_SOCKETS 8</span></div><div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2"> 217</a></span> <span class="preprocessor">#define PAL_NET_SOCKET_SELECT_RX_BIT (1)</span></div><div class="line"><a name="l00218"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d"> 218</a></span> <span class="preprocessor">#define PAL_NET_SOCKET_SELECT_TX_BIT (2)</span></div><div class="line"><a name="l00219"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a"> 219</a></span> <span class="preprocessor">#define PAL_NET_SOCKET_SELECT_ERR_BIT (4)</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div><div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a8894a96773018ba6058811087b4b2ac8"> 221</a></span> <span class="preprocessor">#define PAL_NET_SELECT_IS_RX(socketStatus, index) ((socketStatus[index] | PAL_NET_SOCKET_SELECT_RX_BIT) != 0) </span></div><div class="line"><a name="l00222"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#a31ca79ac9ae5c2ddd890263a989fc4d8"> 222</a></span> <span class="preprocessor">#define PAL_NET_SELECT_IS_TX(socketStatus, index) ((socketStatus[index] | PAL_NET_SOCKET_SELECT_TX_BIT) != 0) </span></div><div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="../../d9/d17/pal__network_8h.html#ac2b7451d38e150079fbef20b57ee3fe9"> 223</a></span> <span class="preprocessor">#define PAL_NET_SELECT_IS_ERR(socketStatus, index) ((socketStatus[index] | PAL_NET_SOCKET_SELECT_ERR_BIT) != 0) </span></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> <span class="preprocessor">palStatus_t pal_socketMiniSelect(const palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t numberOfSockets, pal_timeVal_t* timeout,</span></div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  uint8_t palSocketStatus[<a class="code" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t* numberOfSocketsSet);</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span> </div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> </div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <span class="preprocessor">#if PAL_NET_TCP_AND_TLS_SUPPORT // functionality below supported only in case TCP is supported.</span></div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> </div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_listen(palSocket_t socket, <span class="keywordtype">int</span> backlog);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> </div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_accept(palSocket_t socket, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, palSocketLength_t* addressLen, palSocket_t* acceptedSocket);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> </div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_connect(palSocket_t socket, <span class="keyword">const</span> <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, palSocketLength_t addressLen);</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> </div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_recv(palSocket_t socket, <span class="keywordtype">void</span>* buf, <span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span>* recievedDataSize);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span> </div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_send(palSocket_t socket, <span class="keyword">const</span> <span class="keywordtype">void</span>* buf, <span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span>* sentDataSize);</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> </div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> </div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> <span class="preprocessor">#endif //PAL_NET_TCP_AND_TLS_SUPPORT</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> </div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> <span class="preprocessor">#if PAL_NET_ASYNCHRONOUS_SOCKET_API</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> </div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> <span class="keyword">typedef</span> void(*palAsyncSocketCallback_t)();</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_asynchronousSocket(<a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="code" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, <span class="keywordtype">bool</span> nonBlockingSocket, uint32_t interfaceNum, palAsyncSocketCallback_t callback, palSocket_t* socket);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> </div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span> <span class="preprocessor">#if PAL_NET_DNS_SUPPORT</span></div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> </div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_getAddressInfo(<span class="keyword">const</span> <span class="keywordtype">char</span>* url, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, palSocketLength_t* addressLength);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> </div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> </div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> }</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> <span class="preprocessor">#endif //_PAL_SOCKET_H</span></div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> </div><div class="ttc" id="pal__network_8h_html_a4658c7e8224b536d4fd71fed2602b12e"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e">pal_getSockAddrPort</a></div><div class="ttdeci">palStatus_t pal_getSockAddrPort(const palSocketAddress_t *address, uint16_t *port)</div><div class="ttdef"><b>Definition:</b> pal_network.c:153</div></div> +<div class="ttc" id="pal_8h_html"><div class="ttname"><a href="../../d9/d16/pal_8h.html">pal.h</a></div></div> +<div class="ttc" id="pal__network_8h_html_acce808f708e653b6bed317072888ca23"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23">pal_sendTo</a></div><div class="ttdeci">palStatus_t pal_sendTo(palSocket_t socket, const void *buffer, size_t length, const palSocketAddress_t *to, palSocketLength_t toLength, size_t *bytesSent)</div><div class="ttdef"><b>Definition:</b> pal_network.c:240</div></div> +<div class="ttc" id="structpal__time_val_html_acf8b8c0480064a16325f94f155db4e1c"><div class="ttname"><a href="../../de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c">pal_timeVal::pal_tv_usec</a></div><div class="ttdeci">int32_t pal_tv_usec</div><div class="ttdef"><b>Definition:</b> pal_network.h:82</div></div> +<div class="ttc" id="pal__network_8h_html_a18197e0f047f17d2617461594f5ed644"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644">pal_close</a></div><div class="ttdeci">palStatus_t pal_close(palSocket_t *socket)</div><div class="ttdef"><b>Definition:</b> pal_network.c:252</div></div> +<div class="ttc" id="pal__network_8h_html_a153bc6165f64bbf3e6bcc79b0d39138f"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_getSockAddrIPV6Addr</a></div><div class="ttdeci">palStatus_t pal_getSockAddrIPV6Addr(const palSocketAddress_t *address, palIpV6Addr_t ipV6Addr)</div><div class="ttdef"><b>Definition:</b> pal_network.c:133</div></div> +<div class="ttc" id="pal__network_8h_html_a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3">PAL_AF_UNSPEC</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:49</div></div> +<div class="ttc" id="pal__network_8h_html_a081cc2fd09644c41068673487b39f6b8"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8">pal_registerNetworkInterface</a></div><div class="ttdeci">palStatus_t pal_registerNetworkInterface(void *networkInterfaceContext, uint32_t *interfaceIndex)</div><div class="ttdef"><b>Definition:</b> pal_network.c:43</div></div> +<div class="ttc" id="pal__network_8h_html_ab74987f80f6b9b025ed9f067a2c654da"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a></div><div class="ttdeci">struct palNetInterfaceInfo palNetInterfaceInfo_t</div></div> +<div class="ttc" id="pal__network_8h_html_ac844634680241bad287771f1ab8b0901"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a></div><div class="ttdeci">uint32_t palSocketLength_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:32</div></div> +<div class="ttc" id="pal__network_8h_html_a5258efd8b21d9c881df29b29686674d8"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8">pal_getNetInterfaceInfo</a></div><div class="ttdeci">palStatus_t pal_getNetInterfaceInfo(uint32_t interfaceNum, palNetInterfaceInfo_t *interfaceInfo)</div><div class="ttdef"><b>Definition:</b> pal_network.c:276</div></div> +<div class="ttc" id="pal__network_8h_html_a03e2ae5a01f21cf32933bf4bdca5e5b1"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">palIpV4Addr_t</a></div><div class="ttdeci">uint8_t palIpV4Addr_t[PAL_IPV4_ADDRESS_SIZE]</div><div class="ttdef"><b>Definition:</b> pal_network.h:77</div></div> +<div class="ttc" id="pal__network_8h_html_ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941">PAL_SOCK_DGRAM</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:59</div></div> +<div class="ttc" id="structpal_net_interface_info_html_affc930af87e8696f63b30b911cf8b03d"><div class="ttname"><a href="../../d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d">palNetInterfaceInfo::address</a></div><div class="ttdeci">palSocketAddress_t address</div><div class="ttdef"><b>Definition:</b> pal_network.h:44</div></div> +<div class="ttc" id="pal__network_8h_html_ac0bd9e160ca4973db4d846a4369ea996"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a></div><div class="ttdeci">void * palSocket_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:33</div></div> +<div class="ttc" id="pal__network_8h_html_a2e1bbe81a35a1cb54c351912bb97736f"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_setSocketOptions</a></div><div class="ttdeci">palStatus_t pal_setSocketOptions(palSocket_t socket, int optionName, const void *optionValue, palSocketLength_t optionLength)</div><div class="ttdef"><b>Definition:</b> pal_network.c:204</div></div> +<div class="ttc" id="pal__network_8h_html_a2d9d4e04e43995123efe134c767cd6e1"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1">pal_getSocketOptions</a></div><div class="ttdeci">palStatus_t pal_getSocketOptions(palSocket_t socket, palSocketOptionName_t optionName, void *optionValue, palSocketLength_t *optionLength)</div><div class="ttdef"><b>Definition:</b> pal_network.c:192</div></div> +<div class="ttc" id="pal__network_8h_html_a0cc13f7ef9ceb4a75884a8bebf0d831c"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_setSockAddrIPV6Addr</a></div><div class="ttdeci">palStatus_t pal_setSockAddrIPV6Addr(palSocketAddress_t *address, palIpV6Addr_t ipV6Addr)</div><div class="ttdef"><b>Definition:</b> pal_network.c:91</div></div> +<div class="ttc" id="pal__network_8h_html_a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7">PAL_AF_INET6</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:51</div></div> +<div class="ttc" id="structpal_socket_address_html_a8bdecffc9afacbdf84fc78d26090c221"><div class="ttname"><a href="../../db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221">palSocketAddress::addressType</a></div><div class="ttdeci">unsigned short addressType</div><div class="ttdef"><b>Definition:</b> pal_network.h:38</div></div> +<div class="ttc" id="structpal__time_val_html_a8c0bfa9026d4b23b598f0652aa975fcf"><div class="ttname"><a href="../../de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf">pal_timeVal::pal_tv_sec</a></div><div class="ttdeci">int32_t pal_tv_sec</div><div class="ttdef"><b>Definition:</b> pal_network.h:81</div></div> +<div class="ttc" id="pal__network_8h_html_ab5d2c3c0d3b2f0e08afcd0d53ff4c418"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a></div><div class="ttdeci">palSocketType_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:54</div></div> +<div class="ttc" id="structpal_net_interface_info_html"><div class="ttname"><a href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:42</div></div> +<div class="ttc" id="pal__network_8h_html_abbeb1395896eb79ab564568b9ab8a628"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628">pal_setSockAddrPort</a></div><div class="ttdeci">palStatus_t pal_setSockAddrPort(palSocketAddress_t *address, uint16_t port)</div><div class="ttdef"><b>Definition:</b> pal_network.c:51</div></div> +<div class="ttc" id="pal__network_8h_html_a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca">PAL_SO_RCVTIMEO</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:69</div></div> +<div class="ttc" id="pal__network_8h_html_a2694f5de0fb810ddd7ff249ea1478f51"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a></div><div class="ttdeci">palSocketOptionName_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:63</div></div> +<div class="ttc" id="pal__network_8h_html_a9e444742ff895f63c34f727b4fcfba10"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a></div><div class="ttdeci">struct palSocketAddress palSocketAddress_t</div></div> +<div class="ttc" id="pal__network_8h_html_a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001">PAL_SO_REUSEADDR</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:64</div></div> +<div class="ttc" id="structpal_net_interface_info_html_a9b816dd947f25d303e32fca36d04080e"><div class="ttname"><a href="../../d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e">palNetInterfaceInfo::addressSize</a></div><div class="ttdeci">uint32_t addressSize</div><div class="ttdef"><b>Definition:</b> pal_network.h:45</div></div> +<div class="ttc" id="pal__network_8h_html_ac1ff0fb22cbd84e6c7920c095ddbde63"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_bind</a></div><div class="ttdeci">palStatus_t pal_bind(palSocket_t socket, palSocketAddress_t *myAddress, palSocketLength_t addressLength)</div><div class="ttdef"><b>Definition:</b> pal_network.c:216</div></div> +<div class="ttc" id="pal__network_8h_html_ad47edc267b97d7b32e30b45ad4674192"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">palIpV6Addr_t</a></div><div class="ttdeci">uint8_t palIpV6Addr_t[PAL_IPV6_ADDRESS_SIZE]</div><div class="ttdef"><b>Definition:</b> pal_network.h:78</div></div> +<div class="ttc" id="pal__network_8h_html_ade5cf610808db5462666465b648e7724"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724">pal_getSockAddrIPV4Addr</a></div><div class="ttdeci">palStatus_t pal_getSockAddrIPV4Addr(const palSocketAddress_t *address, palIpV4Addr_t ipV4Addr)</div><div class="ttdef"><b>Definition:</b> pal_network.c:109</div></div> +<div class="ttc" id="pal__network_8h_html_ad7a3e182cb430da7c139858b0bfbb27f"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f">PAL_IPV4_ADDRESS_SIZE</a></div><div class="ttdeci">#define PAL_IPV4_ADDRESS_SIZE</div><div class="ttdef"><b>Definition:</b> pal_network.h:74</div></div> +<div class="ttc" id="pal__network_8h_html_a9903ebae215b70520c8dcc9f0aa03e24"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24">PAL_IPV6_ADDRESS_SIZE</a></div><div class="ttdeci">#define PAL_IPV6_ADDRESS_SIZE</div><div class="ttdef"><b>Definition:</b> pal_network.h:75</div></div> +<div class="ttc" id="pal__network_8h_html_aed02a6f53b88e1d5e81607b1221a3efa"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_setSockAddrIPV4Addr</a></div><div class="ttdeci">palStatus_t pal_setSockAddrIPV4Addr(palSocketAddress_t *address, palIpV4Addr_t ipV4Addr)</div><div class="ttdef"><b>Definition:</b> pal_network.c:78</div></div> +<div class="ttc" id="pal__network_8h_html_a5607f2af4b642ef0548bd47c891c6d31"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a></div><div class="ttdeci">#define PAL_NET_SOCKET_SELECT_MAX_SOCKETS</div><div class="ttdef"><b>Definition:</b> pal_network.h:216</div></div> +<div class="ttc" id="pal__network_8h_html_a65df7c68bcf7a21db5d1a7a3830fd19c"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_getNumberOfNetInterfaces</a></div><div class="ttdeci">palStatus_t pal_getNumberOfNetInterfaces(uint32_t *numInterfaces)</div><div class="ttdef"><b>Definition:</b> pal_network.c:264</div></div> +<div class="ttc" id="pal__network_8h_html_ac831e2e5064065e10c741da1003ff039"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039">PAL_NET_MAX_ADDR_SIZE</a></div><div class="ttdeci">#define PAL_NET_MAX_ADDR_SIZE</div><div class="ttdef"><b>Definition:</b> pal_network.h:35</div></div> +<div class="ttc" id="pal__network_8h_html_a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de">PAL_SO_SNDTIMEO</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:68</div></div> +<div class="ttc" id="structpal_socket_address_html_a0a5471b518ef60cfa0f28c47a323ec4c"><div class="ttname"><a href="../../db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c">palSocketAddress::addressData</a></div><div class="ttdeci">char addressData[PAL_NET_MAX_ADDR_SIZE]</div><div class="ttdef"><b>Definition:</b> pal_network.h:39</div></div> +<div class="ttc" id="pal__network_8h_html_ab8ff1c2207a2f7c219088008fbc99ff4"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a></div><div class="ttdeci">struct pal_timeVal pal_timeVal_t</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +<div class="ttc" id="structpal__time_val_html"><div class="ttname"><a href="../../de/dfc/structpal__time_val.html">pal_timeVal</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:80</div></div> +<div class="ttc" id="pal__network_8h_html_aa852fb6e271fb91efd65e2a1ead93b9a"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a></div><div class="ttdeci">palStatus_t pal_socket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palSocket_t *socket)</div><div class="ttdef"><b>Definition:</b> pal_network.c:180</div></div> +<div class="ttc" id="pal__network_8h_html_a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f">PAL_AF_INET</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:50</div></div> +<div class="ttc" id="pal__network_8h_html_a6b5e705be1e7c3c16080f2b05b87ff7d"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_receiveFrom</a></div><div class="ttdeci">palStatus_t pal_receiveFrom(palSocket_t socket, void *buffer, size_t length, palSocketAddress_t *from, palSocketLength_t *fromLength, size_t *bytesReceived)</div><div class="ttdef"><b>Definition:</b> pal_network.c:228</div></div> +<div class="ttc" id="pal__network_8h_html_a01b7e0ab9c2845885f6a7e012002dba7"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a></div><div class="ttdeci">palSocketDomain_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:48</div></div> +<div class="ttc" id="structpal_socket_address_html"><div class="ttname"><a href="../../db/d42/structpal_socket_address.html">palSocketAddress</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:37</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d28/pal__rtos__test__utils_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,494 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_rtos_test_utils.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#nested-classes">Data Structures</a> | +<a href="#define-members">Macros</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos_test_utils.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d0/d51/pal__test__utils_8h_source.html">pal_test_utils.h</a>"</code><br /> +</div> +<p><a href="../../d9/d28/pal__rtos__test__utils_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> +Data Structures</h2></td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d3/d30/structthreads_argument.html">threadsArgument</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d2c/structtimer_argument.html">timerArgument</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a90b7a8cb7bc3fdbd98014a3e15ee6e9a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a90b7a8cb7bc3fdbd98014a3e15ee6e9a">THREAD_STACK_SIZE</a>   1024*sizeof(uint32_t)</td></tr> +<tr class="separator:a90b7a8cb7bc3fdbd98014a3e15ee6e9a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae3c2c737bcf6b45c3bf394dfe8349c4d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#ae3c2c737bcf6b45c3bf394dfe8349c4d">MEMORY_POOL1_BLOCK_SIZE</a>   32</td></tr> +<tr class="separator:ae3c2c737bcf6b45c3bf394dfe8349c4d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3c0ce22bdba74fe398c6adefbc7fbbdf"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a3c0ce22bdba74fe398c6adefbc7fbbdf">MEMORY_POOL1_BLOCK_COUNT</a>   5</td></tr> +<tr class="separator:a3c0ce22bdba74fe398c6adefbc7fbbdf"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3c85d7e7f47d26444477603d8e2fd5d5"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a3c85d7e7f47d26444477603d8e2fd5d5">MEMORY_POOL2_BLOCK_SIZE</a>   12</td></tr> +<tr class="separator:a3c85d7e7f47d26444477603d8e2fd5d5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a593d40fc26d9d1664c57988a846a888e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a593d40fc26d9d1664c57988a846a888e">MEMORY_POOL2_BLOCK_COUNT</a>   4</td></tr> +<tr class="separator:a593d40fc26d9d1664c57988a846a888e"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:a33d89580fea8198de226a62220e20bd0"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../d3/d30/structthreads_argument.html">threadsArgument</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a></td></tr> +<tr class="separator:a33d89580fea8198de226a62220e20bd0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8c22b8a190b07232b36b748fbf706e76"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../dc/d2c/structtimer_argument.html">timerArgument</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a></td></tr> +<tr class="separator:a8c22b8a190b07232b36b748fbf706e76"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a0a153da028aee8f220377b516ff065c8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8">palThreadFunc1</a> (void const *argument)</td></tr> +<tr class="separator:a0a153da028aee8f220377b516ff065c8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a29dc69cbcc48b55d48a5fd668da7fe15"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15">palThreadFunc2</a> (void const *argument)</td></tr> +<tr class="separator:a29dc69cbcc48b55d48a5fd668da7fe15"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acf68b041960be3c58f516986504fcd0f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f">palThreadFunc3</a> (void const *argument)</td></tr> +<tr class="separator:acf68b041960be3c58f516986504fcd0f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a844c7469189866b502ef85df5063e79c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c">palThreadFunc4</a> (void const *argument)</td></tr> +<tr class="separator:a844c7469189866b502ef85df5063e79c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5be7a07498de9cc847215e6aa8f77914"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914">palThreadFunc5</a> (void const *argument)</td></tr> +<tr class="separator:a5be7a07498de9cc847215e6aa8f77914"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a52dc025f6020b0d456bbbcacc3aa4e3e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e">palThreadFunc6</a> (void const *argument)</td></tr> +<tr class="separator:a52dc025f6020b0d456bbbcacc3aa4e3e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abac822ed4b356b85117101aa0d8701d6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6">palTimerFunc1</a> (void const *argument)</td></tr> +<tr class="separator:abac822ed4b356b85117101aa0d8701d6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8581bcb8f9f435a87c3dd651d65e32c8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8">palTimerFunc2</a> (void const *argument)</td></tr> +<tr class="separator:a8581bcb8f9f435a87c3dd651d65e32c8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7c8c7a38fca8b62acc6094ba1f072ec7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7">palThreadFuncCustom1</a> (void const *argument)</td></tr> +<tr class="separator:a7c8c7a38fca8b62acc6094ba1f072ec7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a663a9130dc598399ec3bd9ab9e6680fa"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa">palThreadFuncCustom2</a> (void const *argument)</td></tr> +<tr class="separator:a663a9130dc598399ec3bd9ab9e6680fa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a300d95346a90a5f17aa6140647243b64"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64">palThreadFuncCustom3</a> (void const *argument)</td></tr> +<tr class="separator:a300d95346a90a5f17aa6140647243b64"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa5b1f9c927c18d821a46d99dfe533cb0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0">palThreadFuncCustom4</a> (void const *argument)</td></tr> +<tr class="separator:aa5b1f9c927c18d821a46d99dfe533cb0"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:a8f9b1f133f82ce955405d453f0c506d6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6">g_threadsArg</a></td></tr> +<tr class="separator:a8f9b1f133f82ce955405d453f0c506d6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9beaf51023e475986b8b182c80ccc023"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023">g_threadStorage</a> [20]</td></tr> +<tr class="separator:a9beaf51023e475986b8b182c80ccc023"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1a09db2f0cd5dd2d0929b34afad51ba1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1">g_timerArgs</a></td></tr> +<tr class="separator:a1a09db2f0cd5dd2d0929b34afad51ba1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:adb164ebbfd2189f434f5e550e2d93bb4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4">mutex1</a></td></tr> +<tr class="separator:adb164ebbfd2189f434f5e550e2d93bb4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8706c6b975e957968f23af2812bbc0cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb">mutex2</a></td></tr> +<tr class="separator:a8706c6b975e957968f23af2812bbc0cb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2f8d675e43058c8f8b853b52366abf38"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38">semaphore1</a></td></tr> +<tr class="separator:a2f8d675e43058c8f8b853b52366abf38"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a3c0ce22bdba74fe398c6adefbc7fbbdf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define MEMORY_POOL1_BLOCK_COUNT   5</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ae3c2c737bcf6b45c3bf394dfe8349c4d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define MEMORY_POOL1_BLOCK_SIZE   32</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a593d40fc26d9d1664c57988a846a888e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define MEMORY_POOL2_BLOCK_COUNT   4</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a3c85d7e7f47d26444477603d8e2fd5d5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define MEMORY_POOL2_BLOCK_SIZE   12</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a90b7a8cb7bc3fdbd98014a3e15ee6e9a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define THREAD_STACK_SIZE   1024*sizeof(uint32_t)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="a33d89580fea8198de226a62220e20bd0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../d3/d30/structthreads_argument.html">threadsArgument</a> <a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8c22b8a190b07232b36b748fbf706e76"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../dc/d2c/structtimer_argument.html">timerArgument</a> <a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a0a153da028aee8f220377b516ff065c8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc1 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a29dc69cbcc48b55d48a5fd668da7fe15"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc2 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="acf68b041960be3c58f516986504fcd0f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc3 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a844c7469189866b502ef85df5063e79c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc4 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a5be7a07498de9cc847215e6aa8f77914"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc5 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a52dc025f6020b0d456bbbcacc3aa4e3e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFunc6 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7c8c7a38fca8b62acc6094ba1f072ec7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom1 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a663a9130dc598399ec3bd9ab9e6680fa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom2 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a300d95346a90a5f17aa6140647243b64"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom3 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa5b1f9c927c18d821a46d99dfe533cb0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palThreadFuncCustom4 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abac822ed4b356b85117101aa0d8701d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palTimerFunc1 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8581bcb8f9f435a87c3dd651d65e32c8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palTimerFunc2 </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="a8f9b1f133f82ce955405d453f0c506d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a> g_threadsArg</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9beaf51023e475986b8b182c80ccc023"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t g_threadStorage[20]</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a1a09db2f0cd5dd2d0929b34afad51ba1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a> g_timerArgs</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="adb164ebbfd2189f434f5e550e2d93bb4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutex1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8706c6b975e957968f23af2812bbc0cb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutex2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2f8d675e43058c8f8b853b52366abf38"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphore1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d28/pal__rtos__test__utils_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,98 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_rtos_test_utils.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_rtos_test_utils.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d9/d28/pal__rtos__test__utils_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#ifndef _PAL_RTOS_TEST_UTILS_H</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#define _PAL_RTOS_TEST_UTILS_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include "<a class="code" href="../../d6/dc2/pal__types_8h.html">pal_types.h</a>"</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "<a class="code" href="../../d4/d01/pal__rtos_8h.html">pal_rtos.h</a>"</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include "<a class="code" href="../../d0/d51/pal__test__utils_8h.html">pal_test_utils.h</a>"</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="../../d9/d28/pal__rtos__test__utils_8h.html#a90b7a8cb7bc3fdbd98014a3e15ee6e9a"> 24</a></span> <span class="preprocessor">#define THREAD_STACK_SIZE 1024*sizeof(uint32_t)</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html"> 26</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../d3/d30/structthreads_argument.html">threadsArgument</a>{</div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639"> 27</a></span>  uint32_t <a class="code" href="../../d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639">arg1</a>;</div><div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78"> 28</a></span>  uint32_t <a class="code" href="../../d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78">arg2</a>;</div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4"> 29</a></span>  uint32_t <a class="code" href="../../d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4">arg3</a>;</div><div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a"> 30</a></span>  uint32_t <a class="code" href="../../d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a">arg4</a>;</div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9"> 31</a></span>  uint32_t <a class="code" href="../../d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9">arg5</a>;</div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074"> 32</a></span>  uint32_t <a class="code" href="../../d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074">arg6</a>;</div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="../../d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74"> 33</a></span>  uint32_t <a class="code" href="../../d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74">arg7</a>;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> }<a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a>;</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> </div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">extern</span> <a class="code" href="../../d3/d30/structthreads_argument.html">threadsArgument_t</a> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6">g_threadsArg</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="keyword">extern</span> uint32_t <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023">g_threadStorage</a>[20];</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8">palThreadFunc1</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15">palThreadFunc2</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f">palThreadFunc3</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c">palThreadFunc4</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914">palThreadFunc5</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e">palThreadFunc6</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> </div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="../../dc/d2c/structtimer_argument.html"> 49</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../dc/d2c/structtimer_argument.html">timerArgument</a>{</div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="../../dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1"> 50</a></span>  uint32_t <a class="code" href="../../dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1">ticksBeforeTimer</a>;</div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="../../dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08"> 51</a></span>  uint32_t <a class="code" href="../../dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08">ticksInFunc1</a>;</div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="../../dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34"> 52</a></span>  uint32_t <a class="code" href="../../dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34">ticksInFunc2</a>;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> }<a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a>;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">extern</span> <a class="code" href="../../dc/d2c/structtimer_argument.html">timerArgument_t</a> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1">g_timerArgs</a>;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6">palTimerFunc1</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8">palTimerFunc2</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7">palThreadFuncCustom1</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa">palThreadFuncCustom2</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64">palThreadFuncCustom3</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="keywordtype">void</span> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0">palThreadFuncCustom4</a>(<span class="keywordtype">void</span> <span class="keyword">const</span> *argument);</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="../../d9/d28/pal__rtos__test__utils_8h.html#ae3c2c737bcf6b45c3bf394dfe8349c4d"> 67</a></span> <span class="preprocessor">#define MEMORY_POOL1_BLOCK_SIZE 32</span></div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="../../d9/d28/pal__rtos__test__utils_8h.html#a3c0ce22bdba74fe398c6adefbc7fbbdf"> 68</a></span> <span class="preprocessor">#define MEMORY_POOL1_BLOCK_COUNT 5</span></div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="../../d9/d28/pal__rtos__test__utils_8h.html#a3c85d7e7f47d26444477603d8e2fd5d5"> 69</a></span> <span class="preprocessor">#define MEMORY_POOL2_BLOCK_SIZE 12</span></div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="../../d9/d28/pal__rtos__test__utils_8h.html#a593d40fc26d9d1664c57988a846a888e"> 70</a></span> <span class="preprocessor">#define MEMORY_POOL2_BLOCK_COUNT 4</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="keyword">extern</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4">mutex1</a>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="keyword">extern</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb">mutex2</a>;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> </div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="keyword">extern</span> <a class="code" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> <a class="code" href="../../d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38">semaphore1</a>;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="preprocessor">#endif //_PAL_RTOS_TEST_UTILS_H</span></div><div class="ttc" id="structthreads_argument_html_a9532cb931dee4c326444e7c366019639"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639">threadsArgument::arg1</a></div><div class="ttdeci">uint32_t arg1</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:27</div></div> +<div class="ttc" id="pal__rtos_8h_html_a0a8206fc36c3dca549aed450f7777481"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a></div><div class="ttdeci">uintptr_t palSemaphoreID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:37</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a8581bcb8f9f435a87c3dd651d65e32c8"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8">palTimerFunc2</a></div><div class="ttdeci">void palTimerFunc2(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:207</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a8c22b8a190b07232b36b748fbf706e76"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a></div><div class="ttdeci">struct timerArgument timerArgument_t</div></div> +<div class="ttc" id="structthreads_argument_html_a2720a7d49d96277778f83a2488859fe9"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9">threadsArgument::arg5</a></div><div class="ttdeci">uint32_t arg5</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:31</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a33d89580fea8198de226a62220e20bd0"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a></div><div class="ttdeci">struct threadsArgument threadsArgument_t</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_adb164ebbfd2189f434f5e550e2d93bb4"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4">mutex1</a></div><div class="ttdeci">palMutexID_t mutex1</div><div class="ttdef"><b>Definition:</b> pal_rtos_test.c:33</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a300d95346a90a5f17aa6140647243b64"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64">palThreadFuncCustom3</a></div><div class="ttdeci">void palThreadFuncCustom3(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:224</div></div> +<div class="ttc" id="structthreads_argument_html_abcba9882b15e3845a7794220a5c9e4f4"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4">threadsArgument::arg3</a></div><div class="ttdeci">uint32_t arg3</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:29</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a663a9130dc598399ec3bd9ab9e6680fa"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa">palThreadFuncCustom2</a></div><div class="ttdeci">void palThreadFuncCustom2(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:219</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a8f9b1f133f82ce955405d453f0c506d6"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6">g_threadsArg</a></div><div class="ttdeci">threadsArgument_t g_threadsArg</div><div class="ttdef"><b>Definition:</b> pal_rtos_test.c:31</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a9beaf51023e475986b8b182c80ccc023"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023">g_threadStorage</a></div><div class="ttdeci">uint32_t g_threadStorage[20]</div><div class="ttdef"><b>Definition:</b> pal_rtos_test.c:30</div></div> +<div class="ttc" id="pal__test__utils_8h_html"><div class="ttname"><a href="../../d0/d51/pal__test__utils_8h.html">pal_test_utils.h</a></div></div> +<div class="ttc" id="structthreads_argument_html"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html">threadsArgument</a></div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:26</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a8706c6b975e957968f23af2812bbc0cb"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb">mutex2</a></div><div class="ttdeci">palMutexID_t mutex2</div><div class="ttdef"><b>Definition:</b> pal_rtos_test.c:34</div></div> +<div class="ttc" id="pal__rtos_8h_html"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html">pal_rtos.h</a></div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a7c8c7a38fca8b62acc6094ba1f072ec7"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7">palThreadFuncCustom1</a></div><div class="ttdeci">void palThreadFuncCustom1(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:214</div></div> +<div class="ttc" id="structthreads_argument_html_acecc240150225e2786524a2e4b3adf78"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78">threadsArgument::arg2</a></div><div class="ttdeci">uint32_t arg2</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:28</div></div> +<div class="ttc" id="pal__rtos_8h_html_ac6b402eec0e5f2ab64c43abffd4d9901"><div class="ttname"><a href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a></div><div class="ttdeci">uintptr_t palMutexID_t</div><div class="ttdef"><b>Definition:</b> pal_rtos.h:36</div></div> +<div class="ttc" id="structtimer_argument_html_af9f23b828a589dfac13cad4cb6e7da34"><div class="ttname"><a href="../../dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34">timerArgument::ticksInFunc2</a></div><div class="ttdeci">uint32_t ticksInFunc2</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:52</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a29dc69cbcc48b55d48a5fd668da7fe15"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15">palThreadFunc2</a></div><div class="ttdeci">void palThreadFunc2(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:60</div></div> +<div class="ttc" id="structtimer_argument_html"><div class="ttname"><a href="../../dc/d2c/structtimer_argument.html">timerArgument</a></div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:49</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a844c7469189866b502ef85df5063e79c"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c">palThreadFunc4</a></div><div class="ttdeci">void palThreadFunc4(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:123</div></div> +<div class="ttc" id="structtimer_argument_html_afe9607363a4b6ae7b835ef129743ec08"><div class="ttname"><a href="../../dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08">timerArgument::ticksInFunc1</a></div><div class="ttdeci">uint32_t ticksInFunc1</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:51</div></div> +<div class="ttc" id="pal__types_8h_html"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html">pal_types.h</a></div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a1a09db2f0cd5dd2d0929b34afad51ba1"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1">g_timerArgs</a></div><div class="ttdeci">timerArgument_t g_timerArgs</div><div class="ttdef"><b>Definition:</b> pal_rtos_test.c:32</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a2f8d675e43058c8f8b853b52366abf38"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38">semaphore1</a></div><div class="ttdeci">palSemaphoreID_t semaphore1</div><div class="ttdef"><b>Definition:</b> pal_rtos_test.c:35</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a5be7a07498de9cc847215e6aa8f77914"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914">palThreadFunc5</a></div><div class="ttdeci">void palThreadFunc5(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:152</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_aa5b1f9c927c18d821a46d99dfe533cb0"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0">palThreadFuncCustom4</a></div><div class="ttdeci">void palThreadFuncCustom4(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:229</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a0a153da028aee8f220377b516ff065c8"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8">palThreadFunc1</a></div><div class="ttdeci">void palThreadFunc1(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:26</div></div> +<div class="ttc" id="structtimer_argument_html_a18bf51a6db87346257b34c24fefbd1b1"><div class="ttname"><a href="../../dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1">timerArgument::ticksBeforeTimer</a></div><div class="ttdeci">uint32_t ticksBeforeTimer</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:50</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_a52dc025f6020b0d456bbbcacc3aa4e3e"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e">palThreadFunc6</a></div><div class="ttdeci">void palThreadFunc6(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:175</div></div> +<div class="ttc" id="structthreads_argument_html_a200c590896768ffb09f8d90c774f6b74"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74">threadsArgument::arg7</a></div><div class="ttdeci">uint32_t arg7</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:33</div></div> +<div class="ttc" id="structthreads_argument_html_a460c4a55dba6130f386f648138184074"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074">threadsArgument::arg6</a></div><div class="ttdeci">uint32_t arg6</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:32</div></div> +<div class="ttc" id="structthreads_argument_html_a6fad7cea38d81eb88f9ff01d4baec32a"><div class="ttname"><a href="../../d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a">threadsArgument::arg4</a></div><div class="ttdeci">uint32_t arg4</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.h:30</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_acf68b041960be3c58f516986504fcd0f"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f">palThreadFunc3</a></div><div class="ttdeci">void palThreadFunc3(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:85</div></div> +<div class="ttc" id="pal__rtos__test__utils_8h_html_abac822ed4b356b85117101aa0d8701d6"><div class="ttname"><a href="../../d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6">palTimerFunc1</a></div><div class="ttdeci">void palTimerFunc1(void const *argument)</div><div class="ttdef"><b>Definition:</b> pal_rtos_test_utils.c:200</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d2c/pal__plat__network_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,630 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Platform-API/pal_plat_network.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_plat_network.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a>"</code><br /> +</div> +<p><a href="../../d9/d2c/pal__plat__network_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ab92cca0e4facf3d62e03c0d0ca0523da"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_socketsInit</a> (void *context)</td></tr> +<tr class="separator:ab92cca0e4facf3d62e03c0d0ca0523da"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9f6e13112366978741749649356a886c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c">pal_plat_RegisterNetworkInterface</a> (void *networkInterfaceContext, uint32_t *interfaceIndex)</td></tr> +<tr class="separator:a9f6e13112366978741749649356a886c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6a2b36db2bb5d71ade0fe8cb00d3cecd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_socketsTerminate</a> (void *context)</td></tr> +<tr class="separator:a6a2b36db2bb5d71ade0fe8cb00d3cecd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a58a25ae30bb6225cc8b5344053fd705c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_socket</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, bool nonBlockingSocket, uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a58a25ae30bb6225cc8b5344053fd705c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a76c4e2adf95702c4db8f3792ae373bf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_getSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> optionName, void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *optionLength)</td></tr> +<tr class="separator:a76c4e2adf95702c4db8f3792ae373bf9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a08ea05dacec7f7d9dc892dab0318542d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_setSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, int optionName, const void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> optionLength)</td></tr> +<tr class="separator:a08ea05dacec7f7d9dc892dab0318542d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a53a267fd8ed0b7a5cf988224e95bd47c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_bind</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *myAddress, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> addressLength)</td></tr> +<tr class="separator:a53a267fd8ed0b7a5cf988224e95bd47c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa869b5eddbf4eb6aebbbb587ece84aac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_receiveFrom</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, void *buffer, size_t length, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *from, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *fromLength, size_t *bytesReceived)</td></tr> +<tr class="separator:aa869b5eddbf4eb6aebbbb587ece84aac"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a17365747ed8d29df153a336da3942187"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187">pal_plat_sendTo</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, const void *buffer, size_t length, const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *to, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> toLength, size_t *bytesSent)</td></tr> +<tr class="separator:a17365747ed8d29df153a336da3942187"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a071355a0ca4d4eece45f0ed85a9ab1da"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_close</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a071355a0ca4d4eece45f0ed85a9ab1da"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af36bf075867e5ed0be7479312469361f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f">pal_plat_getNumberOfNetInterfaces</a> (uint32_t *numInterfaces)</td></tr> +<tr class="separator:af36bf075867e5ed0be7479312469361f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6dc3b4c06e96b29068995809b98a935e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_getNetInterfaceInfo</a> (uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> *interfaceInfo)</td></tr> +<tr class="separator:a6dc3b4c06e96b29068995809b98a935e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa0c26dfeee80444e58eacab238206d09"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_socketMiniSelect</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socketsToCheck[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t numberOfSockets, <a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> *timeout, uint8_t palSocketStatus[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t *numberOfSocketsSet)</td></tr> +<tr class="separator:aa0c26dfeee80444e58eacab238206d09"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a53a267fd8ed0b7a5cf988224e95bd47c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_bind </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>myAddress</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>addressLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Bind a given socket to a local address. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to bind. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">myAddress</td><td>The address to bind to. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">addressLength</td><td>The length of the address passed in myAddress. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a071355a0ca4d4eece45f0ed85a9ab1da"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_close </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Close a network socket. NOTE: recieves palSocket_t* and not palSocket_t so that it can zero the socket to avoid re-use. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">socket</td><td>Release and zero socket pointed to by given pointer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a6dc3b4c06e96b29068995809b98a935e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getNetInterfaceInfo </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> * </td> + <td class="paramname"><em>interfaceInfo</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get information regarding the socket at the index/interface number given (this number is returned when registering the socket). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>The number of the interface to get information for. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">interfaceInfo</td><td>The information for the given interface number. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="af36bf075867e5ed0be7479312469361f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getNumberOfNetInterfaces </td> + <td>(</td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numInterfaces</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the number of current network interfaces (interfaces that have been registered through). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">numInterfaces</td><td>The number of interfaces after a successful call. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status as in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a76c4e2adf95702c4db8f3792ae373bf9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket for which to get options. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">optionValue</td><td>The buffer holding the option value returned by the function. </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">optionLength</td><td>The size of the buffer provided for optionValue when calling the function. After the call, it contains the length of data actually written to the optionValue buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa869b5eddbf4eb6aebbbb587ece84aac"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_receiveFrom </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>from</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>fromLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesReceived</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Receive a payload from the given socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to receive from [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the buffer for the payload data. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">from</td><td>The address that sent the payload [optional - if not required pass NULL]. </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">fromLength</td><td>The length of the 'from' address. When completed, this contains the amount of data actually written to the from address [optional - if not required pass NULL]. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesReceived</td><td>The actual amount of payload data received to the buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a9f6e13112366978741749649356a886c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_RegisterNetworkInterface </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>networkInterfaceContext</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>interfaceIndex</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Register a network interface for use with PAL sockets - must be called before other socket functions - most APIs will not work before a single interface is added. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">networkInterfaceContext</td><td>The context of the network interface to be added (OS specific. In mbed OS, this is the NetworkInterface object pointer for the network adapter [note: we assume connect has already been called on this]). - if not available use NULL (may not be required on some OSs). </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">interfaceIndex</td><td>Contains the index assigned to the interface in case it has been assigned successfully. This index can be used when creating a socket to bind the socket to the interface. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a17365747ed8d29df153a336da3942187"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_sendTo </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>to</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>toLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesSent</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Send a payload to the given address using the given socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to use for sending the payload [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">to</td><td>The address to which the payload should be sent. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">toLength</td><td>The length of the 'to' address. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesSent</td><td>The actual amount of payload data sent. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a08ea05dacec7f7d9dc892dab0318542d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_setSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket for which to get options. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionValue</td><td>The buffer holding the option value to set for the given option. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionLength</td><td>The size of the buffer provided for optionValue. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a58a25ae30bb6225cc8b5344053fd705c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socket </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> </td> + <td class="paramname"><em>domain</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> </td> + <td class="paramname"><em>type</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">bool </td> + <td class="paramname"><em>nonBlockingSocket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get a network socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">domain</td><td>The domain of the created socket (see palSocketDomain_t for supported types). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">type</td><td>The type of the created socket (see palSocketType_t for supported types). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">nonBlockingSocket</td><td>If true, the socket is non-blocking (with O_NONBLOCK set). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>The number of the network interface used for this socket (info in interfaces supported via pal_getNumberOfNetInterfaces and pal_getNetInterfaceInfo ), choose PAL_NET_DEFAULT_INTERFACE for default interface. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">socket</td><td>The socket is returned through this output parameter. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa0c26dfeee80444e58eacab238206d09"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socketMiniSelect </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socketsToCheck</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>numberOfSockets</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> * </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint8_t </td> + <td class="paramname"><em>palSocketStatus</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numberOfSocketsSet</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Check if one or more (up to PAL_NET_SOCKET_SELECT_MAX_SOCKETS) sockets has data available for reading/writing/error. The function blocks until data is available for one of the given sockets or the timeout expires. To use the function, set the sockets you want to check in the socketsToCheck array and set a timeout. When it returns the socketStatus output inidcates the status of each socket passed in. Note: The entry in index x in the socketStatus array corresponds to the socket at index x in the sockets to check array. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socketsToCheck</td><td>The array of up to 8 socket handles to check. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">numberOfSockets</td><td>The number of sockets set in the input socketsToCheck array. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>The time until timeout if no socket activity is detected. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">palSocketStatus</td><td>Information on each socket in the input array indicating which event was set (none, rx, tx, err). Check for a desired event using macros. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">numberOfSocketsSet</td><td>The total number of sockets set in all three data sets (tx, rx, err) after a completed function. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="ab92cca0e4facf3d62e03c0d0ca0523da"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socketsInit </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>context</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>PAL network socket API PAL network sockets configurations options: define PAL_NET_TCP_AND_TLS_SUPPORT if TCP is supported by the platform and is required. define PAL_NET_ASYNCHRONOUS_SOCKET_API if asynchronous socket API is supported by the platform. Currently MANDATORY. define PAL_NET_DNS_SUPPORT if DNS name resolution is supported. </p><pre class="fragment">Initialize sockets - must be called before other socket functions (is called from PAL init). +</pre> <dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">context</td><td>Optional context - if not available/applicable use NULL. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a6a2b36db2bb5d71ade0fe8cb00d3cecd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socketsTerminate </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>context</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initialize terminate - can be called when sockets are no longer needed to free socket resources allocated by init. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">context</td><td>Optional context - if not available use NULL. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/d2c/pal__plat__network_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,86 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Platform-API/pal_plat_network.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_plat_network.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../d9/d2c/pal__plat__network_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_PLAT_SOCKET_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_PLAT_SOCKET_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "<a class="code" href="../../d9/d16/pal_8h.html">pal.h</a>"</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include "<a class="code" href="../../d9/d17/pal__network_8h.html">pal_network.h</a>"</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_socketsInit</a>(<span class="keywordtype">void</span>* context);</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c">pal_plat_RegisterNetworkInterface</a>(<span class="keywordtype">void</span>* networkInterfaceContext, uint32_t* interfaceIndex);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_socketsTerminate</a>(<span class="keywordtype">void</span>* context);</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_socket</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="code" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, <span class="keywordtype">bool</span> nonBlockingSocket, uint32_t interfaceNum, <a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a>* socket);</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> </div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_getSocketOptions</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="code" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> optionName, <span class="keywordtype">void</span>* optionValue, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a>* optionLength);</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_setSocketOptions</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <span class="keywordtype">int</span> optionName, <span class="keyword">const</span> <span class="keywordtype">void</span>* optionValue, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> optionLength);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> </div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_bind</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* myAddress, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> addressLength);</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_receiveFrom</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <span class="keywordtype">void</span>* buffer, <span class="keywordtype">size_t</span> length, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* from, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a>* fromLength, <span class="keywordtype">size_t</span>* bytesReceived);</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> </div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187">pal_plat_sendTo</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <span class="keyword">const</span> <span class="keywordtype">void</span>* buffer, <span class="keywordtype">size_t</span> length, <span class="keyword">const</span> <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* to, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> toLength, <span class="keywordtype">size_t</span>* bytesSent);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_close</a>(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a>* socket);</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f">pal_plat_getNumberOfNetInterfaces</a>(uint32_t* numInterfaces);</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_getNetInterfaceInfo</a>(uint32_t interfaceNum, <a class="code" href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo_t</a>* interfaceInfo);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> </div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_socketMiniSelect</a>(<span class="keyword">const</span> <a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socketsToCheck[<a class="code" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], uint32_t numberOfSockets, <a class="code" href="../../de/dfc/structpal__time_val.html">pal_timeVal_t</a>* timeout,</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t * numberOfSocketsSet);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="preprocessor">#if PAL_NET_TCP_AND_TLS_SUPPORT // functionality below supported only in case TCP is supported.</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> </div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_listen(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <span class="keywordtype">int</span> backlog);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_accept(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a>* addressLen, <a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a>* acceptedSocket);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_connect(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <span class="keyword">const</span> <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> addressLen);</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> </div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_recv(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <span class="keywordtype">void</span>* buf, <span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span>* recievedDataSize);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> </div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_send(<a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <span class="keyword">const</span> <span class="keywordtype">void</span>* buf, <span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span>* sentDataSize);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> </div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="preprocessor">#endif //PAL_NET_TCP_AND_TLS_SUPPORT</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> </div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="preprocessor">#if PAL_NET_ASYNCHRONOUS_SOCKET_API</span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> </div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_asynchronousSocket(<a class="code" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="code" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, <span class="keywordtype">bool</span> nonBlockingSocket, uint32_t interfaceNum, palAsyncSocketCallback_t callback, <a class="code" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a>* socket);</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> </div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> <span class="preprocessor">#if PAL_NET_DNS_SUPPORT</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getAddressInfo(<span class="keyword">const</span> <span class="keywordtype">char</span>* url, <a class="code" href="../../db/d42/structpal_socket_address.html">palSocketAddress_t</a>* address, <a class="code" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a>* addressLength);</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> </div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> </div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> </div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> }</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> <span class="preprocessor">#endif //_PAL_PLAT_SOCKET_H</span></div><div class="ttc" id="pal_8h_html"><div class="ttname"><a href="../../d9/d16/pal_8h.html">pal.h</a></div></div> +<div class="ttc" id="pal__network_8h_html"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html">pal_network.h</a></div></div> +<div class="ttc" id="pal__plat__network_8h_html_af36bf075867e5ed0be7479312469361f"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f">pal_plat_getNumberOfNetInterfaces</a></div><div class="ttdeci">palStatus_t pal_plat_getNumberOfNetInterfaces(uint32_t *numInterfaces)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:458</div></div> +<div class="ttc" id="pal__network_8h_html_ac844634680241bad287771f1ab8b0901"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a></div><div class="ttdeci">uint32_t palSocketLength_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:32</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a76c4e2adf95702c4db8f3792ae373bf9"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_getSocketOptions</a></div><div class="ttdeci">palStatus_t pal_plat_getSocketOptions(palSocket_t socket, palSocketOptionName_t optionName, void *optionValue, palSocketLength_t *optionLength)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:301</div></div> +<div class="ttc" id="pal__network_8h_html_ac0bd9e160ca4973db4d846a4369ea996"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a></div><div class="ttdeci">void * palSocket_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:33</div></div> +<div class="ttc" id="pal__plat__network_8h_html_aa0c26dfeee80444e58eacab238206d09"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_socketMiniSelect</a></div><div class="ttdeci">palStatus_t pal_plat_socketMiniSelect(const palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t numberOfSockets, pal_timeVal_t *timeout, uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t *numberOfSocketsSet)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:536</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a17365747ed8d29df153a336da3942187"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187">pal_plat_sendTo</a></div><div class="ttdeci">palStatus_t pal_plat_sendTo(palSocket_t socket, const void *buffer, size_t length, const palSocketAddress_t *to, palSocketLength_t toLength, size_t *bytesSent)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:418</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a08ea05dacec7f7d9dc892dab0318542d"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_setSocketOptions</a></div><div class="ttdeci">palStatus_t pal_plat_setSocketOptions(palSocket_t socket, int optionName, const void *optionValue, palSocketLength_t optionLength)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:332</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a6a2b36db2bb5d71ade0fe8cb00d3cecd"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_socketsTerminate</a></div><div class="ttdeci">palStatus_t pal_plat_socketsTerminate(void *context)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:144</div></div> +<div class="ttc" id="pal__network_8h_html_ab5d2c3c0d3b2f0e08afcd0d53ff4c418"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a></div><div class="ttdeci">palSocketType_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:54</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a9f6e13112366978741749649356a886c"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c">pal_plat_RegisterNetworkInterface</a></div><div class="ttdeci">palStatus_t pal_plat_RegisterNetworkInterface(void *networkInterfaceContext, uint32_t *interfaceIndex)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:107</div></div> +<div class="ttc" id="structpal_net_interface_info_html"><div class="ttname"><a href="../../d9/d16/structpal_net_interface_info.html">palNetInterfaceInfo</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:42</div></div> +<div class="ttc" id="pal__network_8h_html_a2694f5de0fb810ddd7ff249ea1478f51"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a></div><div class="ttdeci">palSocketOptionName_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:63</div></div> +<div class="ttc" id="pal__plat__network_8h_html_aa869b5eddbf4eb6aebbbb587ece84aac"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_receiveFrom</a></div><div class="ttdeci">palStatus_t pal_plat_receiveFrom(palSocket_t socket, void *buffer, size_t length, palSocketAddress_t *from, palSocketLength_t *fromLength, size_t *bytesReceived)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:386</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a071355a0ca4d4eece45f0ed85a9ab1da"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_close</a></div><div class="ttdeci">palStatus_t pal_plat_close(palSocket_t *socket)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:444</div></div> +<div class="ttc" id="pal__plat__network_8h_html_ab92cca0e4facf3d62e03c0d0ca0523da"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_socketsInit</a></div><div class="ttdeci">palStatus_t pal_plat_socketsInit(void *context)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:93</div></div> +<div class="ttc" id="pal__network_8h_html_a5607f2af4b642ef0548bd47c891c6d31"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a></div><div class="ttdeci">#define PAL_NET_SOCKET_SELECT_MAX_SOCKETS</div><div class="ttdef"><b>Definition:</b> pal_network.h:216</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a6dc3b4c06e96b29068995809b98a935e"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_getNetInterfaceInfo</a></div><div class="ttdeci">palStatus_t pal_plat_getNetInterfaceInfo(uint32_t interfaceNum, palNetInterfaceInfo_t *interfaceInfo)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:464</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a58a25ae30bb6225cc8b5344053fd705c"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_socket</a></div><div class="ttdeci">palStatus_t pal_plat_socket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palSocket_t *socket)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:251</div></div> +<div class="ttc" id="pal__plat__network_8h_html_a53a267fd8ed0b7a5cf988224e95bd47c"><div class="ttname"><a href="../../d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_bind</a></div><div class="ttdeci">palStatus_t pal_plat_bind(palSocket_t socket, palSocketAddress_t *myAddress, palSocketLength_t addressLength)</div><div class="ttdef"><b>Definition:</b> pal_plat_network.cpp:366</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +<div class="ttc" id="structpal__time_val_html"><div class="ttname"><a href="../../de/dfc/structpal__time_val.html">pal_timeVal</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:80</div></div> +<div class="ttc" id="pal__network_8h_html_a01b7e0ab9c2845885f6a7e012002dba7"><div class="ttname"><a href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a></div><div class="ttdeci">palSocketDomain_t</div><div class="ttdef"><b>Definition:</b> pal_network.h:48</div></div> +<div class="ttc" id="structpal_socket_address_html"><div class="ttname"><a href="../../db/d42/structpal_socket_address.html">palSocketAddress</a></div><div class="ttdef"><b>Definition:</b> pal_network.h:37</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,273 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_socket_test_main_mbedOS.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_socket_test_main_mbedOS.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "mbed.h"</code><br /> +<code>#include "rtos.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a6b71ffd718e2af00cebeb05560b44be7"><td class="memItemLeft" align="right" valign="top">DigitalOut </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">led1</a> (LED1)</td></tr> +<tr class="separator:a6b71ffd718e2af00cebeb05560b44be7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memItemLeft" align="right" valign="top">InterruptIn </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">sw2</a> (SW2)</td></tr> +<tr class="separator:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a21e1e181f00d9dc8dbb912650459bfde"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">sw2_press</a> (void)</td></tr> +<tr class="separator:a21e1e181f00d9dc8dbb912650459bfde"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">led_thread</a> (void const *argument)</td></tr> +<tr class="separator:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afe6a59684384290b7f8710db5203944a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">button_thread</a> (void const *argument)</td></tr> +<tr class="separator:afe6a59684384290b7f8710db5203944a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab">TEST_pal_socket_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0f2228420376f4db7e1274f2b41667c"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">main</a> (int argc, const char *argv[])</td></tr> +<tr class="separator:ac0f2228420376f4db7e1274f2b41667c"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">button_pressed</a> = 0</td></tr> +<tr class="separator:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7d37e93ff0246ad7bf396650eaf84487"><td class="memItemLeft" align="right" valign="top">Thread * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">thread2</a></td></tr> +<tr class="separator:a7d37e93ff0246ad7bf396650eaf84487"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="afe6a59684384290b7f8710db5203944a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void button_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6b71ffd718e2af00cebeb05560b44be7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">DigitalOut led1 </td> + <td>(</td> + <td class="paramtype">LED1 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a602cc5fb415f60615dbfa0643b3b3e26"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void led_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac0f2228420376f4db7e1274f2b41667c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[] </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af5543796fae8f0c3d5bfbd33f2389cb8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">InterruptIn sw2 </td> + <td>(</td> + <td class="paramtype">SW2 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a21e1e181f00d9dc8dbb912650459bfde"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void sw2_press </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2393bacb0eb76d2dd1b0c200a8769cab"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_socket_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="ae8697e1a75bad4a53dd6d6ec81e486cb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t button_pressed = 0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7d37e93ff0246ad7bf396650eaf84487"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">Thread* thread2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/da/d2d/pal__rtos__test_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,653 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_rtos_test.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos_test.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +<code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +<code>#include "<a class="el" href="../../d9/d28/pal__rtos__test__utils_8h_source.html">pal_rtos_test_utils.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d9/d16/pal_8h_source.html">pal.h</a>"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ab19fea07339238925c3b105637ce92c1"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#ab19fea07339238925c3b105637ce92c1">TEST_GROUP</a> (pal_rtos)</td></tr> +<tr class="separator:ab19fea07339238925c3b105637ce92c1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a393f7a6e534c05e534cfdaf46473db45"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a393f7a6e534c05e534cfdaf46473db45">palRunThreads</a> ()</td></tr> +<tr class="separator:a393f7a6e534c05e534cfdaf46473db45"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8a7c6f6a71607f9dce69207f1f7ed3c1"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a8a7c6f6a71607f9dce69207f1f7ed3c1">TEST_SETUP</a> (pal_rtos)</td></tr> +<tr class="separator:a8a7c6f6a71607f9dce69207f1f7ed3c1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac5fc4009112ba6cadc74ad8cd14c427b"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#ac5fc4009112ba6cadc74ad8cd14c427b">TEST_TEAR_DOWN</a> (pal_rtos)</td></tr> +<tr class="separator:ac5fc4009112ba6cadc74ad8cd14c427b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1e33659cb747282e1869e9f86fe2d33f"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a1e33659cb747282e1869e9f86fe2d33f">TEST</a> (pal_rtos, pal_osKernelSysTick_Unity)</td></tr> +<tr class="separator:a1e33659cb747282e1869e9f86fe2d33f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a19f494b1a336e145470aa415d517937f"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a19f494b1a336e145470aa415d517937f">TEST</a> (pal_rtos, pal_osKernelSysTick64_Unity)</td></tr> +<tr class="separator:a19f494b1a336e145470aa415d517937f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0efc309d0e8eb82d8caf439877959e21"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a0efc309d0e8eb82d8caf439877959e21">TEST</a> (pal_rtos, pal_osKernelSysTickMicroSec_Unity)</td></tr> +<tr class="separator:a0efc309d0e8eb82d8caf439877959e21"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af2b06d1978f845fac0eaf4d1d3801629"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#af2b06d1978f845fac0eaf4d1d3801629">TEST</a> (pal_rtos, pal_osKernelSysMilliSecTick_Unity)</td></tr> +<tr class="separator:af2b06d1978f845fac0eaf4d1d3801629"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a236b8351236670bd5b5a07c92d22df4b"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a236b8351236670bd5b5a07c92d22df4b">TEST</a> (pal_rtos, pal_osKernelSysTickFrequency_Unity)</td></tr> +<tr class="separator:a236b8351236670bd5b5a07c92d22df4b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4291ec1155d61a686122f5d4d6f6d2c5"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a4291ec1155d61a686122f5d4d6f6d2c5">TEST</a> (pal_rtos, pal_osDelay_Unity)</td></tr> +<tr class="separator:a4291ec1155d61a686122f5d4d6f6d2c5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a60d7bdf4675622e4a19f1a5b3a0d8523"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a60d7bdf4675622e4a19f1a5b3a0d8523">TEST</a> (pal_rtos, BasicTimeScenario)</td></tr> +<tr class="separator:a60d7bdf4675622e4a19f1a5b3a0d8523"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad59650144ddde4e89319fea8013711cd"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#ad59650144ddde4e89319fea8013711cd">TEST</a> (pal_rtos, TimerUnityTest)</td></tr> +<tr class="separator:ad59650144ddde4e89319fea8013711cd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab6e3467dab64a1ae60a313f6c004e337"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#ab6e3467dab64a1ae60a313f6c004e337">TEST</a> (pal_rtos, PrimitivesUnityTest1)</td></tr> +<tr class="separator:ab6e3467dab64a1ae60a313f6c004e337"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a15d1bcdd022e5ac3ded7f4c5c4d77195"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a15d1bcdd022e5ac3ded7f4c5c4d77195">TEST</a> (pal_rtos, PrimitivesUnityTest2)</td></tr> +<tr class="separator:a15d1bcdd022e5ac3ded7f4c5c4d77195"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9286efb458d9a35e4c89e79111bc5b32"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a9286efb458d9a35e4c89e79111bc5b32">TEST</a> (pal_rtos, MemoryPoolUnityTest)</td></tr> +<tr class="separator:a9286efb458d9a35e4c89e79111bc5b32"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1ab2135517e3491868d55fd58d1cfc93"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a1ab2135517e3491868d55fd58d1cfc93">TEST</a> (pal_rtos, MessageUnityTest)</td></tr> +<tr class="separator:a1ab2135517e3491868d55fd58d1cfc93"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a02ee4db9ce4bddd60ae6af604b0f821f"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a02ee4db9ce4bddd60ae6af604b0f821f">TEST</a> (pal_rtos, AtomicIncrementUnityTest)</td></tr> +<tr class="separator:a02ee4db9ce4bddd60ae6af604b0f821f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a283449eb9014d626632ed99b627e3549"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a283449eb9014d626632ed99b627e3549">TEST</a> (pal_rtos, pal_init_test)</td></tr> +<tr class="separator:a283449eb9014d626632ed99b627e3549"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa4eb9db0c81e55785354f57fa97b1e0f"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#aa4eb9db0c81e55785354f57fa97b1e0f">TEST</a> (pal_rtos, CustomizedTest)</td></tr> +<tr class="separator:aa4eb9db0c81e55785354f57fa97b1e0f"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:a9beaf51023e475986b8b182c80ccc023"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a9beaf51023e475986b8b182c80ccc023">g_threadStorage</a> [20] = { 0 }</td></tr> +<tr class="separator:a9beaf51023e475986b8b182c80ccc023"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8f9b1f133f82ce955405d453f0c506d6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a8f9b1f133f82ce955405d453f0c506d6">g_threadsArg</a> = {0}</td></tr> +<tr class="separator:a8f9b1f133f82ce955405d453f0c506d6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1a09db2f0cd5dd2d0929b34afad51ba1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a1a09db2f0cd5dd2d0929b34afad51ba1">g_timerArgs</a> = {0}</td></tr> +<tr class="separator:a1a09db2f0cd5dd2d0929b34afad51ba1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:adb164ebbfd2189f434f5e550e2d93bb4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#adb164ebbfd2189f434f5e550e2d93bb4">mutex1</a> = <a class="el" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">NULLPTR</a></td></tr> +<tr class="separator:adb164ebbfd2189f434f5e550e2d93bb4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8706c6b975e957968f23af2812bbc0cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a8706c6b975e957968f23af2812bbc0cb">mutex2</a> = <a class="el" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">NULLPTR</a></td></tr> +<tr class="separator:a8706c6b975e957968f23af2812bbc0cb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2f8d675e43058c8f8b853b52366abf38"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d2d/pal__rtos__test_8c.html#a2f8d675e43058c8f8b853b52366abf38">semaphore1</a> = <a class="el" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">NULLPTR</a></td></tr> +<tr class="separator:a2f8d675e43058c8f8b853b52366abf38"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a393f7a6e534c05e534cfdaf46473db45"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void palRunThreads </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a1e33659cb747282e1869e9f86fe2d33f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_osKernelSysTick_Unity </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a19f494b1a336e145470aa415d517937f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_osKernelSysTick64_Unity </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a0efc309d0e8eb82d8caf439877959e21"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_osKernelSysTickMicroSec_Unity </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af2b06d1978f845fac0eaf4d1d3801629"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_osKernelSysMilliSecTick_Unity </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a236b8351236670bd5b5a07c92d22df4b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_osKernelSysTickFrequency_Unity </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4291ec1155d61a686122f5d4d6f6d2c5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_osDelay_Unity </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a60d7bdf4675622e4a19f1a5b3a0d8523"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">BasicTimeScenario </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad59650144ddde4e89319fea8013711cd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">TimerUnityTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ab6e3467dab64a1ae60a313f6c004e337"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">PrimitivesUnityTest1 </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a15d1bcdd022e5ac3ded7f4c5c4d77195"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">PrimitivesUnityTest2 </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9286efb458d9a35e4c89e79111bc5b32"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">MemoryPoolUnityTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a1ab2135517e3491868d55fd58d1cfc93"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">MessageUnityTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a02ee4db9ce4bddd60ae6af604b0f821f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">AtomicIncrementUnityTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a283449eb9014d626632ed99b627e3549"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">pal_init_test </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa4eb9db0c81e55785354f57fa97b1e0f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname">, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">CustomizedTest </td> + <td class="paramname"> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ab19fea07339238925c3b105637ce92c1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_GROUP </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8a7c6f6a71607f9dce69207f1f7ed3c1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_SETUP </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac5fc4009112ba6cadc74ad8cd14c427b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_TEAR_DOWN </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="a8f9b1f133f82ce955405d453f0c506d6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">threadsArgument_t</a> g_threadsArg = {0}</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9beaf51023e475986b8b182c80ccc023"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t g_threadStorage[20] = { 0 }</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a1a09db2f0cd5dd2d0929b34afad51ba1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">timerArgument_t</a> g_timerArgs = {0}</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="adb164ebbfd2189f434f5e550e2d93bb4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutex1 = <a class="el" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">NULLPTR</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a8706c6b975e957968f23af2812bbc0cb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutex2 = <a class="el" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">NULLPTR</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2f8d675e43058c8f8b853b52366abf38"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphore1 = <a class="el" href="../../d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">NULLPTR</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/da/d64/pal__socket__test__main__mbedos_classic_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,273 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_socket_test_main_mbedosClassic.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_socket_test_main_mbedosClassic.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "mbed.h"</code><br /> +<code>#include "rtos.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a6b71ffd718e2af00cebeb05560b44be7"><td class="memItemLeft" align="right" valign="top">DigitalOut </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">led1</a> (LED1)</td></tr> +<tr class="separator:a6b71ffd718e2af00cebeb05560b44be7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memItemLeft" align="right" valign="top">InterruptIn </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">sw2</a> (SW2)</td></tr> +<tr class="separator:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a21e1e181f00d9dc8dbb912650459bfde"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">sw2_press</a> (void)</td></tr> +<tr class="separator:a21e1e181f00d9dc8dbb912650459bfde"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">led_thread</a> (void const *argument)</td></tr> +<tr class="separator:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afe6a59684384290b7f8710db5203944a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#afe6a59684384290b7f8710db5203944a">button_thread</a> (void const *argument)</td></tr> +<tr class="separator:afe6a59684384290b7f8710db5203944a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab">TEST_pal_socket_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0f2228420376f4db7e1274f2b41667c"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">main</a> (int argc, const char *argv[])</td></tr> +<tr class="separator:ac0f2228420376f4db7e1274f2b41667c"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">button_pressed</a> = 0</td></tr> +<tr class="separator:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7d37e93ff0246ad7bf396650eaf84487"><td class="memItemLeft" align="right" valign="top">Thread * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">thread2</a></td></tr> +<tr class="separator:a7d37e93ff0246ad7bf396650eaf84487"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="afe6a59684384290b7f8710db5203944a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void button_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6b71ffd718e2af00cebeb05560b44be7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">DigitalOut led1 </td> + <td>(</td> + <td class="paramtype">LED1 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a602cc5fb415f60615dbfa0643b3b3e26"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void led_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac0f2228420376f4db7e1274f2b41667c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[] </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af5543796fae8f0c3d5bfbd33f2389cb8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">InterruptIn sw2 </td> + <td>(</td> + <td class="paramtype">SW2 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a21e1e181f00d9dc8dbb912650459bfde"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void sw2_press </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2393bacb0eb76d2dd1b0c200a8769cab"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_socket_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="ae8697e1a75bad4a53dd6d6ec81e486cb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t button_pressed = 0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7d37e93ff0246ad7bf396650eaf84487"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">Thread* thread2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/da/d7f/pal__update__test__main__mbed_o_s_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,149 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_update_test_main_mbedOS.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_update_test_main_mbedOS.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "mbed.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d7f/pal__update__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a59390bc31498889208cfda7dea51bffa"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d7f/pal__update__test__main__mbed_o_s_8cpp.html#a59390bc31498889208cfda7dea51bffa">TEST_pal_update_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a59390bc31498889208cfda7dea51bffa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0f2228420376f4db7e1274f2b41667c"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/d7f/pal__update__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">main</a> (int argc, const char *argv[])</td></tr> +<tr class="separator:ac0f2228420376f4db7e1274f2b41667c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ac0f2228420376f4db7e1274f2b41667c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[] </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a59390bc31498889208cfda7dea51bffa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_update_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/da/da9/pal__update_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,418 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Modules/Update/pal_update.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></li><li class="navelem"><a class="el" href="../../dir_a9ff65e3f848f462604f5439bae27718.html">Update</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_update.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d2/d47/pal__plat__update_8h_source.html">pal_plat_update.h</a>"</code><br /> +<code>#include "<a class="el" href="../../dd/df9/pal__update_8h_source.html">pal_update.h</a>"</code><br /> +<code>#include "<a class="el" href="../../db/dcf/pal__macros_8h_source.html">pal_macros.h</a>"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a2e85d0291ef07a84780291b67da129b5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a2e85d0291ef07a84780291b67da129b5">pal_imageInitAPI</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> CBfunction)</td></tr> +<tr class="separator:a2e85d0291ef07a84780291b67da129b5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a399c2a8dbd117abf5cd4fa69771f98a0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a399c2a8dbd117abf5cd4fa69771f98a0">pal_imageDeInit</a> (void)</td></tr> +<tr class="separator:a399c2a8dbd117abf5cd4fa69771f98a0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4efbe7dd54c89cc87c80e94aa07a9988"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a4efbe7dd54c89cc87c80e94aa07a9988">pal_imagePrepare</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> *headerDetails)</td></tr> +<tr class="separator:a4efbe7dd54c89cc87c80e94aa07a9988"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8b38046695a7124198787f01250d49a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a8b38046695a7124198787f01250d49a3">pal_imageWrite</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *chunk)</td></tr> +<tr class="separator:a8b38046695a7124198787f01250d49a3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a175083cffce66b96cd608a6cd10e9c61"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a175083cffce66b96cd608a6cd10e9c61">pal_imageFinalize</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId)</td></tr> +<tr class="separator:a175083cffce66b96cd608a6cd10e9c61"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a37805c23a8066068318031f2d90c2da4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a37805c23a8066068318031f2d90c2da4">pal_imageGetDirectMemoryAccess</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, void **imagePtr, size_t *imageSizeInBytes)</td></tr> +<tr class="separator:a37805c23a8066068318031f2d90c2da4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aac9ba34b8a1600d97b2b019b55e31a8d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#aac9ba34b8a1600d97b2b019b55e31a8d">pal_imageReadToBuffer</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *chunk)</td></tr> +<tr class="separator:aac9ba34b8a1600d97b2b019b55e31a8d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a31b9ead19037301ac9df1ccd6260262e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a31b9ead19037301ac9df1ccd6260262e">pal_imageActivate</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId)</td></tr> +<tr class="separator:a31b9ead19037301ac9df1ccd6260262e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a278dcb55bfa1196ffe5713fa938d5d6e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a278dcb55bfa1196ffe5713fa938d5d6e">pal_imageGetActiveHash</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *hash)</td></tr> +<tr class="separator:a278dcb55bfa1196ffe5713fa938d5d6e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a72cd92d9d3eb0166f83d7e3c3e66f64c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#a72cd92d9d3eb0166f83d7e3c3e66f64c">pal_imageGetActiveVersion</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *version)</td></tr> +<tr class="separator:a72cd92d9d3eb0166f83d7e3c3e66f64c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa852dd1acee23c14859d9d4f94e09ce6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/da9/pal__update_8c.html#aa852dd1acee23c14859d9d4f94e09ce6">pal_imageWriteDataToMemory</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a> dataId, const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const dataBuffer)</td></tr> +<tr class="separator:aa852dd1acee23c14859d9d4f94e09ce6"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a31b9ead19037301ac9df1ccd6260262e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageActivate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Sets image imageId to be the active image (after device reset). the function must call g_palUpdateServiceCBfunc before after finished</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a399c2a8dbd117abf5cd4fa69771f98a0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageDeInit </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>clearing all the resources used by the pal_update APIs </p><dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a175083cffce66b96cd608a6cd10e9c61"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageFinalize </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Flushes the image data and sets the version of imageId to imageVersion. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">imageVersion</td><td>a struct containing the version as a buffer and the size </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a278dcb55bfa1196ffe5713fa938d5d6e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageGetActiveHash </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>hash</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the hash value of the active image to hash buffer with max size hash maxBufferLength and sets to hash bufferLength to the hash size. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">hash</td><td>struct containing the hash and actual size of hash read </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a72cd92d9d3eb0166f83d7e3c3e66f64c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageGetActiveVersion </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>version</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the version of the active image to version buffer with size set to version bufferLength. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">version</td><td>struct containing the version and actual size of version read </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a37805c23a8066068318031f2d90c2da4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageGetDirectMemoryAccess </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void ** </td> + <td class="paramname"><em>imagePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>imageSizeInBytes</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Verifies whether image imageId is readable and sets imagePtr to point to the beginning of start of the image in the memory and imageSizeInBytes to the image size. In case of failure sets imagePtr to NULL and returns relevant palStatus_t error </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imagePtr</td><td>pointer to the start of the image </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imageSizeInBytes</td><td>the size of the image </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a2e85d0291ef07a84780291b67da129b5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageInitAPI </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> </td> + <td class="paramname"><em>CBfunction</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>setting the callback function that will be called before the end of each API (except imageGetDirectMemAccess)</p> +<p>WARNING: please do not change this function! this function loads a call back function received from the upper layer (service). the call back should be called at the end of each function (except pal_plat_imageGetDirectMemAccess) the call back receives the event type that just happened defined by the ENUM palImageEvents_t.</p> +<p>if you will not call the call back at the end the service behaver will be undefined the function must call g_palUpdateServiceCBfunc before after finished</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">CBfunction</td><td>pointer to the call back function </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a4efbe7dd54c89cc87c80e94aa07a9988"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imagePrepare </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> * </td> + <td class="paramname"><em>headerDetails</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Prepare to write image with id imageId and size imageSize in suitable memory region (Space availability will be verified and reserved). the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">imageSize</td><td>the size of the image </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aac9ba34b8a1600d97b2b019b55e31a8d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageReadToBuffer </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Reads max of chunk maxBufferLength bytes from image imageId with relative offset offset and stores it in chunk buffer. And sets chunk bufferLength value to the actual number of bytes read. Note: Please use this API in case image is not directly accessible via imageGetDirectMemAccess function.</p> +<p>the function must call g_palUpdateServiceCBfunc before after finished</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>offset to start read from </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">chunk</td><td>struct containing the data and actual bytes read </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a8b38046695a7124198787f01250d49a3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageWrite </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Writes the data in chunk buffer with size chunk bufferLength in the location of imageId adding the relative offset. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>the offset to write the data into </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">pointer</td><td>to struct containing the data and the data length to write </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aa852dd1acee23c14859d9d4f94e09ce6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageWriteDataToMemory </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a> </td> + <td class="paramname"><em>dataId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const </td> + <td class="paramname"><em>dataBuffer</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Writing the data of dataId stored in dataBuffer to memory accessible to bootloader. Currently only has is available. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">dataId</td><td>one of the members of palImagePlatformData_t enum </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">dataBuffer</td><td>struct containing the data and actual bytes to be written </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/da/dfe/pal__errors_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,346 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_errors.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#enum-members">Enumerations</a> </div> + <div class="headertitle"> +<div class="title">pal_errors.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>"</code><br /> +</div> +<p><a href="../../da/dfe/pal__errors_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a> +Enumerations</h2></td></tr> +<tr class="memitem:a1800b4754588cdf0f544d1a7194168d1"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1">palErrorModules_t</a> { <br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091">PAL_ERR_MODULE_GENERAL</a> = 0x4, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9">PAL_ERR_MODULE_PAL</a> = 0x6, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1">PAL_ERR_MODULE_C</a> = 0x8, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73">PAL_ERR_MODULE_RTOS</a> = 0xC, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b">PAL_ERR_MODULE_NET</a> = 0x10, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d">PAL_ERR_MODULE_TLS</a> = 0x14, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944">PAL_ERR_MODULE_CRYPTO</a> = 0x18, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e">PAL_ERR_MODULE_UPDATE</a> = 0x1C +<br /> + }</td></tr> +<tr class="separator:a1800b4754588cdf0f544d1a7194168d1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a480f42f9c6533ec9a36f3312a285a7d5"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5">palError_t</a> { <br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> = (-1 << PAL_ERR_MODULE_GENERAL), +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4">PAL_ERR_GENERIC_FAILURE</a> = PAL_ERR_GENERAL_BASE, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818">PAL_ERR_INVALID_ARGUMENT</a> = PAL_ERR_GENERAL_BASE + 1, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c">PAL_ERR_NO_MEMORY</a> = PAL_ERR_GENERAL_BASE + 2, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9">PAL_ERR_BUFFER_TOO_SMALL</a> = PAL_ERR_GENERAL_BASE + 3, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94">PAL_ERR_NOT_SUPPORTED</a> = PAL_ERR_GENERAL_BASE + 4, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49">PAL_ERR_TIMEOUT_EXPIRED</a> = PAL_ERR_GENERAL_BASE + 5, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c">PAL_ERR_NOT_INITIALIZED</a> = PAL_ERR_GENERAL_BASE + 6, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107">PAL_ERR_NULL_POINTER</a> = PAL_ERR_GENERAL_BASE + 7, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308">PAL_ERR_CREATION_FAILED</a> = PAL_ERR_GENERAL_BASE + 8, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a">PAL_ERR_NOT_IMPLEMENTED</a> = (-1 << PAL_ERR_MODULE_PAL), +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> = (-1 << PAL_ERR_MODULE_RTOS), +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7">PAL_ERR_RTOS_PARAMETER</a> = PAL_ERR_RTOS_ERROR_BASE + 0x80, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3">PAL_ERR_RTOS_RESOURCE</a> = PAL_ERR_RTOS_ERROR_BASE + 0x81, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b">PAL_ERR_RTOS_TIMEOUT</a> = PAL_ERR_RTOS_ERROR_BASE + 0xC1, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef">PAL_ERR_RTOS_ISR</a> = PAL_ERR_RTOS_ERROR_BASE + 0x82, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4">PAL_ERR_RTOS_ISR_RECURSIVE</a> = PAL_ERR_RTOS_ERROR_BASE + 0x83, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb">PAL_ERR_RTOS_PRIORITY</a> = PAL_ERR_RTOS_ERROR_BASE + 0x84, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413">PAL_ERR_RTOS_NO_MEMORY</a> = PAL_ERR_RTOS_ERROR_BASE + 0x85, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690">PAL_ERR_RTOS_VALUE</a> = PAL_ERR_RTOS_ERROR_BASE + 0x86, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70">PAL_ERR_RTOS_OS</a> = PAL_ERR_RTOS_ERROR_BASE + 0xFF, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> = (-1 << PAL_ERR_MODULE_NET), +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe">PAL_ERR_SOCKET_GENERIC</a> = PAL_ERR_SOCKET_ERROR_BASE, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d">PAL_ERR_SOCKET_NO_BUFFERS</a> = PAL_ERR_SOCKET_ERROR_BASE + 1, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2">PAL_ERR_SOCKET_HOST_UNREACHABLE</a> = PAL_ERR_SOCKET_ERROR_BASE + 2, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829">PAL_ERR_SOCKET_IN_PROGRES</a> = PAL_ERR_SOCKET_ERROR_BASE + 3, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e">PAL_ERR_SOCKET_INVALID_VALUE</a> = PAL_ERR_SOCKET_ERROR_BASE + 4, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea">PAL_ERR_SOCKET_WOULD_BLOCK</a> = PAL_ERR_SOCKET_ERROR_BASE + 5, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e">PAL_ERR_SOCKET_ADDRESS_IN_USE</a> = PAL_ERR_SOCKET_ERROR_BASE + 6, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20">PAL_ERR_SOCKET_ALREADY_CONNECTED</a> = PAL_ERR_SOCKET_ERROR_BASE + 7, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf">PAL_ERR_SOCKET_CONNECTION_ABORTED</a> = PAL_ERR_SOCKET_ERROR_BASE + 8, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b">PAL_ERR_SOCKET_CONNECTION_RESET</a> = PAL_ERR_SOCKET_ERROR_BASE + 9, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58">PAL_ERR_SOCKET_NOT_CONNECTED</a> = PAL_ERR_SOCKET_ERROR_BASE + 10, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d">PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR</a> = PAL_ERR_SOCKET_ERROR_BASE + 11, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50">PAL_ERR_SOCKET_CONNECTION_CLOSED</a> = PAL_ERR_SOCKET_ERROR_BASE + 12, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd">PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING</a> = PAL_ERR_SOCKET_ERROR_BASE + 13, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35">PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY</a> = PAL_ERR_SOCKET_ERROR_BASE + 14, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8">PAL_ERR_SOCKET_INVALID_ADDRESS</a> = PAL_ERR_SOCKET_ERROR_BASE + 15, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f">PAL_ERR_SOCKET_DNS_ERROR</a> = PAL_ERR_SOCKET_ERROR_BASE + 16, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577">PAL_ERR_SOCKET_HDCP_ERROR</a> = PAL_ERR_SOCKET_ERROR_BASE + 17, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8">PAL_ERR_SOCKET_AUTH_ERROR</a> = PAL_ERR_SOCKET_ERROR_BASE + 18, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479">PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED</a> = PAL_ERR_SOCKET_ERROR_BASE + 19, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> = (-1 << PAL_ERR_MODULE_UPDATE), +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5">PAL_ERR_UPDATE_ERROR</a> = PAL_ERR_UPDATE_ERROR_BASE, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf">PAL_ERR_UPDATE_BUSY</a> = PAL_ERR_UPDATE_ERROR_BASE + 1, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b">PAL_ERR_UPDATE_TIMEOUT</a> = PAL_ERR_UPDATE_ERROR_BASE + 2, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6">PAL_ERR_UPDATE_OUT_OF_BOUNDS</a> = PAL_ERR_UPDATE_ERROR_BASE + 3, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57">PAL_ERR_UPDATE_PALFROM_API</a> = PAL_ERR_UPDATE_ERROR_BASE + 4, +<br /> +  <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6">PAL_ERR_UPDATE_PALFROM_IO</a> = PAL_ERR_UPDATE_ERROR_BASE + 5, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42">PAL_ERR_UPDATE_END_OF_IMAGE</a> = PAL_ERR_UPDATE_ERROR_BASE + 6, +<a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9">PAL_ERR_UPDATE_CHUNK_TO_SMALL</a> = PAL_ERR_UPDATE_ERROR_BASE + 7 +<br /> + }</td></tr> +<tr class="separator:a480f42f9c6533ec9a36f3312a285a7d5"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Enumeration Type Documentation</h2> +<a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5">palError_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35"></a>PAL_ERR_GENERAL_BASE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4"></a>PAL_ERR_GENERIC_FAILURE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818"></a>PAL_ERR_INVALID_ARGUMENT </td><td class="fielddoc"> +<p>generic failure </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c"></a>PAL_ERR_NO_MEMORY </td><td class="fielddoc"> +<p>one or more of the functions arguments is invalid </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9"></a>PAL_ERR_BUFFER_TOO_SMALL </td><td class="fielddoc"> +<p>failure due to a failed attempt to allocate memory </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94"></a>PAL_ERR_NOT_SUPPORTED </td><td class="fielddoc"> +<p>buffer given is too small </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49"></a>PAL_ERR_TIMEOUT_EXPIRED </td><td class="fielddoc"> +<p>operation not supported by PAL for the current configuration </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c"></a>PAL_ERR_NOT_INITIALIZED </td><td class="fielddoc"> +<p>timeout for the operation has expired </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107"></a>PAL_ERR_NULL_POINTER </td><td class="fielddoc"> +<p>timeout for the operation has expired </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308"></a>PAL_ERR_CREATION_FAILED </td><td class="fielddoc"> +<p>received a null pointer when it should be initialized </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a"></a>PAL_ERR_NOT_IMPLEMENTED </td><td class="fielddoc"> +<p>failure in creation of given type, like: mutex, thread , etc </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65"></a>PAL_ERR_RTOS_ERROR_BASE </td><td class="fielddoc"> +<p>Currently not implemented will be in the future </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7"></a>PAL_ERR_RTOS_PARAMETER </td><td class="fielddoc"> +<p>generic failure in RTOS module </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3"></a>PAL_ERR_RTOS_RESOURCE </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorParameter : parameter error: a mandatory parameter was missing or specified an incorrect object. </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b"></a>PAL_ERR_RTOS_TIMEOUT </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorResource : resource not available: a specified resource was not available. </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef"></a>PAL_ERR_RTOS_ISR </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorTimeoutResource : resource not available within given time: a specified resource was not available within the timeout period </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4"></a>PAL_ERR_RTOS_ISR_RECURSIVE </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorISR : not allowed in ISR context: the function cannot be called from interrupt service routines. </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb"></a>PAL_ERR_RTOS_PRIORITY </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorISRRecursive : function called multiple times from ISR with same object.c </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413"></a>PAL_ERR_RTOS_NO_MEMORY </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorPriority : system cannot determine priority or thread has illegal priority. </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690"></a>PAL_ERR_RTOS_VALUE </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorNoMemory : system is out of memory: it was impossible to allocate or reserve memory for the operation. </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70"></a>PAL_ERR_RTOS_OS </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorValue : value of a parameter is out of range. </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10"></a>PAL_ERR_SOCKET_ERROR_BASE </td><td class="fielddoc"> +<p>PAL mapping of CMSIS error osErrorOS : unspecified RTOS error: run-time error but no other error message fits. </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe"></a>PAL_ERR_SOCKET_GENERIC </td><td class="fielddoc"> +<p>generic socket error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d"></a>PAL_ERR_SOCKET_NO_BUFFERS </td><td class="fielddoc"> +<p>generic socket error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2"></a>PAL_ERR_SOCKET_HOST_UNREACHABLE </td><td class="fielddoc"> +<p>no buffers - PAL mapping of posix error ENOBUFS </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829"></a>PAL_ERR_SOCKET_IN_PROGRES </td><td class="fielddoc"> +<p>host unreachable (routing error)- PAL mapping of posix error EHOSTUNREACH </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e"></a>PAL_ERR_SOCKET_INVALID_VALUE </td><td class="fielddoc"> +<p>in progress- PAL mapping of posix error EINPROGRESS </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea"></a>PAL_ERR_SOCKET_WOULD_BLOCK </td><td class="fielddoc"> +<p>invalid value - PAL mapping of posix error EINVAL </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e"></a>PAL_ERR_SOCKET_ADDRESS_IN_USE </td><td class="fielddoc"> +<p>would block - PAL mapping of posix error EWOULDBLOCK </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20"></a>PAL_ERR_SOCKET_ALREADY_CONNECTED </td><td class="fielddoc"> +<p>Address in use - PAL mapping of posix error EADDRINUSE </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf"></a>PAL_ERR_SOCKET_CONNECTION_ABORTED </td><td class="fielddoc"> +<p>Already connected - PAL mapping of posix error EALREADY </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b"></a>PAL_ERR_SOCKET_CONNECTION_RESET </td><td class="fielddoc"> +<p>Connection aborted - PAL mapping of posix error ECONNABORTED </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58"></a>PAL_ERR_SOCKET_NOT_CONNECTED </td><td class="fielddoc"> +<p>Connection reset - PAL mapping of posix error ECONNRESET </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d"></a>PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR </td><td class="fielddoc"> +<p>Not connected - PAL mapping of posix error ENOTCONN </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50"></a>PAL_ERR_SOCKET_CONNECTION_CLOSED </td><td class="fielddoc"> +<p>I/O error PAL mapping of posix error EIO </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd"></a>PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING </td><td class="fielddoc"> +<p>connection closed </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35"></a>PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY </td><td class="fielddoc"> +<p>failed to set socket to non-blocking </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8"></a>PAL_ERR_SOCKET_INVALID_ADDRESS </td><td class="fielddoc"> +<p>failed to set socket to non-blocking </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f"></a>PAL_ERR_SOCKET_DNS_ERROR </td><td class="fielddoc"> +<p>address given was not valid/found </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577"></a>PAL_ERR_SOCKET_HDCP_ERROR </td><td class="fielddoc"> +<p>DNS lookup error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8"></a>PAL_ERR_SOCKET_AUTH_ERROR </td><td class="fielddoc"> +<p>HDCP error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479"></a>PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED </td><td class="fielddoc"> +<p>authentication error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b"></a>PAL_ERR_UPDATE_ERROR_BASE </td><td class="fielddoc"> +<p>socket option not supported </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5"></a>PAL_ERR_UPDATE_ERROR </td><td class="fielddoc"> +<p>generic error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf"></a>PAL_ERR_UPDATE_BUSY </td><td class="fielddoc"> +<p>unknown error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b"></a>PAL_ERR_UPDATE_TIMEOUT </td><td class="fielddoc"> +<p>unknown error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6"></a>PAL_ERR_UPDATE_OUT_OF_BOUNDS </td><td class="fielddoc"> +<p>unknown error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57"></a>PAL_ERR_UPDATE_PALFROM_API </td><td class="fielddoc"> +<p>unknown error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6"></a>PAL_ERR_UPDATE_PALFROM_IO </td><td class="fielddoc"> +<p>unknown error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42"></a>PAL_ERR_UPDATE_END_OF_IMAGE </td><td class="fielddoc"> +<p>unknown error </p> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9"></a>PAL_ERR_UPDATE_CHUNK_TO_SMALL </td><td class="fielddoc"> +<p>unknown error </p> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1">palErrorModules_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091"></a>PAL_ERR_MODULE_GENERAL </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9"></a>PAL_ERR_MODULE_PAL </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1"></a>PAL_ERR_MODULE_C </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73"></a>PAL_ERR_MODULE_RTOS </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b"></a>PAL_ERR_MODULE_NET </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d"></a>PAL_ERR_MODULE_TLS </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944"></a>PAL_ERR_MODULE_CRYPTO </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e"></a>PAL_ERR_MODULE_UPDATE </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/da/dfe/pal__errors_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,123 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_errors.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_errors.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../da/dfe/pal__errors_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_ERRORS_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_ERRORS_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include "<a class="code" href="../../d6/dc2/pal__types_8h.html">pal_types.h</a>"</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div><div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1"> 28</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> {</div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091"> 29</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091">PAL_ERR_MODULE_GENERAL</a> = 0x4,</div><div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9"> 30</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9">PAL_ERR_MODULE_PAL</a> = 0x6,</div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1"> 31</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1">PAL_ERR_MODULE_C</a> = 0x8,</div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73"> 32</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73">PAL_ERR_MODULE_RTOS</a> = 0xC,</div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b"> 33</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b">PAL_ERR_MODULE_NET</a> = 0x10,</div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d"> 34</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d">PAL_ERR_MODULE_TLS</a> = 0x14,</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944"> 35</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944">PAL_ERR_MODULE_CRYPTO</a> = 0x18,</div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e"> 36</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e">PAL_ERR_MODULE_UPDATE</a> = 0x1C,</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> } <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1">palErrorModules_t</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5"> 40</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> {</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="comment">// generic errors</span></div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35"> 42</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> = (-1 << <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091">PAL_ERR_MODULE_GENERAL</a>),</div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4"> 43</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4">PAL_ERR_GENERIC_FAILURE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a>, <span class="comment">// try to use a more specific error message whenever possible</span></div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818"> 44</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818">PAL_ERR_INVALID_ARGUMENT</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 1, </div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c"> 45</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c">PAL_ERR_NO_MEMORY</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 2, </div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9"> 46</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9">PAL_ERR_BUFFER_TOO_SMALL</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 3, </div><div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94"> 47</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94">PAL_ERR_NOT_SUPPORTED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 4, </div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49"> 48</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49">PAL_ERR_TIMEOUT_EXPIRED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 5, </div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c"> 49</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c">PAL_ERR_NOT_INITIALIZED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 6, </div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107"> 50</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107">PAL_ERR_NULL_POINTER</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 7, </div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308"> 51</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308">PAL_ERR_CREATION_FAILED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a> + 8, </div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="comment">// pal errors</span></div><div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a"> 53</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a">PAL_ERR_NOT_IMPLEMENTED</a> = (-1 << <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9">PAL_ERR_MODULE_PAL</a>), </div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="comment">// c errors</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="comment">// RTOS errors</span></div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65"> 56</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> = (-1 << <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73">PAL_ERR_MODULE_RTOS</a>), <span class="comment">// try to use a more specific error message whenever possible</span></div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7"> 57</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7">PAL_ERR_RTOS_PARAMETER</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0x80,</div><div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3"> 58</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3">PAL_ERR_RTOS_RESOURCE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0x81,</div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b"> 59</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b">PAL_ERR_RTOS_TIMEOUT</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0xC1,</div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef"> 60</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef">PAL_ERR_RTOS_ISR</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0x82,</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4"> 61</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4">PAL_ERR_RTOS_ISR_RECURSIVE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0x83,</div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb"> 62</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb">PAL_ERR_RTOS_PRIORITY</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0x84,</div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413"> 63</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413">PAL_ERR_RTOS_NO_MEMORY</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0x85,</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690"> 64</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690">PAL_ERR_RTOS_VALUE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0x86,</div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70"> 65</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70">PAL_ERR_RTOS_OS</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a> + 0xFF,</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="comment">// network errors</span></div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10"> 67</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> = (-1 << <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b">PAL_ERR_MODULE_NET</a>), </div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe"> 68</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe">PAL_ERR_SOCKET_GENERIC</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a>, </div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d"> 69</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d">PAL_ERR_SOCKET_NO_BUFFERS</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 1, </div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2"> 70</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2">PAL_ERR_SOCKET_HOST_UNREACHABLE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 2, </div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829"> 71</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829">PAL_ERR_SOCKET_IN_PROGRES</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 3, </div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e"> 72</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e">PAL_ERR_SOCKET_INVALID_VALUE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 4, </div><div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea"> 73</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea">PAL_ERR_SOCKET_WOULD_BLOCK</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 5, </div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e"> 74</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e">PAL_ERR_SOCKET_ADDRESS_IN_USE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 6, </div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20"> 75</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20">PAL_ERR_SOCKET_ALREADY_CONNECTED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 7, </div><div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf"> 76</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf">PAL_ERR_SOCKET_CONNECTION_ABORTED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 8, </div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b"> 77</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b">PAL_ERR_SOCKET_CONNECTION_RESET</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 9, </div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58"> 78</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58">PAL_ERR_SOCKET_NOT_CONNECTED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 10, </div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d"> 79</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d">PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 11, </div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50"> 80</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50">PAL_ERR_SOCKET_CONNECTION_CLOSED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 12, </div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd"> 81</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd">PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 13, </div><div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35"> 82</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35">PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 14, </div><div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8"> 83</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8">PAL_ERR_SOCKET_INVALID_ADDRESS</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 15, </div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f"> 84</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f">PAL_ERR_SOCKET_DNS_ERROR</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 16, </div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577"> 85</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577">PAL_ERR_SOCKET_HDCP_ERROR</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 17, </div><div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8"> 86</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8">PAL_ERR_SOCKET_AUTH_ERROR</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 18, </div><div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479"> 87</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479">PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a> + 19, </div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="comment">//update Error</span></div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b"> 89</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> = (-1 << <a class="code" href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e">PAL_ERR_MODULE_UPDATE</a>), </div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5"> 90</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5">PAL_ERR_UPDATE_ERROR</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a>, </div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf"> 91</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf">PAL_ERR_UPDATE_BUSY</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> + 1, </div><div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b"> 92</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b">PAL_ERR_UPDATE_TIMEOUT</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> + 2, </div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6"> 93</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6">PAL_ERR_UPDATE_OUT_OF_BOUNDS</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> + 3, </div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57"> 94</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57">PAL_ERR_UPDATE_PALFROM_API</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> + 4, </div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6"> 95</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6">PAL_ERR_UPDATE_PALFROM_IO</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> + 5, </div><div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42"> 96</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42">PAL_ERR_UPDATE_END_OF_IMAGE</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> + 6, </div><div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9"> 97</a></span>  <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9">PAL_ERR_UPDATE_CHUNK_TO_SMALL</a> = <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a> + 7, </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> } <a class="code" href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5">palError_t</a>; </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> }</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="preprocessor">#endif //_PAL_ERRORS</span></div><div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b">PAL_ERR_RTOS_TIMEOUT</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:59</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1">PAL_ERR_MODULE_C</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:31</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35">PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:82</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">PAL_ERR_SOCKET_ERROR_BASE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:67</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2">PAL_ERR_SOCKET_HOST_UNREACHABLE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:70</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4">PAL_ERR_GENERIC_FAILURE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:43</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf">PAL_ERR_UPDATE_BUSY</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:91</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413">PAL_ERR_RTOS_NO_MEMORY</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:63</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">PAL_ERR_GENERAL_BASE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:42</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd">PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:81</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e">PAL_ERR_MODULE_UPDATE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:36</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e">PAL_ERR_SOCKET_INVALID_VALUE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:72</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73">PAL_ERR_MODULE_RTOS</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:32</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57">PAL_ERR_UPDATE_PALFROM_API</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:94</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20">PAL_ERR_SOCKET_ALREADY_CONNECTED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:75</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d">PAL_ERR_SOCKET_NO_BUFFERS</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:69</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818">PAL_ERR_INVALID_ARGUMENT</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:44</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c">PAL_ERR_NO_MEMORY</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:45</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5">PAL_ERR_UPDATE_ERROR</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:90</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9">PAL_ERR_BUFFER_TOO_SMALL</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:46</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf">PAL_ERR_SOCKET_CONNECTION_ABORTED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:76</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5">palError_t</a></div><div class="ttdeci">palError_t</div><div class="ttdef"><b>Definition:</b> pal_errors.h:40</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577">PAL_ERR_SOCKET_HDCP_ERROR</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:85</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7">PAL_ERR_RTOS_PARAMETER</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:57</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d">PAL_ERR_MODULE_TLS</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:34</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94">PAL_ERR_NOT_SUPPORTED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:47</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49">PAL_ERR_TIMEOUT_EXPIRED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:48</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1">palErrorModules_t</a></div><div class="ttdeci">palErrorModules_t</div><div class="ttdef"><b>Definition:</b> pal_errors.h:28</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6">PAL_ERR_UPDATE_PALFROM_IO</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:95</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9">PAL_ERR_UPDATE_CHUNK_TO_SMALL</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:97</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308">PAL_ERR_CREATION_FAILED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:51</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690">PAL_ERR_RTOS_VALUE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:64</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">PAL_ERR_RTOS_ERROR_BASE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:56</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea">PAL_ERR_SOCKET_WOULD_BLOCK</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:73</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3">PAL_ERR_RTOS_RESOURCE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:58</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42">PAL_ERR_UPDATE_END_OF_IMAGE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:96</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944">PAL_ERR_MODULE_CRYPTO</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:35</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b">PAL_ERR_SOCKET_CONNECTION_RESET</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:77</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70">PAL_ERR_RTOS_OS</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:65</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b">PAL_ERR_UPDATE_TIMEOUT</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:92</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829">PAL_ERR_SOCKET_IN_PROGRES</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:71</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58">PAL_ERR_SOCKET_NOT_CONNECTED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:78</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe">PAL_ERR_SOCKET_GENERIC</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:68</div></div> +<div class="ttc" id="pal__types_8h_html"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html">pal_types.h</a></div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f">PAL_ERR_SOCKET_DNS_ERROR</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:84</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50">PAL_ERR_SOCKET_CONNECTION_CLOSED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:80</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9">PAL_ERR_MODULE_PAL</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:30</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">PAL_ERR_UPDATE_ERROR_BASE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:89</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b">PAL_ERR_MODULE_NET</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:33</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107">PAL_ERR_NULL_POINTER</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:50</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb">PAL_ERR_RTOS_PRIORITY</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:62</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c">PAL_ERR_NOT_INITIALIZED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:49</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8">PAL_ERR_SOCKET_INVALID_ADDRESS</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:83</div></div> +<div class="ttc" id="pal__errors_8h_html_a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091">PAL_ERR_MODULE_GENERAL</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:29</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d">PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:79</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e">PAL_ERR_SOCKET_ADDRESS_IN_USE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:74</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a">PAL_ERR_NOT_IMPLEMENTED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:53</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8">PAL_ERR_SOCKET_AUTH_ERROR</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:86</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6">PAL_ERR_UPDATE_OUT_OF_BOUNDS</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:93</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479">PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:87</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4">PAL_ERR_RTOS_ISR_RECURSIVE</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:61</div></div> +<div class="ttc" id="pal__errors_8h_html_a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef">PAL_ERR_RTOS_ISR</a></div><div class="ttdef"><b>Definition:</b> pal_errors.h:60</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/db/d42/structpal_socket_address.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,99 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: palSocketAddress Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">palSocketAddress Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:a8bdecffc9afacbdf84fc78d26090c221"><td class="memItemLeft" align="right" valign="top">unsigned short </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221">addressType</a></td></tr> +<tr class="separator:a8bdecffc9afacbdf84fc78d26090c221"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0a5471b518ef60cfa0f28c47a323ec4c"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c">addressData</a> [<a class="el" href="../../d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039">PAL_NET_MAX_ADDR_SIZE</a>]</td></tr> +<tr class="separator:a0a5471b518ef60cfa0f28c47a323ec4c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="a0a5471b518ef60cfa0f28c47a323ec4c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">char palSocketAddress::addressData[<a class="el" href="../../d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039">PAL_NET_MAX_ADDR_SIZE</a>]</td> + </tr> + </table> +</div><div class="memdoc"> +<p>address family for the socket </p> + +</div> +</div> +<a class="anchor" id="a8bdecffc9afacbdf84fc78d26090c221"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">unsigned short palSocketAddress::addressType</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/db/dcf/pal__macros_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,587 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_macros.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> </div> + <div class="headertitle"> +<div class="title">pal_macros.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../da/dfe/pal__errors_8h_source.html">pal_errors.h</a>"</code><br /> +</div> +<p><a href="../../db/dcf/pal__macros_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a92e2ad3a6b8c71818b6a08720fa84ba5"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS</a>   0</td></tr> +<tr class="separator:a92e2ad3a6b8c71818b6a08720fa84ba5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a08c56fc189bfb1a6864a7b5d68433e7e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a08c56fc189bfb1a6864a7b5d68433e7e">PAL_MAX_UINT8</a>   0xFFU</td></tr> +<tr class="separator:a08c56fc189bfb1a6864a7b5d68433e7e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af8d58ab12b0f655fe922fc40b3e52ca2"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#af8d58ab12b0f655fe922fc40b3e52ca2">PAL_MAX_UINT16</a>   0xFFFFU</td></tr> +<tr class="separator:af8d58ab12b0f655fe922fc40b3e52ca2"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac7e2d509703ff033a302b325aa664f6e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e">PAL_MAX_UINT32</a>   0xFFFFFFFFUL</td></tr> +<tr class="separator:ac7e2d509703ff033a302b325aa664f6e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6ee734c1fc41affa0926797e382fc8d4"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a6ee734c1fc41affa0926797e382fc8d4">PAL_MAX_INT32</a>   0x7FFFFFFFL</td></tr> +<tr class="separator:a6ee734c1fc41affa0926797e382fc8d4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac3a2f334767728e9bc57512139e0bd61"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ac3a2f334767728e9bc57512139e0bd61">PAL_MIN_INT32</a>   0x80000000L</td></tr> +<tr class="separator:ac3a2f334767728e9bc57512139e0bd61"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a28a8006d7bca3b64235ca4d0cb39bf2b"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a28a8006d7bca3b64235ca4d0cb39bf2b">PAL_MAX_UINT64</a>   0xFFFFFFFFFFFFFFFFULL</td></tr> +<tr class="separator:a28a8006d7bca3b64235ca4d0cb39bf2b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ada154fcb4b3ef9b641486f30de56c7b7"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ada154fcb4b3ef9b641486f30de56c7b7">PAL_MAX_INT64</a>   0x7FFFFFFFFFFFFFFFLL</td></tr> +<tr class="separator:ada154fcb4b3ef9b641486f30de56c7b7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a117c6ce53646b65b4cdcb5da01801675"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a117c6ce53646b65b4cdcb5da01801675">PAL_MAX</a>(a, b)    ((a) > (b) ? (a) : (b))</td></tr> +<tr class="separator:a117c6ce53646b65b4cdcb5da01801675"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a29066dd6aaf6aa8fa21f3a88feb6da59"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a29066dd6aaf6aa8fa21f3a88feb6da59">PAL_MIN</a>(a, b)    ((a) < (b) ? (a) : (b))</td></tr> +<tr class="separator:a29066dd6aaf6aa8fa21f3a88feb6da59"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a966411fe41e3830553bb1b8cf8baf730"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a966411fe41e3830553bb1b8cf8baf730">PAL_DIVIDE_ROUND_UP</a>(num, divider)    (((num) + (divider) - 1) / (divider))</td></tr> +<tr class="separator:a966411fe41e3830553bb1b8cf8baf730"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1651594dc71abf466bddd0f6393edb8b"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a1651594dc71abf466bddd0f6393edb8b">LITTLE__ENDIAN</a>   1</td></tr> +<tr class="separator:a1651594dc71abf466bddd0f6393edb8b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a98390512a7c2732f1197b07acf03e226"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a98390512a7c2732f1197b07acf03e226">PAL_HTONS</a>(x)</td></tr> +<tr class="separator:a98390512a7c2732f1197b07acf03e226"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a55fbcf7a453813fec69016916802de2c"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a55fbcf7a453813fec69016916802de2c">PAL_NTOHS</a>(x)</td></tr> +<tr class="separator:a55fbcf7a453813fec69016916802de2c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a55b1a7d9f939231045521ec4a4817cff"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a55b1a7d9f939231045521ec4a4817cff">PAL_HTONL</a>(x)</td></tr> +<tr class="separator:a55b1a7d9f939231045521ec4a4817cff"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7cbc81d1fb0dcddb1cc88b59d50c2aa9"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a7cbc81d1fb0dcddb1cc88b59d50c2aa9">PAL_NTOHL</a>(x)</td></tr> +<tr class="separator:a7cbc81d1fb0dcddb1cc88b59d50c2aa9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad989cc9220df56cd410590fc628e93b7"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ad989cc9220df56cd410590fc628e93b7">PAL_INVERSE_UINT16_BYTES</a>(val)   ( ((val) << 8) | (((val) & 0x0000FF00) >> 8))</td></tr> +<tr class="separator:ad989cc9220df56cd410590fc628e93b7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4a0b711e344955017ab60ff37977e18f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f">PAL_INVERSE_UINT32_BYTES</a>(val)   ( ((val) >> 24) | (((val) & 0x00FF0000) >> 8) | (((val) & 0x0000FF00) << 8) | (((val) & 0x000000FF) << 24) )</td></tr> +<tr class="separator:a4a0b711e344955017ab60ff37977e18f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae376dc7d0682fb2fc8927897fb065c4c"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ae376dc7d0682fb2fc8927897fb065c4c">PAL_INVERSE_UINT64_BYTES</a>(val)   ((<a class="el" href="../../db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f">PAL_INVERSE_UINT32_BYTES</a>( ((val >> 16) >> 16)) &0xffffffff) | ((((uint64_t)PAL_INVERSE_UINT32_BYTES(val & 0xffffffff))<<16)<<16))</td></tr> +<tr class="separator:ae376dc7d0682fb2fc8927897fb065c4c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad1c98870c5eeba8fe649345e371ef866"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ad1c98870c5eeba8fe649345e371ef866">PAL_LITTLE_ENDIAN_TO_HOST_16BIT</a>(x)   (x)</td></tr> +<tr class="separator:ad1c98870c5eeba8fe649345e371ef866"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa6229ece344478c07677c8b0436b1bb0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#aa6229ece344478c07677c8b0436b1bb0">PAL_LITTLE_ENDIAN_TO_HOST_32BIT</a>(x)   (x)</td></tr> +<tr class="separator:aa6229ece344478c07677c8b0436b1bb0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4ae1ca0100a3eee36eb95931cbec633e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a4ae1ca0100a3eee36eb95931cbec633e">PAL_LITTLE_ENDIAN_TO_HOST_64BIT</a>(x)   (x)</td></tr> +<tr class="separator:a4ae1ca0100a3eee36eb95931cbec633e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9bd4f76c3897b4338fe50a8d69830fe5"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#a9bd4f76c3897b4338fe50a8d69830fe5">PAL_HOST_TO_LITTLE_ENDIAN_16BIT</a>(x)   (x)</td></tr> +<tr class="separator:a9bd4f76c3897b4338fe50a8d69830fe5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab01046a25df49d7fe1d85a8bf722975f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ab01046a25df49d7fe1d85a8bf722975f">PAL_HOST_TO_LITTLE_ENDIAN_32BIT</a>(x)   (x)</td></tr> +<tr class="separator:ab01046a25df49d7fe1d85a8bf722975f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:adc0a4752569188800a75e1601a7e11b5"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#adc0a4752569188800a75e1601a7e11b5">PAL_HOST_TO_LITTLE_ENDIAN_64BIT</a>(x)   (x)</td></tr> +<tr class="separator:adc0a4752569188800a75e1601a7e11b5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad2109677fa03720f6ab0df072c755529"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ad2109677fa03720f6ab0df072c755529">PAL_MODULE_INIT</a>(INIT)   INIT= 1</td></tr> +<tr class="separator:ad2109677fa03720f6ab0df072c755529"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aaeb3e06c7119793239368c0fe74cda05"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#aaeb3e06c7119793239368c0fe74cda05">PAL_MODULE_DEINIT</a>(INIT)   INIT= 0</td></tr> +<tr class="separator:aaeb3e06c7119793239368c0fe74cda05"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ade9a83a9aab96cf50058801afdef4ace"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#ade9a83a9aab96cf50058801afdef4ace">PAL_MODULE_IS_INIT</a>(INIT)</td></tr> +<tr class="separator:ade9a83a9aab96cf50058801afdef4ace"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa1b662a1198e5729d6d0934a7efb02c4"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../db/dcf/pal__macros_8h.html#aa1b662a1198e5729d6d0934a7efb02c4">DEBUG_PRINT</a>(ARGS...)</td></tr> +<tr class="separator:aa1b662a1198e5729d6d0934a7efb02c4"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="aa1b662a1198e5729d6d0934a7efb02c4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define DEBUG_PRINT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">ARGS...</td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a1651594dc71abf466bddd0f6393edb8b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define LITTLE__ENDIAN   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a966411fe41e3830553bb1b8cf8baf730"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_DIVIDE_ROUND_UP</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">num, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname">divider </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td>   (((num) + (divider) - 1) / (divider))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9bd4f76c3897b4338fe50a8d69830fe5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_HOST_TO_LITTLE_ENDIAN_16BIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td>   (x)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ab01046a25df49d7fe1d85a8bf722975f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_HOST_TO_LITTLE_ENDIAN_32BIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td>   (x)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="adc0a4752569188800a75e1601a7e11b5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_HOST_TO_LITTLE_ENDIAN_64BIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td>   (x)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a55b1a7d9f939231045521ec4a4817cff"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_HTONL</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<b>Value:</b><div class="fragment"><div class="line">((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \</div><div class="line"> (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L))</div></div><!-- fragment --> +</div> +</div> +<a class="anchor" id="a98390512a7c2732f1197b07acf03e226"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_HTONS</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<b>Value:</b><div class="fragment"><div class="line">(((((<span class="keywordtype">unsigned</span> short)(x)) >> 8) & 0xff) | \</div><div class="line"> ((((<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)(x)) & 0xff) << 8))</div></div><!-- fragment --> +</div> +</div> +<a class="anchor" id="ad989cc9220df56cd410590fc628e93b7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_INVERSE_UINT16_BYTES</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">val</td><td>)</td> + <td>   ( ((val) << 8) | (((val) & 0x0000FF00) >> 8))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4a0b711e344955017ab60ff37977e18f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_INVERSE_UINT32_BYTES</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">val</td><td>)</td> + <td>   ( ((val) >> 24) | (((val) & 0x00FF0000) >> 8) | (((val) & 0x0000FF00) << 8) | (((val) & 0x000000FF) << 24) )</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ae376dc7d0682fb2fc8927897fb065c4c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_INVERSE_UINT64_BYTES</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">val</td><td>)</td> + <td>   ((<a class="el" href="../../db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f">PAL_INVERSE_UINT32_BYTES</a>( ((val >> 16) >> 16)) &0xffffffff) | ((((uint64_t)PAL_INVERSE_UINT32_BYTES(val & 0xffffffff))<<16)<<16))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad1c98870c5eeba8fe649345e371ef866"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_LITTLE_ENDIAN_TO_HOST_16BIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td>   (x)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa6229ece344478c07677c8b0436b1bb0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_LITTLE_ENDIAN_TO_HOST_32BIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td>   (x)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4ae1ca0100a3eee36eb95931cbec633e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_LITTLE_ENDIAN_TO_HOST_64BIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td>   (x)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a117c6ce53646b65b4cdcb5da01801675"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">a, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname">b </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td>   ((a) > (b) ? (a) : (b))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6ee734c1fc41affa0926797e382fc8d4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_INT32   0x7FFFFFFFL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ada154fcb4b3ef9b641486f30de56c7b7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_INT64   0x7FFFFFFFFFFFFFFFLL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af8d58ab12b0f655fe922fc40b3e52ca2"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_UINT16   0xFFFFU</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac7e2d509703ff033a302b325aa664f6e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_UINT32   0xFFFFFFFFUL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a28a8006d7bca3b64235ca4d0cb39bf2b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_UINT64   0xFFFFFFFFFFFFFFFFULL</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a08c56fc189bfb1a6864a7b5d68433e7e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MAX_UINT8   0xFFU</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a29066dd6aaf6aa8fa21f3a88feb6da59"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MIN</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">a, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname">b </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td>   ((a) < (b) ? (a) : (b))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac3a2f334767728e9bc57512139e0bd61"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MIN_INT32   0x80000000L</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aaeb3e06c7119793239368c0fe74cda05"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MODULE_DEINIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">INIT</td><td>)</td> + <td>   INIT= 0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad2109677fa03720f6ab0df072c755529"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MODULE_INIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">INIT</td><td>)</td> + <td>   INIT= 1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ade9a83a9aab96cf50058801afdef4ace"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_MODULE_IS_INIT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">INIT</td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7cbc81d1fb0dcddb1cc88b59d50c2aa9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NTOHL</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<b>Value:</b><div class="fragment"><div class="line">((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \</div><div class="line"> (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L))</div></div><!-- fragment --> +</div> +</div> +<a class="anchor" id="a55fbcf7a453813fec69016916802de2c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_NTOHS</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<b>Value:</b><div class="fragment"><div class="line">(((((<span class="keywordtype">unsigned</span> short)(x)) >> 8) & 0xff) | \</div><div class="line"> ((((<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)(x)) & 0xff) << 8) )</div></div><!-- fragment --> +</div> +</div> +<a class="anchor" id="a92e2ad3a6b8c71818b6a08720fa84ba5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_SUCCESS   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/db/dcf/pal__macros_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,63 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_macros.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_macros.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../db/dcf/pal__macros_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef _PAL_MACROS_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define _PAL_MACROS_H</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include "<a class="code" href="../../da/dfe/pal__errors_8h.html">pal_errors.h</a>"</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment">// PAL success value</span></div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"> 27</a></span> <span class="preprocessor">#define PAL_SUCCESS 0</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment">// maximum integer types</span></div><div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a08c56fc189bfb1a6864a7b5d68433e7e"> 30</a></span> <span class="preprocessor">#define PAL_MAX_UINT8 0xFFU</span></div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#af8d58ab12b0f655fe922fc40b3e52ca2"> 31</a></span> <span class="preprocessor">#define PAL_MAX_UINT16 0xFFFFU</span></div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e"> 32</a></span> <span class="preprocessor">#define PAL_MAX_UINT32 0xFFFFFFFFUL</span></div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a6ee734c1fc41affa0926797e382fc8d4"> 33</a></span> <span class="preprocessor">#define PAL_MAX_INT32 0x7FFFFFFFL</span></div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ac3a2f334767728e9bc57512139e0bd61"> 34</a></span> <span class="preprocessor">#define PAL_MIN_INT32 0x80000000L</span></div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a28a8006d7bca3b64235ca4d0cb39bf2b"> 35</a></span> <span class="preprocessor">#define PAL_MAX_UINT64 0xFFFFFFFFFFFFFFFFULL</span></div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ada154fcb4b3ef9b641486f30de56c7b7"> 36</a></span> <span class="preprocessor">#define PAL_MAX_INT64 0x7FFFFFFFFFFFFFFFLL</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment">// useful macros</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a117c6ce53646b65b4cdcb5da01801675"> 40</a></span> <span class="preprocessor">#define PAL_MAX(a,b) ((a) > (b) ? (a) : (b))</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a29066dd6aaf6aa8fa21f3a88feb6da59"> 42</a></span> <span class="preprocessor">#define PAL_MIN(a,b) ((a) < (b) ? (a) : (b))</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a966411fe41e3830553bb1b8cf8baf730"> 44</a></span> <span class="preprocessor">#define PAL_DIVIDE_ROUND_UP(num, divider) (((num) + (divider) - 1) / (divider))</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> </div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="preprocessor">#if PAL_COMPILATION_ENDIANITY == 1</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="preprocessor">#define BIG__ENDIAN 1</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="preprocessor">#elif PAL_COMPILATION_ENDIANITY == 0</span></div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a1651594dc71abf466bddd0f6393edb8b"> 49</a></span> <span class="preprocessor">#define LITTLE__ENDIAN 1</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="preprocessor">#else </span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="preprocessor">#error neither BIG__ENDIAN nor LITTLE__ENDIAN defined, cannot compile</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment">// endianity macros</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="preprocessor">#ifdef LITTLE__ENDIAN</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a98390512a7c2732f1197b07acf03e226"> 57</a></span> <span class="preprocessor">#define PAL_HTONS(x) (((((unsigned short)(x)) >> 8) & 0xff) | \</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="preprocessor"> ((((unsigned short)(x)) & 0xff) << 8))</span></div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a55fbcf7a453813fec69016916802de2c"> 59</a></span> <span class="preprocessor">#define PAL_NTOHS(x) (((((unsigned short)(x)) >> 8) & 0xff) | \</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="preprocessor"> ((((unsigned short)(x)) & 0xff) << 8) )</span></div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a55b1a7d9f939231045521ec4a4817cff"> 61</a></span> <span class="preprocessor">#define PAL_HTONL(x) ((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="preprocessor"> (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L))</span></div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a7cbc81d1fb0dcddb1cc88b59d50c2aa9"> 63</a></span> <span class="preprocessor">#define PAL_NTOHL(x) ((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="preprocessor"> (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L))</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="preprocessor">#elif defined(BIG__ENDIAN)</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> </div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="preprocessor">#define PAL_HTONS(x) (x)</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="preprocessor">#define PAL_NTOHS(x) (x)</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="preprocessor">#define PAL_HTONL(x) (x)</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="preprocessor">#define PAL_NTOHL(x) (x)</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="preprocessor">#error neither BIG__ENDIAN nor LITTLE__ENDIAN defined, cannot compile</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> </div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ad989cc9220df56cd410590fc628e93b7"> 78</a></span> <span class="preprocessor">#define PAL_INVERSE_UINT16_BYTES( val ) \</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="preprocessor"> ( ((val) << 8) | (((val) & 0x0000FF00) >> 8))</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> </div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f"> 81</a></span> <span class="preprocessor">#define PAL_INVERSE_UINT32_BYTES( val ) \</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="preprocessor"> ( ((val) >> 24) | (((val) & 0x00FF0000) >> 8) | (((val) & 0x0000FF00) << 8) | (((val) & 0x000000FF) << 24) )</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ae376dc7d0682fb2fc8927897fb065c4c"> 84</a></span> <span class="preprocessor">#define PAL_INVERSE_UINT64_BYTES( val ) \</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="preprocessor"> ((PAL_INVERSE_UINT32_BYTES( ((val >> 16) >> 16)) &0xffffffff) | ((((uint64_t)PAL_INVERSE_UINT32_BYTES(val & 0xffffffff))<<16)<<16)) </span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> </div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <span class="comment">/* Set of Macros similar to the HTONS/L, NTOHS/L ones but converting to/from little endian instead of big endian*/</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="preprocessor">#ifdef LITTLE__ENDIAN </span></div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ad1c98870c5eeba8fe649345e371ef866"> 89</a></span> <span class="preprocessor">#define PAL_LITTLE_ENDIAN_TO_HOST_16BIT(x) (x)</span></div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#aa6229ece344478c07677c8b0436b1bb0"> 90</a></span> <span class="preprocessor">#define PAL_LITTLE_ENDIAN_TO_HOST_32BIT(x) (x)</span></div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a4ae1ca0100a3eee36eb95931cbec633e"> 91</a></span> <span class="preprocessor">#define PAL_LITTLE_ENDIAN_TO_HOST_64BIT(x) (x)</span></div><div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#a9bd4f76c3897b4338fe50a8d69830fe5"> 92</a></span> <span class="preprocessor">#define PAL_HOST_TO_LITTLE_ENDIAN_16BIT(x) (x)</span></div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ab01046a25df49d7fe1d85a8bf722975f"> 93</a></span> <span class="preprocessor">#define PAL_HOST_TO_LITTLE_ENDIAN_32BIT(x) (x)</span></div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#adc0a4752569188800a75e1601a7e11b5"> 94</a></span> <span class="preprocessor">#define PAL_HOST_TO_LITTLE_ENDIAN_64BIT(x) (x)</span></div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> </div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="preprocessor">#elif defined(BIG__ENDIAN)</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="preprocessor">#define PAL_LITTLE_ENDIAN_TO_HOST_16BIT(x) (PAL_INVERSE_UINT16_BYTES(((uint16_t)x)))</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> <span class="preprocessor">#define PAL_LITTLE_ENDIAN_TO_HOST_32BIT(x) (PAL_INVERSE_UINT32_BYTES(((uint32_t)x)))</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="preprocessor">#define PAL_LITTLE_ENDIAN_TO_HOST_64BIT(x) (PAL_INVERSE_UINT64_BYTES(((uint64_t)x)))</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="preprocessor">#define PAL_HOST_TO_LITTLE_ENDIAN_16BIT(x) (PAL_INVERSE_UINT16_BYTES(((uint16_t)x)))</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="preprocessor">#define PAL_HOST_TO_LITTLE_ENDIAN_32BIT(x) (PAL_INVERSE_UINT32_BYTES(((uint32_t)x)))</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="preprocessor">#define PAL_HOST_TO_LITTLE_ENDIAN_64BIT(x) (PAL_INVERSE_UINT64_BYTES(((uint64_t)x)))</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="preprocessor">#error neither BIG__ENDIAN nor LITTLE__ENDIAN defined, cannot compile</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> </div><div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ad2109677fa03720f6ab0df072c755529"> 110</a></span> <span class="preprocessor">#define PAL_MODULE_INIT(INIT) INIT= 1</span></div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#aaeb3e06c7119793239368c0fe74cda05"> 111</a></span> <span class="preprocessor">#define PAL_MODULE_DEINIT(INIT) INIT= 0</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> </div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="preprocessor">#ifdef DEBUG</span></div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="preprocessor">#include "<a class="code" href="../../d9/d16/pal_8h.html">pal.h</a>"</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="preprocessor">#define DEBUG_PRINT(ARGS...) PAL_PRINTF(ARGS)</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> </div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="preprocessor">#define DEBUG_PRINT(ARGS...) PAL_PRINTF(ARGS)</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="preprocessor">#define PAL_MODULE_IS_INIT(INIT) if(!INIT) return PAL_ERR_NOT_INITIALIZED;</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> </div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#ade9a83a9aab96cf50058801afdef4ace"> 122</a></span> <span class="preprocessor">#define PAL_MODULE_IS_INIT(INIT)</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="../../db/dcf/pal__macros_8h.html#aa1b662a1198e5729d6d0934a7efb02c4"> 124</a></span> <span class="preprocessor">#define DEBUG_PRINT(ARGS...)</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> </div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="preprocessor">#endif //DEBUG</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="preprocessor">#endif //_PAL_MACROS_H</span></div><div class="ttc" id="pal_8h_html"><div class="ttname"><a href="../../d9/d16/pal_8h.html">pal.h</a></div></div> +<div class="ttc" id="pal__errors_8h_html"><div class="ttname"><a href="../../da/dfe/pal__errors_8h.html">pal_errors.h</a></div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dc/d2c/structtimer_argument.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: timerArgument Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">timerArgument Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d9/d28/pal__rtos__test__utils_8h_source.html">pal_rtos_test_utils.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:a18bf51a6db87346257b34c24fefbd1b1"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1">ticksBeforeTimer</a></td></tr> +<tr class="separator:a18bf51a6db87346257b34c24fefbd1b1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afe9607363a4b6ae7b835ef129743ec08"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08">ticksInFunc1</a></td></tr> +<tr class="separator:afe9607363a4b6ae7b835ef129743ec08"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af9f23b828a589dfac13cad4cb6e7da34"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34">ticksInFunc2</a></td></tr> +<tr class="separator:af9f23b828a589dfac13cad4cb6e7da34"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="a18bf51a6db87346257b34c24fefbd1b1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t timerArgument::ticksBeforeTimer</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="afe9607363a4b6ae7b835ef129743ec08"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t timerArgument::ticksInFunc1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af9f23b828a589dfac13cad4cb6e7da34"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t timerArgument::ticksInFunc2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Test/Common/<a class="el" href="../../d9/d28/pal__rtos__test__utils_8h_source.html">pal_rtos_test_utils.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dc/d89/pal__plat__socket__lwip_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,557 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/FreeRTOS/Networking/LWIP/pal_plat_socket_lwip.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="../../dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="../../dir_352f9dac526e52874364d2b56bbb5ef5.html">FreeRTOS</a></li><li class="navelem"><a class="el" href="../../dir_1c5e63936b3e43504237da8820a7bc34.html">Networking</a></li><li class="navelem"><a class="el" href="../../dir_13f791b89962c34a017839eda04eb72e.html">LWIP</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_plat_socket_lwip.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "pal_common.h"</code><br /> +<code>#include "pal_plat_socket.h"</code><br /> +<code>#include "/tmp/mbedos/mbed-os/features/net/FEATURE_IPV4/lwip-interface/lwip/include/lwip/sockets.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:a1f9a42da4785a398dcc6778a265a088a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a1f9a42da4785a398dcc6778a265a088a">PAL_POSIX_ERROR_CODE</a>   (-1)</td></tr> +<tr class="separator:a1f9a42da4785a398dcc6778a265a088a"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a44fd223b3f72e54eb748620ed80c52e3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a44fd223b3f72e54eb748620ed80c52e3">pal_plat_sockets_init</a> (void *context)</td></tr> +<tr class="separator:a44fd223b3f72e54eb748620ed80c52e3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a990aa2947ac229e478e312d0e06393a7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a990aa2947ac229e478e312d0e06393a7">pal_plat_socket</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> domain, <a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> type, bool nonBlockingSocket, int interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a990aa2947ac229e478e312d0e06393a7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a76c4e2adf95702c4db8f3792ae373bf9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_getSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> optionName, void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *optionLength)</td></tr> +<tr class="separator:a76c4e2adf95702c4db8f3792ae373bf9"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a08ea05dacec7f7d9dc892dab0318542d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_setSocketOptions</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, int optionName, const void *optionValue, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> optionLength)</td></tr> +<tr class="separator:a08ea05dacec7f7d9dc892dab0318542d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a53a267fd8ed0b7a5cf988224e95bd47c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_bind</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *myAddress, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> addressLength)</td></tr> +<tr class="separator:a53a267fd8ed0b7a5cf988224e95bd47c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa869b5eddbf4eb6aebbbb587ece84aac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_receiveFrom</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, void *buffer, size_t length, <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *from, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> *fromLength, size_t *bytesReceived)</td></tr> +<tr class="separator:aa869b5eddbf4eb6aebbbb587ece84aac"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a17365747ed8d29df153a336da3942187"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a17365747ed8d29df153a336da3942187">pal_plat_sendTo</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socket, const void *buffer, size_t length, const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> *to, <a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> toLength, size_t *bytesSent)</td></tr> +<tr class="separator:a17365747ed8d29df153a336da3942187"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a071355a0ca4d4eece45f0ed85a9ab1da"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_close</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> *socket)</td></tr> +<tr class="separator:a071355a0ca4d4eece45f0ed85a9ab1da"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af36bf075867e5ed0be7479312469361f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#af36bf075867e5ed0be7479312469361f">pal_plat_getNumberOfNetInterfaces</a> (uint32_t *numInterfaces)</td></tr> +<tr class="separator:af36bf075867e5ed0be7479312469361f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6dc3b4c06e96b29068995809b98a935e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_getNetInterfaceInfo</a> (uint32_t interfaceNum, <a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> *interfaceInfo)</td></tr> +<tr class="separator:a6dc3b4c06e96b29068995809b98a935e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a770a9d5a04ea29ced40363a0c9769165"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/d89/pal__plat__socket__lwip_8cpp.html#a770a9d5a04ea29ced40363a0c9769165">pal_plat_socketMiniSelect</a> (const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> socketsToCheck[<a class="el" href="../../d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">PAL_NET_SOCKET_SELECT_MAX_SOCKETS</a>], unsigned int numberOfSockets, <a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> *timeout, palSocketStatus_t socketStatus, int *numberOfSocketsSet)</td></tr> +<tr class="separator:a770a9d5a04ea29ced40363a0c9769165"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="a1f9a42da4785a398dcc6778a265a088a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define PAL_POSIX_ERROR_CODE   (-1)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a53a267fd8ed0b7a5cf988224e95bd47c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_bind </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>myAddress</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>addressLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Bind a given socket to a local address. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to bind. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">myAddress</td><td>The address to bind to. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">addressLength</td><td>The length of the address passed in myAddress. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a071355a0ca4d4eece45f0ed85a9ab1da"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_close </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Close a network socket. NOTE: recieves palSocket_t* and not palSocket_t so that it can zero the socket to avoid re-use. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">socket</td><td>Release and zero socket pointed to by given pointer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a6dc3b4c06e96b29068995809b98a935e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getNetInterfaceInfo </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">palNetInterfaceInfo_t</a> * </td> + <td class="paramname"><em>interfaceInfo</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get information regarding the socket at the index/interface number given (this number is returned when registering the socket). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">interfaceNum</td><td>The number of the interface to get information for. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">interfaceInfo</td><td>The information for the given interface number. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="af36bf075867e5ed0be7479312469361f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getNumberOfNetInterfaces </td> + <td>(</td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>numInterfaces</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the number of current network interfaces (interfaces that have been registered through). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">numInterfaces</td><td>The number of interfaces after a successful call. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status as in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a76c4e2adf95702c4db8f3792ae373bf9"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_getSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">palSocketOptionName_t</a> </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket for which to get options. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">optionValue</td><td>The buffer holding the option value returned by the function. </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">optionLength</td><td>The size of the buffer provided for optionValue when calling the function. After the call, it contains the length of data actually written to the optionValue buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa869b5eddbf4eb6aebbbb587ece84aac"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_receiveFrom </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>from</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> * </td> + <td class="paramname"><em>fromLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesReceived</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Receive a payload from the given socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to receive from [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">buffer</td><td>The buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the buffer for the payload data. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">from</td><td>The address that sent the payload [optional - if not required pass NULL]. </td></tr> + <tr><td class="paramdir">[in,out]</td><td class="paramname">fromLength</td><td>The length of the 'from' address. When completed, this contains the amount of data actually written to the from address [optional - if not required pass NULL]. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesReceived</td><td>The actual amount of payload data received to the buffer. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a17365747ed8d29df153a336da3942187"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_sendTo </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>buffer</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>length</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">palSocketAddress_t</a> * </td> + <td class="paramname"><em>to</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>toLength</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>bytesSent</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Send a payload to the given address using the given socket. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket to use for sending the payload [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">buffer</td><td>The buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">length</td><td>The length of the buffer for the payload data. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">to</td><td>The address to which the payload should be sent. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">toLength</td><td>The length of the 'to' address. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">bytesSent</td><td>The actual amount of payload data sent. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a08ea05dacec7f7d9dc892dab0318542d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_setSocketOptions </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int </td> + <td class="paramname"><em>optionName</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const void * </td> + <td class="paramname"><em>optionValue</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">palSocketLength_t</a> </td> + <td class="paramname"><em>optionLength</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Set options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">socket</td><td>The socket for which to get options. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionName</td><td>The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionValue</td><td>The buffer holding the option value to set for the given option. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">optionLength</td><td>The size of the buffer provided for optionValue. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a990aa2947ac229e478e312d0e06393a7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socket </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">palSocketDomain_t</a> </td> + <td class="paramname"><em>domain</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">palSocketType_t</a> </td> + <td class="paramname"><em>type</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">bool </td> + <td class="paramname"><em>nonBlockingSocket</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int </td> + <td class="paramname"><em>interfaceNum</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> * </td> + <td class="paramname"><em>socket</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a770a9d5a04ea29ced40363a0c9769165"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_socketMiniSelect </td> + <td>(</td> + <td class="paramtype">const <a class="el" href="../../d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">palSocket_t</a> </td> + <td class="paramname"><em>socketsToCheck</em>[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">unsigned int </td> + <td class="paramname"><em>numberOfSockets</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_timeVal_t</a> * </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">palSocketStatus_t </td> + <td class="paramname"><em>socketStatus</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int * </td> + <td class="paramname"><em>numberOfSocketsSet</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a44fd223b3f72e54eb748620ed80c52e3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_plat_sockets_init </td> + <td>(</td> + <td class="paramtype">void * </td> + <td class="paramname"><em>context</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dc/da5/pal__socket__test__runner_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_socket_test_runner.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_socket_test_runner.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a7d7471d47d062a2bf20410044b712192"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dc/da5/pal__socket__test__runner_8c.html#a7d7471d47d062a2bf20410044b712192">TEST_GROUP_RUNNER</a> (<a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a>)</td></tr> +<tr class="separator:a7d7471d47d062a2bf20410044b712192"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a7d7471d47d062a2bf20410044b712192"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_socket</a> </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dd/d30/pal__all__test__main__mbed_o_s_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,203 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_all_test_main_mbedOS.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_all_test_main_mbedOS.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "mbed.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a59390bc31498889208cfda7dea51bffa"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a59390bc31498889208cfda7dea51bffa">TEST_pal_update_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a59390bc31498889208cfda7dea51bffa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc">TEST_pal_rtos_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab">TEST_pal_socket_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a2393bacb0eb76d2dd1b0c200a8769cab"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:adc9a94aa19f52027390d7b0256a6693c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#adc9a94aa19f52027390d7b0256a6693c">TEST_pal_all_GROUPS_RUNNER</a> (void)</td></tr> +<tr class="separator:adc9a94aa19f52027390d7b0256a6693c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0f2228420376f4db7e1274f2b41667c"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">main</a> (int argc, const char *argv[])</td></tr> +<tr class="separator:ac0f2228420376f4db7e1274f2b41667c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ac0f2228420376f4db7e1274f2b41667c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[] </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="adc9a94aa19f52027390d7b0256a6693c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_all_GROUPS_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9e9aa39842df82b3f5086f3215cc74fc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_rtos_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2393bacb0eb76d2dd1b0c200a8769cab"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_socket_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a59390bc31498889208cfda7dea51bffa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_update_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dd/df6/pal__rtos__test__runner_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_rtos_test_runner.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos_test_runner.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "unity.h"</code><br /> +<code>#include "unity_fixture.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ace47ba1b1706d7b654cdf18e7008b174"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df6/pal__rtos__test__runner_8c.html#ace47ba1b1706d7b654cdf18e7008b174">TEST_GROUP_RUNNER</a> (pal_rtos)</td></tr> +<tr class="separator:ace47ba1b1706d7b654cdf18e7008b174"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="ace47ba1b1706d7b654cdf18e7008b174"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">TEST_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">pal_rtos </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dd/df9/pal__update_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,586 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_update.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#nested-classes">Data Structures</a> | +<a href="#typedef-members">Typedefs</a> | +<a href="#enum-members">Enumerations</a> | +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_update.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../db/dcf/pal__macros_8h_source.html">pal_macros.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d6/dc2/pal__types_8h_source.html">pal_types.h</a>"</code><br /> +</div> +<p><a href="../../dd/df9/pal__update_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a> +Data Structures</h2></td></tr> +<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d0d/struct__pal_image_header_deails__t.html">_palImageHeaderDeails_t</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> +Typedefs</h2></td></tr> +<tr class="memitem:a4a9214b57530228af5cfba5ec05b406b"><td class="memItemLeft" align="right" valign="top">typedef uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a></td></tr> +<tr class="separator:a4a9214b57530228af5cfba5ec05b406b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a224fe03733bd8a2e5476357be9b74ee6"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="../../df/d0d/struct__pal_image_header_deails__t.html">_palImageHeaderDeails_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a></td></tr> +<tr class="separator:a224fe03733bd8a2e5476357be9b74ee6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a73bbb720e1547d0d02b2ba607a35091d"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851">_palImagePlatformData_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a></td></tr> +<tr class="separator:a73bbb720e1547d0d02b2ba607a35091d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a60ae872dfe6cee8af957d52853927db0"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2">_palImageEvents_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a60ae872dfe6cee8af957d52853927db0">palImageEvents_t</a></td></tr> +<tr class="separator:a60ae872dfe6cee8af957d52853927db0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9ac73ac0e2421507424182ebaffc8b21"><td class="memItemLeft" align="right" valign="top">typedef void(* </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a>) (<a class="el" href="../../dd/df9/pal__update_8h.html#a60ae872dfe6cee8af957d52853927db0">palImageEvents_t</a> event)</td></tr> +<tr class="separator:a9ac73ac0e2421507424182ebaffc8b21"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a> +Enumerations</h2></td></tr> +<tr class="memitem:a88449bb053973b58f147e23d07fab851"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851">_palImagePlatformData_t</a> { <a class="el" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851abdf5bd423ad35c4b7128f17681a5bdc4">PAL_IMAGE_DATA_FIRST</a> = 0, +<a class="el" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851aabf363152f1b7b09fb70ea9ba2576b5b">PAL_IMAGE_DATA_HASH</a> = PAL_IMAGE_DATA_FIRST, +<a class="el" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851ac738b87b7c6580f82cc356a1a3ec157b">PAL_IMAGE_DATA_LAST</a> + }</td></tr> +<tr class="separator:a88449bb053973b58f147e23d07fab851"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a878db675a901d36499a7d3d75ed16aa2"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2">_palImageEvents_t</a> { <br /> +  <a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a59dc00e875909a0b4e39d8297460c0fd">PAL_IMAGE_EVENT_FIRST</a> = -1, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a24c4f23ccf68a46903002eec2f69c5ca">PAL_IMAGE_EVENT_ERROR</a> = PAL_IMAGE_EVENT_FIRST, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a98b853c25620d48d33395fa50c52ccf5">PAL_IMAGE_EVENT_INIT</a>, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a7aa6e9bb937575c51a10d6d268f12b3e">PAL_IMAGE_EVENT_PREPARE</a>, +<br /> +  <a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a622f3f5844f4343d2f4d64dd6b486ac2">PAL_IMAGE_EVENT_WRITE</a>, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a3cf133970b3fe50ed6bf4e722ee562d6">PAL_IMAGE_EVENT_FINALIZE</a>, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2aaa4b69a758b8f509c970c30ac3bd5af5">PAL_IMAGE_EVENT_READTOBUFFER</a>, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a598cdce57dc311dcf64fbff4b6fd2f42">PAL_IMAGE_EVENT_ACTIVATE</a>, +<br /> +  <a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a27e851d5c26a2c8ffcf71a0718adb5a7">PAL_IMAGE_EVENT_GETACTIVEHASH</a>, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a29dca8fcafbb08ed62618706e0f30e12">PAL_IMAGE_EVENT_GETACTIVEVERSION</a>, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a4c44e52a122746f76d406c987cdec6c1">PAL_IMAGE_EVENT_WRITEDATATOMEMORY</a>, +<a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a8defc31ad167e60ebd65d8659d04cf2b">PAL_IMAGE_EVENT_LAST</a> +<br /> + }</td></tr> +<tr class="separator:a878db675a901d36499a7d3d75ed16aa2"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a2e85d0291ef07a84780291b67da129b5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a2e85d0291ef07a84780291b67da129b5">pal_imageInitAPI</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> CBfunction)</td></tr> +<tr class="separator:a2e85d0291ef07a84780291b67da129b5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a399c2a8dbd117abf5cd4fa69771f98a0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a399c2a8dbd117abf5cd4fa69771f98a0">pal_imageDeInit</a> (void)</td></tr> +<tr class="separator:a399c2a8dbd117abf5cd4fa69771f98a0"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a4efbe7dd54c89cc87c80e94aa07a9988"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a4efbe7dd54c89cc87c80e94aa07a9988">pal_imagePrepare</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, <a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> *headerDetails)</td></tr> +<tr class="separator:a4efbe7dd54c89cc87c80e94aa07a9988"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a8b38046695a7124198787f01250d49a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a8b38046695a7124198787f01250d49a3">pal_imageWrite</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *chunk)</td></tr> +<tr class="separator:a8b38046695a7124198787f01250d49a3"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a175083cffce66b96cd608a6cd10e9c61"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a175083cffce66b96cd608a6cd10e9c61">pal_imageFinalize</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId)</td></tr> +<tr class="separator:a175083cffce66b96cd608a6cd10e9c61"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a37805c23a8066068318031f2d90c2da4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a37805c23a8066068318031f2d90c2da4">pal_imageGetDirectMemoryAccess</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, void **imagePtr, size_t *imageSizeInBytes)</td></tr> +<tr class="separator:a37805c23a8066068318031f2d90c2da4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aac9ba34b8a1600d97b2b019b55e31a8d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#aac9ba34b8a1600d97b2b019b55e31a8d">pal_imageReadToBuffer</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId, size_t offset, <a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *chunk)</td></tr> +<tr class="separator:aac9ba34b8a1600d97b2b019b55e31a8d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a31b9ead19037301ac9df1ccd6260262e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a31b9ead19037301ac9df1ccd6260262e">pal_imageActivate</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> imageId)</td></tr> +<tr class="separator:a31b9ead19037301ac9df1ccd6260262e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a278dcb55bfa1196ffe5713fa938d5d6e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a278dcb55bfa1196ffe5713fa938d5d6e">pal_imageGetActiveHash</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *hash)</td></tr> +<tr class="separator:a278dcb55bfa1196ffe5713fa938d5d6e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a72cd92d9d3eb0166f83d7e3c3e66f64c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#a72cd92d9d3eb0166f83d7e3c3e66f64c">pal_imageGetActiveVersion</a> (<a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> *version)</td></tr> +<tr class="separator:a72cd92d9d3eb0166f83d7e3c3e66f64c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa852dd1acee23c14859d9d4f94e09ce6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../dd/df9/pal__update_8h.html#aa852dd1acee23c14859d9d4f94e09ce6">pal_imageWriteDataToMemory</a> (<a class="el" href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a> dataId, const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const dataBuffer)</td></tr> +<tr class="separator:aa852dd1acee23c14859d9d4f94e09ce6"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Typedef Documentation</h2> +<a class="anchor" id="a60ae872dfe6cee8af957d52853927db0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef enum <a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2">_palImageEvents_t</a> <a class="el" href="../../dd/df9/pal__update_8h.html#a60ae872dfe6cee8af957d52853927db0">palImageEvents_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a224fe03733bd8a2e5476357be9b74ee6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef struct <a class="el" href="../../df/d0d/struct__pal_image_header_deails__t.html">_palImageHeaderDeails_t</a> <a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a4a9214b57530228af5cfba5ec05b406b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef uint32_t <a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a73bbb720e1547d0d02b2ba607a35091d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef enum <a class="el" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851">_palImagePlatformData_t</a> <a class="el" href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9ac73ac0e2421507424182ebaffc8b21"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">typedef void(* palImageSignalEvent_t) (<a class="el" href="../../dd/df9/pal__update_8h.html#a60ae872dfe6cee8af957d52853927db0">palImageEvents_t</a> event)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Enumeration Type Documentation</h2> +<a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2">_palImageEvents_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a59dc00e875909a0b4e39d8297460c0fd"></a>PAL_IMAGE_EVENT_FIRST </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a24c4f23ccf68a46903002eec2f69c5ca"></a>PAL_IMAGE_EVENT_ERROR </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a98b853c25620d48d33395fa50c52ccf5"></a>PAL_IMAGE_EVENT_INIT </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a7aa6e9bb937575c51a10d6d268f12b3e"></a>PAL_IMAGE_EVENT_PREPARE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a622f3f5844f4343d2f4d64dd6b486ac2"></a>PAL_IMAGE_EVENT_WRITE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a3cf133970b3fe50ed6bf4e722ee562d6"></a>PAL_IMAGE_EVENT_FINALIZE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2aaa4b69a758b8f509c970c30ac3bd5af5"></a>PAL_IMAGE_EVENT_READTOBUFFER </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a598cdce57dc311dcf64fbff4b6fd2f42"></a>PAL_IMAGE_EVENT_ACTIVATE </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a27e851d5c26a2c8ffcf71a0718adb5a7"></a>PAL_IMAGE_EVENT_GETACTIVEHASH </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a29dca8fcafbb08ed62618706e0f30e12"></a>PAL_IMAGE_EVENT_GETACTIVEVERSION </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a4c44e52a122746f76d406c987cdec6c1"></a>PAL_IMAGE_EVENT_WRITEDATATOMEMORY </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a878db675a901d36499a7d3d75ed16aa2a8defc31ad167e60ebd65d8659d04cf2b"></a>PAL_IMAGE_EVENT_LAST </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<a class="anchor" id="a88449bb053973b58f147e23d07fab851"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">enum <a class="el" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851">_palImagePlatformData_t</a></td> + </tr> + </table> +</div><div class="memdoc"> +<table class="fieldtable"> +<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="a88449bb053973b58f147e23d07fab851abdf5bd423ad35c4b7128f17681a5bdc4"></a>PAL_IMAGE_DATA_FIRST </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a88449bb053973b58f147e23d07fab851aabf363152f1b7b09fb70ea9ba2576b5b"></a>PAL_IMAGE_DATA_HASH </td><td class="fielddoc"> +</td></tr> +<tr><td class="fieldname"><a class="anchor" id="a88449bb053973b58f147e23d07fab851ac738b87b7c6580f82cc356a1a3ec157b"></a>PAL_IMAGE_DATA_LAST </td><td class="fielddoc"> +</td></tr> +</table> + +</div> +</div> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a31b9ead19037301ac9df1ccd6260262e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageActivate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Sets image imageId to be the active image (after device reset). the function must call g_palUpdateServiceCBfunc before after finished</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a399c2a8dbd117abf5cd4fa69771f98a0"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageDeInit </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>clearing all the resources used by the pal_update APIs </p><dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a175083cffce66b96cd608a6cd10e9c61"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageFinalize </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Flushes the image data and sets the version of imageId to imageVersion. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">imageVersion</td><td>a struct containing the version as a buffer and the size </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a278dcb55bfa1196ffe5713fa938d5d6e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageGetActiveHash </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>hash</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the hash value of the active image to hash buffer with max size hash maxBufferLength and sets to hash bufferLength to the hash size. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">hash</td><td>struct containing the hash and actual size of hash read </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a72cd92d9d3eb0166f83d7e3c3e66f64c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageGetActiveVersion </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>version</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Retrieve the version of the active image to version buffer with size set to version bufferLength. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">version</td><td>struct containing the version and actual size of version read </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a37805c23a8066068318031f2d90c2da4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageGetDirectMemoryAccess </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void ** </td> + <td class="paramname"><em>imagePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t * </td> + <td class="paramname"><em>imageSizeInBytes</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Verifies whether image imageId is readable and sets imagePtr to point to the beginning of start of the image in the memory and imageSizeInBytes to the image size. In case of failure sets imagePtr to NULL and returns relevant palStatus_t error </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imagePtr</td><td>pointer to the start of the image </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">imageSizeInBytes</td><td>the size of the image </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a2e85d0291ef07a84780291b67da129b5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageInitAPI </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> </td> + <td class="paramname"><em>CBfunction</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>setting the callback function that will be called before the end of each API (except imageGetDirectMemAccess)</p> +<p>WARNING: please do not change this function! this function loads a call back function received from the upper layer (service). the call back should be called at the end of each function (except pal_plat_imageGetDirectMemAccess) the call back receives the event type that just happened defined by the ENUM palImageEvents_t.</p> +<p>if you will not call the call back at the end the service behaver will be undefined the function must call g_palUpdateServiceCBfunc before after finished</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">CBfunction</td><td>pointer to the call back function </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a4efbe7dd54c89cc87c80e94aa07a9988"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imagePrepare </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a> * </td> + <td class="paramname"><em>headerDetails</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Prepare to write image with id imageId and size imageSize in suitable memory region (Space availability will be verified and reserved). the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">imageSize</td><td>the size of the image </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aac9ba34b8a1600d97b2b019b55e31a8d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageReadToBuffer </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Reads max of chunk maxBufferLength bytes from image imageId with relative offset offset and stores it in chunk buffer. And sets chunk bufferLength value to the actual number of bytes read. Note: Please use this API in case image is not directly accessible via imageGetDirectMemAccess function.</p> +<p>the function must call g_palUpdateServiceCBfunc before after finished</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>offset to start read from </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">chunk</td><td>struct containing the data and actual bytes read </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="a8b38046695a7124198787f01250d49a3"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageWrite </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a> </td> + <td class="paramname"><em>imageId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>offset</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> * </td> + <td class="paramname"><em>chunk</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Writes the data in chunk buffer with size chunk bufferLength in the location of imageId adding the relative offset. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">imageId</td><td>the image id </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">offset</td><td>the offset to write the data into </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">pointer</td><td>to struct containing the data and the data length to write </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aa852dd1acee23c14859d9d4f94e09ce6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_imageWriteDataToMemory </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a> </td> + <td class="paramname"><em>dataId</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const <a class="el" href="../../d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">palConstBuffer_t</a> *const </td> + <td class="paramname"><em>dataBuffer</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Writing the data of dataId stored in dataBuffer to memory accessible to bootloader. Currently only has is available. the function must call g_palUpdateServiceCBfunc before after finished </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">dataId</td><td>one of the members of palImagePlatformData_t enum </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">dataBuffer</td><td>struct containing the data and actual bytes to be written </td></tr> + </table> + </dd> +</dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dd/df9/pal__update_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,103 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/pal_update.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_update.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../dd/df9/pal__update_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#ifndef SOURCE_PAL_IMPL_SERVICES_API_PAL_UPDATE_H_</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define SOURCE_PAL_IMPL_SERVICES_API_PAL_UPDATE_H_</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "<a class="code" href="../../db/dcf/pal__macros_8h.html">pal_macros.h</a>"</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include "<a class="code" href="../../d6/dc2/pal__types_8h.html">pal_types.h</a>"</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b"> 31</a></span> <span class="keyword">typedef</span> uint32_t <a class="code" href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a>;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="../../df/d0d/struct__pal_image_header_deails__t.html"> 33</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html">_palImageHeaderDeails_t</a></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> {</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="../../df/d0d/struct__pal_image_header_deails__t.html#a5fcb0398af2a70c3e4fc9fa64afb77ba"> 35</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html#a5fcb0398af2a70c3e4fc9fa64afb77ba">imageSize</a>;</div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="../../df/d0d/struct__pal_image_header_deails__t.html#afee39a7c86a46bf1f9de53284380869e"> 36</a></span>  <a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a> <a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html#afee39a7c86a46bf1f9de53284380869e">hash</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="../../df/d0d/struct__pal_image_header_deails__t.html#a734411a639c41d6dc4b4252a006b134f"> 37</a></span>  <a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a> <a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html#a734411a639c41d6dc4b4252a006b134f">version</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> }<a class="code" href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851"> 41</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851">_palImagePlatformData_t</a></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> {</div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851abdf5bd423ad35c4b7128f17681a5bdc4"> 43</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851abdf5bd423ad35c4b7128f17681a5bdc4">PAL_IMAGE_DATA_FIRST</a> = 0,</div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851aabf363152f1b7b09fb70ea9ba2576b5b"> 44</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851aabf363152f1b7b09fb70ea9ba2576b5b">PAL_IMAGE_DATA_HASH</a> = <a class="code" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851abdf5bd423ad35c4b7128f17681a5bdc4">PAL_IMAGE_DATA_FIRST</a>,</div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851ac738b87b7c6580f82cc356a1a3ec157b"> 45</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851ac738b87b7c6580f82cc356a1a3ec157b">PAL_IMAGE_DATA_LAST</a></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> }<a class="code" href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a>;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2"> 48</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2">_palImageEvents_t</a></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> {</div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a59dc00e875909a0b4e39d8297460c0fd"> 50</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a59dc00e875909a0b4e39d8297460c0fd">PAL_IMAGE_EVENT_FIRST</a> = -1,</div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a24c4f23ccf68a46903002eec2f69c5ca"> 51</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a24c4f23ccf68a46903002eec2f69c5ca">PAL_IMAGE_EVENT_ERROR</a> = <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a59dc00e875909a0b4e39d8297460c0fd">PAL_IMAGE_EVENT_FIRST</a>,</div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a98b853c25620d48d33395fa50c52ccf5"> 52</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a98b853c25620d48d33395fa50c52ccf5">PAL_IMAGE_EVENT_INIT</a> ,</div><div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a7aa6e9bb937575c51a10d6d268f12b3e"> 53</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a7aa6e9bb937575c51a10d6d268f12b3e">PAL_IMAGE_EVENT_PREPARE</a>,</div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a622f3f5844f4343d2f4d64dd6b486ac2"> 54</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a622f3f5844f4343d2f4d64dd6b486ac2">PAL_IMAGE_EVENT_WRITE</a>,</div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a3cf133970b3fe50ed6bf4e722ee562d6"> 55</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a3cf133970b3fe50ed6bf4e722ee562d6">PAL_IMAGE_EVENT_FINALIZE</a>,</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2aaa4b69a758b8f509c970c30ac3bd5af5"> 56</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2aaa4b69a758b8f509c970c30ac3bd5af5">PAL_IMAGE_EVENT_READTOBUFFER</a>,</div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a598cdce57dc311dcf64fbff4b6fd2f42"> 57</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a598cdce57dc311dcf64fbff4b6fd2f42">PAL_IMAGE_EVENT_ACTIVATE</a>,</div><div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a27e851d5c26a2c8ffcf71a0718adb5a7"> 58</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a27e851d5c26a2c8ffcf71a0718adb5a7">PAL_IMAGE_EVENT_GETACTIVEHASH</a>,</div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a29dca8fcafbb08ed62618706e0f30e12"> 59</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a29dca8fcafbb08ed62618706e0f30e12">PAL_IMAGE_EVENT_GETACTIVEVERSION</a>,</div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a4c44e52a122746f76d406c987cdec6c1"> 60</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a4c44e52a122746f76d406c987cdec6c1">PAL_IMAGE_EVENT_WRITEDATATOMEMORY</a>,</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a8defc31ad167e60ebd65d8659d04cf2b"> 61</a></span>  <a class="code" href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a8defc31ad167e60ebd65d8659d04cf2b">PAL_IMAGE_EVENT_LAST</a></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> } <a class="code" href="../../dd/df9/pal__update_8h.html#a60ae872dfe6cee8af957d52853927db0">palImageEvents_t</a>;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21"> 64</a></span> <span class="keyword">typedef</span> void (*<a class="code" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a>)( palImageEvents_t event);</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> </div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a2e85d0291ef07a84780291b67da129b5">pal_imageInitAPI</a>(<a class="code" href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a> CBfunction);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> </div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a399c2a8dbd117abf5cd4fa69771f98a0">pal_imageDeInit</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> </div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a4efbe7dd54c89cc87c80e94aa07a9988">pal_imagePrepare</a>(palImageId_t imageId, <a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html">palImageHeaderDeails_t</a>* headerDetails);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a8b38046695a7124198787f01250d49a3">pal_imageWrite</a> (palImageId_t imageId, <span class="keywordtype">size_t</span> offset, <a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html">palConstBuffer_t</a> *chunk);</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> </div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> </div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a175083cffce66b96cd608a6cd10e9c61">pal_imageFinalize</a>(palImageId_t imageId);</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> </div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> </div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a37805c23a8066068318031f2d90c2da4">pal_imageGetDirectMemoryAccess</a>(palImageId_t imageId, <span class="keywordtype">void</span>** imagePtr, <span class="keywordtype">size_t</span> *imageSizeInBytes);</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#aac9ba34b8a1600d97b2b019b55e31a8d">pal_imageReadToBuffer</a>(palImageId_t imageId, <span class="keywordtype">size_t</span> offset, <a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a>* chunk);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a31b9ead19037301ac9df1ccd6260262e">pal_imageActivate</a>(palImageId_t imageId);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a278dcb55bfa1196ffe5713fa938d5d6e">pal_imageGetActiveHash</a>(<a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a>* <a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html#afee39a7c86a46bf1f9de53284380869e">hash</a>);</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#a72cd92d9d3eb0166f83d7e3c3e66f64c">pal_imageGetActiveVersion</a>(<a class="code" href="../../d8/d19/struct__pal_buffer__t.html">palBuffer_t</a>* <a class="code" href="../../df/d0d/struct__pal_image_header_deails__t.html#a734411a639c41d6dc4b4252a006b134f">version</a>);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <a class="code" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> <a class="code" href="../../dd/df9/pal__update_8h.html#aa852dd1acee23c14859d9d4f94e09ce6">pal_imageWriteDataToMemory</a>(palImagePlatformData_t dataId, <span class="keyword">const</span> <a class="code" href="../../d2/dab/struct__pal_const_buffer__t.html">palConstBuffer_t</a>* <span class="keyword">const</span> dataBuffer);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="preprocessor">#endif </span><span class="comment">/* SOURCE_PAL_IMPL_SERVICES_API_PAL_UPDATE_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="pal__update_8h_html_a399c2a8dbd117abf5cd4fa69771f98a0"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a399c2a8dbd117abf5cd4fa69771f98a0">pal_imageDeInit</a></div><div class="ttdeci">palStatus_t pal_imageDeInit(void)</div><div class="ttdef"><b>Definition:</b> pal_update.c:34</div></div> +<div class="ttc" id="struct__pal_buffer__t_html"><div class="ttname"><a href="../../d8/d19/struct__pal_buffer__t.html">_palBuffer_t</a></div><div class="ttdef"><b>Definition:</b> pal_types.h:34</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a98b853c25620d48d33395fa50c52ccf5"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a98b853c25620d48d33395fa50c52ccf5">PAL_IMAGE_EVENT_INIT</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:52</div></div> +<div class="ttc" id="struct__pal_image_header_deails__t_html_a5fcb0398af2a70c3e4fc9fa64afb77ba"><div class="ttname"><a href="../../df/d0d/struct__pal_image_header_deails__t.html#a5fcb0398af2a70c3e4fc9fa64afb77ba">_palImageHeaderDeails_t::imageSize</a></div><div class="ttdeci">size_t imageSize</div><div class="ttdef"><b>Definition:</b> pal_update.h:35</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a24c4f23ccf68a46903002eec2f69c5ca"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a24c4f23ccf68a46903002eec2f69c5ca">PAL_IMAGE_EVENT_ERROR</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:51</div></div> +<div class="ttc" id="pal__update_8h_html_aa852dd1acee23c14859d9d4f94e09ce6"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#aa852dd1acee23c14859d9d4f94e09ce6">pal_imageWriteDataToMemory</a></div><div class="ttdeci">palStatus_t pal_imageWriteDataToMemory(palImagePlatformData_t dataId, const palConstBuffer_t *const dataBuffer)</div><div class="ttdef"><b>Definition:</b> pal_update.c:111</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a29dca8fcafbb08ed62618706e0f30e12"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a29dca8fcafbb08ed62618706e0f30e12">PAL_IMAGE_EVENT_GETACTIVEVERSION</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:59</div></div> +<div class="ttc" id="pal__update_8h_html_a8b38046695a7124198787f01250d49a3"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a8b38046695a7124198787f01250d49a3">pal_imageWrite</a></div><div class="ttdeci">palStatus_t pal_imageWrite(palImageId_t imageId, size_t offset, palConstBuffer_t *chunk)</div><div class="ttdef"><b>Definition:</b> pal_update.c:54</div></div> +<div class="ttc" id="pal__update_8h_html_a37805c23a8066068318031f2d90c2da4"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a37805c23a8066068318031f2d90c2da4">pal_imageGetDirectMemoryAccess</a></div><div class="ttdeci">palStatus_t pal_imageGetDirectMemoryAccess(palImageId_t imageId, void **imagePtr, size_t *imageSizeInBytes)</div><div class="ttdef"><b>Definition:</b> pal_update.c:70</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2aaa4b69a758b8f509c970c30ac3bd5af5"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2aaa4b69a758b8f509c970c30ac3bd5af5">PAL_IMAGE_EVENT_READTOBUFFER</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:56</div></div> +<div class="ttc" id="struct__pal_image_header_deails__t_html"><div class="ttname"><a href="../../df/d0d/struct__pal_image_header_deails__t.html">_palImageHeaderDeails_t</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:33</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a27e851d5c26a2c8ffcf71a0718adb5a7"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a27e851d5c26a2c8ffcf71a0718adb5a7">PAL_IMAGE_EVENT_GETACTIVEHASH</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:58</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a8defc31ad167e60ebd65d8659d04cf2b"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a8defc31ad167e60ebd65d8659d04cf2b">PAL_IMAGE_EVENT_LAST</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:61</div></div> +<div class="ttc" id="pal__update_8h_html_a88449bb053973b58f147e23d07fab851"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851">_palImagePlatformData_t</a></div><div class="ttdeci">_palImagePlatformData_t</div><div class="ttdef"><b>Definition:</b> pal_update.h:41</div></div> +<div class="ttc" id="pal__update_8h_html_a4efbe7dd54c89cc87c80e94aa07a9988"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a4efbe7dd54c89cc87c80e94aa07a9988">pal_imagePrepare</a></div><div class="ttdeci">palStatus_t pal_imagePrepare(palImageId_t imageId, palImageHeaderDeails_t *headerDetails)</div><div class="ttdef"><b>Definition:</b> pal_update.c:44</div></div> +<div class="ttc" id="pal__update_8h_html_a31b9ead19037301ac9df1ccd6260262e"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a31b9ead19037301ac9df1ccd6260262e">pal_imageActivate</a></div><div class="ttdeci">palStatus_t pal_imageActivate(palImageId_t imageId)</div><div class="ttdef"><b>Definition:</b> pal_update.c:87</div></div> +<div class="ttc" id="pal__update_8h_html_a224fe03733bd8a2e5476357be9b74ee6"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a224fe03733bd8a2e5476357be9b74ee6">palImageHeaderDeails_t</a></div><div class="ttdeci">struct _palImageHeaderDeails_t palImageHeaderDeails_t</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a59dc00e875909a0b4e39d8297460c0fd"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a59dc00e875909a0b4e39d8297460c0fd">PAL_IMAGE_EVENT_FIRST</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:50</div></div> +<div class="ttc" id="pal__update_8h_html_aac9ba34b8a1600d97b2b019b55e31a8d"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#aac9ba34b8a1600d97b2b019b55e31a8d">pal_imageReadToBuffer</a></div><div class="ttdeci">palStatus_t pal_imageReadToBuffer(palImageId_t imageId, size_t offset, palBuffer_t *chunk)</div><div class="ttdef"><b>Definition:</b> pal_update.c:78</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a598cdce57dc311dcf64fbff4b6fd2f42"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a598cdce57dc311dcf64fbff4b6fd2f42">PAL_IMAGE_EVENT_ACTIVATE</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:57</div></div> +<div class="ttc" id="pal__update_8h_html_a88449bb053973b58f147e23d07fab851ac738b87b7c6580f82cc356a1a3ec157b"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851ac738b87b7c6580f82cc356a1a3ec157b">PAL_IMAGE_DATA_LAST</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:45</div></div> +<div class="ttc" id="struct__pal_const_buffer__t_html"><div class="ttname"><a href="../../d2/dab/struct__pal_const_buffer__t.html">_palConstBuffer_t</a></div><div class="ttdef"><b>Definition:</b> pal_types.h:41</div></div> +<div class="ttc" id="pal__update_8h_html_a2e85d0291ef07a84780291b67da129b5"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a2e85d0291ef07a84780291b67da129b5">pal_imageInitAPI</a></div><div class="ttdeci">palStatus_t pal_imageInitAPI(palImageSignalEvent_t CBfunction)</div><div class="ttdef"><b>Definition:</b> pal_update.c:26</div></div> +<div class="ttc" id="struct__pal_image_header_deails__t_html_a734411a639c41d6dc4b4252a006b134f"><div class="ttname"><a href="../../df/d0d/struct__pal_image_header_deails__t.html#a734411a639c41d6dc4b4252a006b134f">_palImageHeaderDeails_t::version</a></div><div class="ttdeci">palBuffer_t version</div><div class="ttdef"><b>Definition:</b> pal_update.h:37</div></div> +<div class="ttc" id="pal__update_8h_html_a9ac73ac0e2421507424182ebaffc8b21"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a9ac73ac0e2421507424182ebaffc8b21">palImageSignalEvent_t</a></div><div class="ttdeci">void(* palImageSignalEvent_t)(palImageEvents_t event)</div><div class="ttdef"><b>Definition:</b> pal_update.h:64</div></div> +<div class="ttc" id="pal__types_8h_html"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html">pal_types.h</a></div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a3cf133970b3fe50ed6bf4e722ee562d6"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a3cf133970b3fe50ed6bf4e722ee562d6">PAL_IMAGE_EVENT_FINALIZE</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:55</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2">_palImageEvents_t</a></div><div class="ttdeci">_palImageEvents_t</div><div class="ttdef"><b>Definition:</b> pal_update.h:48</div></div> +<div class="ttc" id="pal__update_8h_html_a4a9214b57530228af5cfba5ec05b406b"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a4a9214b57530228af5cfba5ec05b406b">palImageId_t</a></div><div class="ttdeci">uint32_t palImageId_t</div><div class="ttdef"><b>Definition:</b> pal_update.h:31</div></div> +<div class="ttc" id="pal__macros_8h_html"><div class="ttname"><a href="../../db/dcf/pal__macros_8h.html">pal_macros.h</a></div></div> +<div class="ttc" id="pal__update_8h_html_a73bbb720e1547d0d02b2ba607a35091d"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a73bbb720e1547d0d02b2ba607a35091d">palImagePlatformData_t</a></div><div class="ttdeci">enum _palImagePlatformData_t palImagePlatformData_t</div></div> +<div class="ttc" id="pal__update_8h_html_a88449bb053973b58f147e23d07fab851abdf5bd423ad35c4b7128f17681a5bdc4"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851abdf5bd423ad35c4b7128f17681a5bdc4">PAL_IMAGE_DATA_FIRST</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:43</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a622f3f5844f4343d2f4d64dd6b486ac2"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a622f3f5844f4343d2f4d64dd6b486ac2">PAL_IMAGE_EVENT_WRITE</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:54</div></div> +<div class="ttc" id="struct__pal_image_header_deails__t_html_afee39a7c86a46bf1f9de53284380869e"><div class="ttname"><a href="../../df/d0d/struct__pal_image_header_deails__t.html#afee39a7c86a46bf1f9de53284380869e">_palImageHeaderDeails_t::hash</a></div><div class="ttdeci">palBuffer_t hash</div><div class="ttdef"><b>Definition:</b> pal_update.h:36</div></div> +<div class="ttc" id="pal__update_8h_html_a88449bb053973b58f147e23d07fab851aabf363152f1b7b09fb70ea9ba2576b5b"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a88449bb053973b58f147e23d07fab851aabf363152f1b7b09fb70ea9ba2576b5b">PAL_IMAGE_DATA_HASH</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:44</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a4c44e52a122746f76d406c987cdec6c1"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a4c44e52a122746f76d406c987cdec6c1">PAL_IMAGE_EVENT_WRITEDATATOMEMORY</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:60</div></div> +<div class="ttc" id="pal__update_8h_html_a278dcb55bfa1196ffe5713fa938d5d6e"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a278dcb55bfa1196ffe5713fa938d5d6e">pal_imageGetActiveHash</a></div><div class="ttdeci">palStatus_t pal_imageGetActiveHash(palBuffer_t *hash)</div><div class="ttdef"><b>Definition:</b> pal_update.c:95</div></div> +<div class="ttc" id="pal__update_8h_html_a60ae872dfe6cee8af957d52853927db0"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a60ae872dfe6cee8af957d52853927db0">palImageEvents_t</a></div><div class="ttdeci">enum _palImageEvents_t palImageEvents_t</div></div> +<div class="ttc" id="pal__types_8h_html_a160277354e86b9aea01d7689ec26d88d"><div class="ttname"><a href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a></div><div class="ttdeci">int32_t palStatus_t</div><div class="ttdef"><b>Definition:</b> pal_types.h:31</div></div> +<div class="ttc" id="pal__update_8h_html_a175083cffce66b96cd608a6cd10e9c61"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a175083cffce66b96cd608a6cd10e9c61">pal_imageFinalize</a></div><div class="ttdeci">palStatus_t pal_imageFinalize(palImageId_t imageId)</div><div class="ttdef"><b>Definition:</b> pal_update.c:62</div></div> +<div class="ttc" id="pal__update_8h_html_a72cd92d9d3eb0166f83d7e3c3e66f64c"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a72cd92d9d3eb0166f83d7e3c3e66f64c">pal_imageGetActiveVersion</a></div><div class="ttdeci">palStatus_t pal_imageGetActiveVersion(palBuffer_t *version)</div><div class="ttdef"><b>Definition:</b> pal_update.c:103</div></div> +<div class="ttc" id="pal__update_8h_html_a878db675a901d36499a7d3d75ed16aa2a7aa6e9bb937575c51a10d6d268f12b3e"><div class="ttname"><a href="../../dd/df9/pal__update_8h.html#a878db675a901d36499a7d3d75ed16aa2a7aa6e9bb937575c51a10d6d268f12b3e">PAL_IMAGE_EVENT_PREPARE</a></div><div class="ttdef"><b>Definition:</b> pal_update.h:53</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/de/d33/_free_r_t_o_s_config_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,677 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/BUILD_FreeRTOS/FreeRTOSConfig.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_5b516ef453fd36a0929ce414690fe335.html">BUILD_FreeRTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#define-members">Macros</a> </div> + <div class="headertitle"> +<div class="title">FreeRTOSConfig.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "unity.h"</code><br /> +</div> +<p><a href="../../de/d33/_free_r_t_o_s_config_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a> +Macros</h2></td></tr> +<tr class="memitem:adde83486022745409c40605922b0bdd6"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#adde83486022745409c40605922b0bdd6">configUSE_PREEMPTION</a>   1</td></tr> +<tr class="separator:adde83486022745409c40605922b0bdd6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac637ae45863c19fa2e919db0ed49301f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac637ae45863c19fa2e919db0ed49301f">configUSE_IDLE_HOOK</a>   0</td></tr> +<tr class="separator:ac637ae45863c19fa2e919db0ed49301f"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a23c5922c077106fad3f70b54d9071466"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a23c5922c077106fad3f70b54d9071466">configUSE_TICK_HOOK</a>   0</td></tr> +<tr class="separator:a23c5922c077106fad3f70b54d9071466"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa68082df879e6fc96bcb9b26513639e7"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#aa68082df879e6fc96bcb9b26513639e7">configCPU_CLOCK_HZ</a>   (SystemCoreClock)</td></tr> +<tr class="separator:aa68082df879e6fc96bcb9b26513639e7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2f0258dd1e3b877e5bc013be54c2db6a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2f0258dd1e3b877e5bc013be54c2db6a">configTICK_RATE_HZ</a>   ((TickType_t)1000)</td></tr> +<tr class="separator:a2f0258dd1e3b877e5bc013be54c2db6a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9a78f5ac61e6cb172dadf2a51f11db38"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a9a78f5ac61e6cb172dadf2a51f11db38">configMAX_PRIORITIES</a>   (5)</td></tr> +<tr class="separator:a9a78f5ac61e6cb172dadf2a51f11db38"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6c534a6cf8a00528fe0be42083484f9a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a6c534a6cf8a00528fe0be42083484f9a">configMINIMAL_STACK_SIZE</a>   ((unsigned short)90)</td></tr> +<tr class="separator:a6c534a6cf8a00528fe0be42083484f9a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9f213227674effff0122a75d94d87938"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a9f213227674effff0122a75d94d87938">configTOTAL_HEAP_SIZE</a>   ((size_t)(10 * 1024))</td></tr> +<tr class="separator:a9f213227674effff0122a75d94d87938"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac388dc4041aab6997348828eb27fc1a8"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac388dc4041aab6997348828eb27fc1a8">configMAX_TASK_NAME_LEN</a>   (10)</td></tr> +<tr class="separator:ac388dc4041aab6997348828eb27fc1a8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a27f5ee137dc9f125681a31f0b0a4b3be"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a27f5ee137dc9f125681a31f0b0a4b3be">configUSE_TRACE_FACILITY</a>   1</td></tr> +<tr class="separator:a27f5ee137dc9f125681a31f0b0a4b3be"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aac311ed9b9e5ae4d2d9648b33a24acce"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#aac311ed9b9e5ae4d2d9648b33a24acce">configUSE_16_BIT_TICKS</a>   0</td></tr> +<tr class="separator:aac311ed9b9e5ae4d2d9648b33a24acce"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad6a5061a742fee450ac455e4ad0f4b6c"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad6a5061a742fee450ac455e4ad0f4b6c">configIDLE_SHOULD_YIELD</a>   1</td></tr> +<tr class="separator:ad6a5061a742fee450ac455e4ad0f4b6c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a543bf3c79008974cc1d36bab51d94fbf"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a543bf3c79008974cc1d36bab51d94fbf">configUSE_MUTEXES</a>   1</td></tr> +<tr class="separator:a543bf3c79008974cc1d36bab51d94fbf"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa4b5138c4e42a180f0abd4f2455f90fb"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#aa4b5138c4e42a180f0abd4f2455f90fb">configQUEUE_REGISTRY_SIZE</a>   8</td></tr> +<tr class="separator:aa4b5138c4e42a180f0abd4f2455f90fb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a847511ee433494b1e32c90602c967ae7"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a847511ee433494b1e32c90602c967ae7">configCHECK_FOR_STACK_OVERFLOW</a>   0</td></tr> +<tr class="separator:a847511ee433494b1e32c90602c967ae7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9fe02d866cb1c4fbaa0c3de79f53d42d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a9fe02d866cb1c4fbaa0c3de79f53d42d">configUSE_RECURSIVE_MUTEXES</a>   1</td></tr> +<tr class="separator:a9fe02d866cb1c4fbaa0c3de79f53d42d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abdf48e7c9cf513f083aa9cbed0dd7cd7"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#abdf48e7c9cf513f083aa9cbed0dd7cd7">configUSE_MALLOC_FAILED_HOOK</a>   0</td></tr> +<tr class="separator:abdf48e7c9cf513f083aa9cbed0dd7cd7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2eb2a0baf886a7adab15b5735029434b"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2eb2a0baf886a7adab15b5735029434b">configUSE_APPLICATION_TASK_TAG</a>   0</td></tr> +<tr class="separator:a2eb2a0baf886a7adab15b5735029434b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a55778995203c57369d2fbfb10224943d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a55778995203c57369d2fbfb10224943d">configUSE_COUNTING_SEMAPHORES</a>   1</td></tr> +<tr class="separator:a55778995203c57369d2fbfb10224943d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad8081822f3ebc7c917b63bd7bdd7bc58"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad8081822f3ebc7c917b63bd7bdd7bc58">configGENERATE_RUN_TIME_STATS</a>   0</td></tr> +<tr class="separator:ad8081822f3ebc7c917b63bd7bdd7bc58"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a493c5763eb7a39bd80779a1c58de0d82"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a493c5763eb7a39bd80779a1c58de0d82">configUSE_TIME_SLICING</a>   0</td></tr> +<tr class="separator:a493c5763eb7a39bd80779a1c58de0d82"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a57990715eb06402474b8b47e1d562616"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a57990715eb06402474b8b47e1d562616">configUSE_CO_ROUTINES</a>   0</td></tr> +<tr class="separator:a57990715eb06402474b8b47e1d562616"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae8f3fd645e6e78dfeb8a6e874af6195a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ae8f3fd645e6e78dfeb8a6e874af6195a">configMAX_CO_ROUTINE_PRIORITIES</a>   (2)</td></tr> +<tr class="separator:ae8f3fd645e6e78dfeb8a6e874af6195a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac342ae309b0c53828d2ecad3e6de355b"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac342ae309b0c53828d2ecad3e6de355b">configUSE_TIMERS</a>   1</td></tr> +<tr class="separator:ac342ae309b0c53828d2ecad3e6de355b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a05c75ff9029ba3f0ab5bde9196f1e873"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a05c75ff9029ba3f0ab5bde9196f1e873">configTIMER_TASK_PRIORITY</a>   (2)</td></tr> +<tr class="separator:a05c75ff9029ba3f0ab5bde9196f1e873"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abb9aa0f31c1f3b14a15083a3c6120918"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#abb9aa0f31c1f3b14a15083a3c6120918">configTIMER_QUEUE_LENGTH</a>   10</td></tr> +<tr class="separator:abb9aa0f31c1f3b14a15083a3c6120918"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aed7c7ebcdee603583a55e8ce04e55841"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#aed7c7ebcdee603583a55e8ce04e55841">configTIMER_TASK_STACK_DEPTH</a>   (<a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a6c534a6cf8a00528fe0be42083484f9a">configMINIMAL_STACK_SIZE</a> * 2)</td></tr> +<tr class="separator:aed7c7ebcdee603583a55e8ce04e55841"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad6858ac8aaf726007fd19752956ef1bd"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad6858ac8aaf726007fd19752956ef1bd">INCLUDE_vTaskPrioritySet</a>   1</td></tr> +<tr class="separator:ad6858ac8aaf726007fd19752956ef1bd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1279eb797355460aeeec06aa524e91df"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a1279eb797355460aeeec06aa524e91df">INCLUDE_uxTaskPriorityGet</a>   1</td></tr> +<tr class="separator:a1279eb797355460aeeec06aa524e91df"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5ae1434fdf995108dc749ff9329f53bd"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5ae1434fdf995108dc749ff9329f53bd">INCLUDE_vTaskDelete</a>   1</td></tr> +<tr class="separator:a5ae1434fdf995108dc749ff9329f53bd"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7ee138825e57f243c8ee5fd4207b9e26"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a7ee138825e57f243c8ee5fd4207b9e26">INCLUDE_vTaskCleanUpResources</a>   1</td></tr> +<tr class="separator:a7ee138825e57f243c8ee5fd4207b9e26"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aef8fbb97819ad3d962f334ac298206d1"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#aef8fbb97819ad3d962f334ac298206d1">INCLUDE_vTaskSuspend</a>   1</td></tr> +<tr class="separator:aef8fbb97819ad3d962f334ac298206d1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae8459bfd5b428319bb10de9f504a53aa"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ae8459bfd5b428319bb10de9f504a53aa">INCLUDE_vTaskDelayUntil</a>   1</td></tr> +<tr class="separator:ae8459bfd5b428319bb10de9f504a53aa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a24361a6eb816a965f1ee4e2e08e364f8"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a24361a6eb816a965f1ee4e2e08e364f8">INCLUDE_vTaskDelay</a>   1</td></tr> +<tr class="separator:a24361a6eb816a965f1ee4e2e08e364f8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5796db11ec6f9aa38d017d2ac393c5ba"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5796db11ec6f9aa38d017d2ac393c5ba">configPRIO_BITS</a>   4 /* 15 priority levels */</td></tr> +<tr class="separator:a5796db11ec6f9aa38d017d2ac393c5ba"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a10da20f180ec9bd131b0052a802dbc39"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a10da20f180ec9bd131b0052a802dbc39">configLIBRARY_LOWEST_INTERRUPT_PRIORITY</a>   0xf</td></tr> +<tr class="separator:a10da20f180ec9bd131b0052a802dbc39"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2254bd235d882be3061bcad0b1e8be98"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2254bd235d882be3061bcad0b1e8be98">configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY</a>   5</td></tr> +<tr class="separator:a2254bd235d882be3061bcad0b1e8be98"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac42cff506ad61d4174fa23e952e3225e"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac42cff506ad61d4174fa23e952e3225e">configKERNEL_INTERRUPT_PRIORITY</a>   (<a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a10da20f180ec9bd131b0052a802dbc39">configLIBRARY_LOWEST_INTERRUPT_PRIORITY</a> << (8 - <a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5796db11ec6f9aa38d017d2ac393c5ba">configPRIO_BITS</a>))</td></tr> +<tr class="separator:ac42cff506ad61d4174fa23e952e3225e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a54bfc31c410ee452577a25a4552c3704"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a54bfc31c410ee452577a25a4552c3704">configMAX_SYSCALL_INTERRUPT_PRIORITY</a>   (<a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2254bd235d882be3061bcad0b1e8be98">configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY</a> << (8 - <a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5796db11ec6f9aa38d017d2ac393c5ba">configPRIO_BITS</a>))</td></tr> +<tr class="separator:a54bfc31c410ee452577a25a4552c3704"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:adeb674dafd926ad4dd27b70ecdc41163"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#adeb674dafd926ad4dd27b70ecdc41163">configASSERT</a>(x)    TEST_ASSERT(x)</td></tr> +<tr class="separator:adeb674dafd926ad4dd27b70ecdc41163"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad43047b3ea0a146673e30637488bf754"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad43047b3ea0a146673e30637488bf754">vPortSVCHandler</a>   SVC_Handler</td></tr> +<tr class="separator:ad43047b3ea0a146673e30637488bf754"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6f30022da7d797dd31f1b8a11cae9a35"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a6f30022da7d797dd31f1b8a11cae9a35">xPortPendSVHandler</a>   PendSV_Handler</td></tr> +<tr class="separator:a6f30022da7d797dd31f1b8a11cae9a35"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ae42e6318b5d564e44f97f8c765859448"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#ae42e6318b5d564e44f97f8c765859448">xPortSysTickHandler</a>   SysTick_Handler</td></tr> +<tr class="separator:ae42e6318b5d564e44f97f8c765859448"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Macro Definition Documentation</h2> +<a class="anchor" id="adeb674dafd926ad4dd27b70ecdc41163"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configASSERT</td> + <td>(</td> + <td class="paramtype"> </td> + <td class="paramname">x</td><td>)</td> + <td>   TEST_ASSERT(x)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a847511ee433494b1e32c90602c967ae7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configCHECK_FOR_STACK_OVERFLOW   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa68082df879e6fc96bcb9b26513639e7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configCPU_CLOCK_HZ   (SystemCoreClock)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad8081822f3ebc7c917b63bd7bdd7bc58"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configGENERATE_RUN_TIME_STATS   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad6a5061a742fee450ac455e4ad0f4b6c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configIDLE_SHOULD_YIELD   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac42cff506ad61d4174fa23e952e3225e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configKERNEL_INTERRUPT_PRIORITY   (<a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a10da20f180ec9bd131b0052a802dbc39">configLIBRARY_LOWEST_INTERRUPT_PRIORITY</a> << (8 - <a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5796db11ec6f9aa38d017d2ac393c5ba">configPRIO_BITS</a>))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a10da20f180ec9bd131b0052a802dbc39"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   0xf</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2254bd235d882be3061bcad0b1e8be98"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY   5</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ae8f3fd645e6e78dfeb8a6e874af6195a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configMAX_CO_ROUTINE_PRIORITIES   (2)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9a78f5ac61e6cb172dadf2a51f11db38"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configMAX_PRIORITIES   (5)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a54bfc31c410ee452577a25a4552c3704"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configMAX_SYSCALL_INTERRUPT_PRIORITY   (<a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2254bd235d882be3061bcad0b1e8be98">configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY</a> << (8 - <a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5796db11ec6f9aa38d017d2ac393c5ba">configPRIO_BITS</a>))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac388dc4041aab6997348828eb27fc1a8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configMAX_TASK_NAME_LEN   (10)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6c534a6cf8a00528fe0be42083484f9a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configMINIMAL_STACK_SIZE   ((unsigned short)90)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a5796db11ec6f9aa38d017d2ac393c5ba"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configPRIO_BITS   4 /* 15 priority levels */</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aa4b5138c4e42a180f0abd4f2455f90fb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configQUEUE_REGISTRY_SIZE   8</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2f0258dd1e3b877e5bc013be54c2db6a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configTICK_RATE_HZ   ((TickType_t)1000)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abb9aa0f31c1f3b14a15083a3c6120918"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configTIMER_QUEUE_LENGTH   10</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a05c75ff9029ba3f0ab5bde9196f1e873"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configTIMER_TASK_PRIORITY   (2)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aed7c7ebcdee603583a55e8ce04e55841"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configTIMER_TASK_STACK_DEPTH   (<a class="el" href="../../de/d33/_free_r_t_o_s_config_8h.html#a6c534a6cf8a00528fe0be42083484f9a">configMINIMAL_STACK_SIZE</a> * 2)</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9f213227674effff0122a75d94d87938"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configTOTAL_HEAP_SIZE   ((size_t)(10 * 1024))</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aac311ed9b9e5ae4d2d9648b33a24acce"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_16_BIT_TICKS   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a2eb2a0baf886a7adab15b5735029434b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_APPLICATION_TASK_TAG   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a57990715eb06402474b8b47e1d562616"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_CO_ROUTINES   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a55778995203c57369d2fbfb10224943d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_COUNTING_SEMAPHORES   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac637ae45863c19fa2e919db0ed49301f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_IDLE_HOOK   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="abdf48e7c9cf513f083aa9cbed0dd7cd7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_MALLOC_FAILED_HOOK   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a543bf3c79008974cc1d36bab51d94fbf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_MUTEXES   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="adde83486022745409c40605922b0bdd6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_PREEMPTION   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9fe02d866cb1c4fbaa0c3de79f53d42d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_RECURSIVE_MUTEXES   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a23c5922c077106fad3f70b54d9071466"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_TICK_HOOK   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a493c5763eb7a39bd80779a1c58de0d82"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_TIME_SLICING   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac342ae309b0c53828d2ecad3e6de355b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_TIMERS   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a27f5ee137dc9f125681a31f0b0a4b3be"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define configUSE_TRACE_FACILITY   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a1279eb797355460aeeec06aa524e91df"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define INCLUDE_uxTaskPriorityGet   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7ee138825e57f243c8ee5fd4207b9e26"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define INCLUDE_vTaskCleanUpResources   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a24361a6eb816a965f1ee4e2e08e364f8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define INCLUDE_vTaskDelay   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ae8459bfd5b428319bb10de9f504a53aa"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define INCLUDE_vTaskDelayUntil   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a5ae1434fdf995108dc749ff9329f53bd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define INCLUDE_vTaskDelete   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad6858ac8aaf726007fd19752956ef1bd"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define INCLUDE_vTaskPrioritySet   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="aef8fbb97819ad3d962f334ac298206d1"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define INCLUDE_vTaskSuspend   1</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ad43047b3ea0a146673e30637488bf754"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define vPortSVCHandler   SVC_Handler</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6f30022da7d797dd31f1b8a11cae9a35"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define xPortPendSVHandler   PendSV_Handler</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ae42e6318b5d564e44f97f8c765859448"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define xPortSysTickHandler   SysTick_Handler</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/de/d33/_free_r_t_o_s_config_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/BUILD_FreeRTOS/FreeRTOSConfig.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_5b516ef453fd36a0929ce414690fe335.html">BUILD_FreeRTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">FreeRTOSConfig.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../de/d33/_free_r_t_o_s_config_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> All rights reserved</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"></span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"></span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> This file is part of the FreeRTOS distribution.</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"></span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> FreeRTOS is free software; you can redistribute it and/or modify it under</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment"> the terms of the GNU General Public License (version 2) as published by the</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment"> Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment"></span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment"> ***************************************************************************</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment"> >>! NOTE: The modification to the GPL is included to allow you to !<<</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment"> >>! distribute a combined work that includes FreeRTOS without being !<<</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment"> >>! obliged to provide the source code for proprietary components !<<</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment"> >>! outside of the FreeRTOS kernel. !<<</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment"> ***************************************************************************</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment"></span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment"> FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment"> WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment"> FOR A PARTICULAR PURPOSE. Full license text is available on the following</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment"> link: http://www.freertos.org/a00114.html</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"></span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> ***************************************************************************</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * *</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * FreeRTOS provides completely free yet professionally developed, *</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> * robust, strictly quality controlled, supported, and cross *</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> * platform software that is more than just the market leader, it *</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> * is the industry's de facto standard. *</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment"> * *</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment"> * Help yourself get started quickly while simultaneously helping *</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment"> * to support the FreeRTOS project by purchasing a FreeRTOS *</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment"> * tutorial book, reference manual, or both: *</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment"> * http://www.FreeRTOS.org/Documentation *</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="comment"> * *</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="comment"> ***************************************************************************</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment"></span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment"> http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment"> the FAQ page "My application does not run, what could be wrong?". Have you</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment"> defined configASSERT()?</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment"></span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment"> http://www.FreeRTOS.org/support - In return for receiving this top quality</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment"> embedded software for free we request you assist our global community by</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment"> participating in the support forum.</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"></span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment"> http://www.FreeRTOS.org/training - Investing in training allows your team to</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment"> be as productive as possible as early as possible. Now you can receive</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment"> FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment"> Ltd, and the world's leading authority on the world's leading RTOS.</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment"></span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment"> http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment"> including FreeRTOS+Trace - an indispensable productivity tool, a DOS</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment"> compatible FAT file system, and our tiny thread aware UDP/IP stack.</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"></span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"> http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="comment"> Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment"></span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment"> http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment"> Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment"> licenses offer ticketed support, indemnification and commercial middleware.</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="comment"></span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment"> http://www.SafeRTOS.com - High Integrity Systems also provide a safety</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment"> engineered and independently SIL3 certified version for use in safety and</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment"> mission critical applications that require provable dependability.</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="comment"></span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="comment"> 1 tab == 4 spaces!</span></div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="comment">*/</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="preprocessor">#ifndef FREERTOS_CONFIG_H</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="preprocessor">#define FREERTOS_CONFIG_H</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> </div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="comment">/*-----------------------------------------------------------</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="comment"> * Application specific definitions.</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="comment"> *</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment"> * These definitions should be adjusted for your particular hardware and</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment"> * application requirements.</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="comment"> *</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="comment"> * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="comment"> * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="comment"> *</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="comment"> * See http://www.freertos.org/a00110.html.</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="comment"> *----------------------------------------------------------*/</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span> </div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#adde83486022745409c40605922b0bdd6"> 85</a></span> <span class="preprocessor">#define configUSE_PREEMPTION 1</span></div><div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac637ae45863c19fa2e919db0ed49301f"> 86</a></span> <span class="preprocessor">#define configUSE_IDLE_HOOK 0</span></div><div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a23c5922c077106fad3f70b54d9071466"> 87</a></span> <span class="preprocessor">#define configUSE_TICK_HOOK 0</span></div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#aa68082df879e6fc96bcb9b26513639e7"> 88</a></span> <span class="preprocessor">#define configCPU_CLOCK_HZ (SystemCoreClock)</span></div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2f0258dd1e3b877e5bc013be54c2db6a"> 89</a></span> <span class="preprocessor">#define configTICK_RATE_HZ ((TickType_t)1000)</span></div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a9a78f5ac61e6cb172dadf2a51f11db38"> 90</a></span> <span class="preprocessor">#define configMAX_PRIORITIES (5)</span></div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a6c534a6cf8a00528fe0be42083484f9a"> 91</a></span> <span class="preprocessor">#define configMINIMAL_STACK_SIZE ((unsigned short)90)</span></div><div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a9f213227674effff0122a75d94d87938"> 92</a></span> <span class="preprocessor">#define configTOTAL_HEAP_SIZE ((size_t)(10 * 1024))</span></div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac388dc4041aab6997348828eb27fc1a8"> 93</a></span> <span class="preprocessor">#define configMAX_TASK_NAME_LEN (10)</span></div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a27f5ee137dc9f125681a31f0b0a4b3be"> 94</a></span> <span class="preprocessor">#define configUSE_TRACE_FACILITY 1</span></div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#aac311ed9b9e5ae4d2d9648b33a24acce"> 95</a></span> <span class="preprocessor">#define configUSE_16_BIT_TICKS 0</span></div><div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad6a5061a742fee450ac455e4ad0f4b6c"> 96</a></span> <span class="preprocessor">#define configIDLE_SHOULD_YIELD 1</span></div><div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a543bf3c79008974cc1d36bab51d94fbf"> 97</a></span> <span class="preprocessor">#define configUSE_MUTEXES 1</span></div><div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#aa4b5138c4e42a180f0abd4f2455f90fb"> 98</a></span> <span class="preprocessor">#define configQUEUE_REGISTRY_SIZE 8</span></div><div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a847511ee433494b1e32c90602c967ae7"> 99</a></span> <span class="preprocessor">#define configCHECK_FOR_STACK_OVERFLOW 0</span></div><div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a9fe02d866cb1c4fbaa0c3de79f53d42d"> 100</a></span> <span class="preprocessor">#define configUSE_RECURSIVE_MUTEXES 1</span></div><div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#abdf48e7c9cf513f083aa9cbed0dd7cd7"> 101</a></span> <span class="preprocessor">#define configUSE_MALLOC_FAILED_HOOK 0</span></div><div class="line"><a name="l00102"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2eb2a0baf886a7adab15b5735029434b"> 102</a></span> <span class="preprocessor">#define configUSE_APPLICATION_TASK_TAG 0</span></div><div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a55778995203c57369d2fbfb10224943d"> 103</a></span> <span class="preprocessor">#define configUSE_COUNTING_SEMAPHORES 1</span></div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad8081822f3ebc7c917b63bd7bdd7bc58"> 104</a></span> <span class="preprocessor">#define configGENERATE_RUN_TIME_STATS 0</span></div><div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a493c5763eb7a39bd80779a1c58de0d82"> 105</a></span> <span class="preprocessor">#define configUSE_TIME_SLICING 0</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="comment">/* Co-routine definitions. */</span></div><div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a57990715eb06402474b8b47e1d562616"> 108</a></span> <span class="preprocessor">#define configUSE_CO_ROUTINES 0</span></div><div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ae8f3fd645e6e78dfeb8a6e874af6195a"> 109</a></span> <span class="preprocessor">#define configMAX_CO_ROUTINE_PRIORITIES (2)</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <span class="comment">/* Software timer definitions. */</span></div><div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac342ae309b0c53828d2ecad3e6de355b"> 112</a></span> <span class="preprocessor">#define configUSE_TIMERS 1</span></div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a05c75ff9029ba3f0ab5bde9196f1e873"> 113</a></span> <span class="preprocessor">#define configTIMER_TASK_PRIORITY (2)</span></div><div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#abb9aa0f31c1f3b14a15083a3c6120918"> 114</a></span> <span class="preprocessor">#define configTIMER_QUEUE_LENGTH 10</span></div><div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#aed7c7ebcdee603583a55e8ce04e55841"> 115</a></span> <span class="preprocessor">#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2)</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> </div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment">/* Set the following definitions to 1 to include the API function, or zero</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="comment">to exclude the API function. */</span></div><div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad6858ac8aaf726007fd19752956ef1bd"> 119</a></span> <span class="preprocessor">#define INCLUDE_vTaskPrioritySet 1</span></div><div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a1279eb797355460aeeec06aa524e91df"> 120</a></span> <span class="preprocessor">#define INCLUDE_uxTaskPriorityGet 1</span></div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5ae1434fdf995108dc749ff9329f53bd"> 121</a></span> <span class="preprocessor">#define INCLUDE_vTaskDelete 1</span></div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a7ee138825e57f243c8ee5fd4207b9e26"> 122</a></span> <span class="preprocessor">#define INCLUDE_vTaskCleanUpResources 1</span></div><div class="line"><a name="l00123"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#aef8fbb97819ad3d962f334ac298206d1"> 123</a></span> <span class="preprocessor">#define INCLUDE_vTaskSuspend 1</span></div><div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ae8459bfd5b428319bb10de9f504a53aa"> 124</a></span> <span class="preprocessor">#define INCLUDE_vTaskDelayUntil 1</span></div><div class="line"><a name="l00125"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a24361a6eb816a965f1ee4e2e08e364f8"> 125</a></span> <span class="preprocessor">#define INCLUDE_vTaskDelay 1</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="comment">/* Cortex-M specific definitions. */</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor">#ifdef __NVIC_PRIO_BITS</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="comment">/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="preprocessor">#define configPRIO_BITS __NVIC_PRIO_BITS</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a5796db11ec6f9aa38d017d2ac393c5ba"> 132</a></span> <span class="preprocessor">#define configPRIO_BITS 4 </span><span class="comment">/* 15 priority levels */</span><span class="preprocessor"></span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment">/* The lowest interrupt priority that can be used in a call to a "set priority"</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="comment">function. */</span></div><div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a10da20f180ec9bd131b0052a802dbc39"> 137</a></span> <span class="preprocessor">#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> </div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> <span class="comment">/* The highest interrupt priority that can be used by any interrupt service</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> <span class="comment">routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> <span class="comment">INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="comment">PRIORITY THAN THIS! (higher priorities are lower numeric values. */</span></div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a2254bd235d882be3061bcad0b1e8be98"> 143</a></span> <span class="preprocessor">#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5</span></div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment">/* Interrupt priorities used by the kernel port layer itself. These are generic</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment">to all Cortex-M ports, and do not rely on any particular library functions. */</span></div><div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ac42cff506ad61d4174fa23e952e3225e"> 147</a></span> <span class="preprocessor">#define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="comment">/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="comment">See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */</span></div><div class="line"><a name="l00150"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a54bfc31c410ee452577a25a4552c3704"> 150</a></span> <span class="preprocessor">#define configMAX_SYSCALL_INTERRUPT_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="comment">/* Normal assert() semantics without relying on the provision of an assert.h</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="comment">header file. */</span></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="preprocessor">#include "unity.h"</span></div><div class="line"><a name="l00155"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#adeb674dafd926ad4dd27b70ecdc41163"> 155</a></span> <span class="preprocessor">#define configASSERT(x) TEST_ASSERT(x)</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="comment">/*#define configASSERT(x) \</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <span class="comment"> if ((x) == 0) \</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> <span class="comment"> { \</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> <span class="comment"> taskDISABLE_INTERRUPTS(); \</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span> <span class="comment"> for (;;) \</span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> <span class="comment"> ; \</span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> <span class="comment"> }*/</span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="comment">/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS</span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="comment">standard names. */</span></div><div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ad43047b3ea0a146673e30637488bf754"> 166</a></span> <span class="preprocessor">#define vPortSVCHandler SVC_Handler</span></div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#a6f30022da7d797dd31f1b8a11cae9a35"> 167</a></span> <span class="preprocessor">#define xPortPendSVHandler PendSV_Handler</span></div><div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="../../de/d33/_free_r_t_o_s_config_8h.html#ae42e6318b5d564e44f97f8c765859448"> 168</a></span> <span class="preprocessor">#define xPortSysTickHandler SysTick_Handler</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> </div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="preprocessor">#endif </span><span class="comment">/* FREERTOS_CONFIG_H */</span><span class="preprocessor"></span></div></div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/de/d33/pal__rtos_8c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1151 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Modules/RTOS/pal_rtos.c File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="../../dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="../../dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></li><li class="navelem"><a class="el" href="../../dir_0a6b9d10733e8fa4306fa781def1f127.html">RTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos.c File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>"</code><br /> +<code>#include "<a class="el" href="../../d5/d59/pal__plat__rtos_8h_source.html">pal_plat_rtos.h</a>"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:ab8ab0f31bbf4258b7684d22e7725a9f8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_osReboot</a> (void)</td></tr> +<tr class="separator:ab8ab0f31bbf4258b7684d22e7725a9f8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9800b8b9e057fe17e50c4259c809f898"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a9800b8b9e057fe17e50c4259c809f898">pal_osKernelSysTick</a> (void)</td></tr> +<tr class="separator:a9800b8b9e057fe17e50c4259c809f898"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af88551b6ca24a7a2bb6d94d423eb4401"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_osKernelSysTick64</a> (void)</td></tr> +<tr class="separator:af88551b6ca24a7a2bb6d94d423eb4401"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a34375ee82619a4064849daccbdfbc966"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a34375ee82619a4064849daccbdfbc966">pal_osKernelSysTickMicroSec</a> (uint64_t microseconds)</td></tr> +<tr class="separator:a34375ee82619a4064849daccbdfbc966"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a59e85747582417a1395ed0f9c140eb8a"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a59e85747582417a1395ed0f9c140eb8a">pal_osKernelSysMilliSecTick</a> (uint64_t sysTicks)</td></tr> +<tr class="separator:a59e85747582417a1395ed0f9c140eb8a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a087214ae87c20fd59f47fe3c96d0eefc"><td class="memItemLeft" align="right" valign="top">uint64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_osKernelSysTickFrequency</a> (void)</td></tr> +<tr class="separator:a087214ae87c20fd59f47fe3c96d0eefc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2dae64d917f644982b893037adf562b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a2dae64d917f644982b893037adf562b4">pal_osThreadCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> priority, uint32_t stackSize, uint32_t *stackPtr, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> *store, <a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:a2dae64d917f644982b893037adf562b4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:abcfa47b411929b33d5d9cfaaff28ce18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_osThreadTerminate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> *threadID)</td></tr> +<tr class="separator:abcfa47b411929b33d5d9cfaaff28ce18"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2993b8f6b5e8d7ccd6121dc18330e4be"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_osThreadGetId</a> (void)</td></tr> +<tr class="separator:a2993b8f6b5e8d7ccd6121dc18330e4be"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac94f4efc4bad73969e57c8255c136a0d"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#ac94f4efc4bad73969e57c8255c136a0d">pal_osThreadGetLocalStore</a> (void)</td></tr> +<tr class="separator:ac94f4efc4bad73969e57c8255c136a0d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ad6aaee432fd7ea5e35ab500a6278cc25"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_osDelay</a> (uint32_t milliseconds)</td></tr> +<tr class="separator:ad6aaee432fd7ea5e35ab500a6278cc25"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa4da36fbbba744a14d1bdfe2a26d1a18"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_osTimerCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> function, void *funcArgument, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> timerType, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:aa4da36fbbba744a14d1bdfe2a26d1a18"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6c60c9e433bc6005bac6b02d5aba7363"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_osTimerStart</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID, uint32_t millisec)</td></tr> +<tr class="separator:a6c60c9e433bc6005bac6b02d5aba7363"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a94f4df594102e582cbd2114f6eebb57d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a94f4df594102e582cbd2114f6eebb57d">pal_osTimerStop</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> timerID)</td></tr> +<tr class="separator:a94f4df594102e582cbd2114f6eebb57d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac7ca6e7c3c229f4092c9df4b69e7dd59"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_osTimerDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> *timerID)</td></tr> +<tr class="separator:ac7ca6e7c3c229f4092c9df4b69e7dd59"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af89aab14085207b1a0951f7aad24193c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#af89aab14085207b1a0951f7aad24193c">pal_osMutexCreate</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:af89aab14085207b1a0951f7aad24193c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acda0974247325955719b23494d66c622"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#acda0974247325955719b23494d66c622">pal_osMutexWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID, uint32_t millisec)</td></tr> +<tr class="separator:acda0974247325955719b23494d66c622"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1d976a616a5c850b2016b2b87d8b47cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_osMutexRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> mutexID)</td></tr> +<tr class="separator:a1d976a616a5c850b2016b2b87d8b47cc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a03f43d7e53435d89f316862b48b573c4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a03f43d7e53435d89f316862b48b573c4">pal_osMutexDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> *mutexID)</td></tr> +<tr class="separator:a03f43d7e53435d89f316862b48b573c4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aaa7aee442a5c8cc274d3e52206984037"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#aaa7aee442a5c8cc274d3e52206984037">pal_osSemaphoreCreate</a> (uint32_t count, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:aaa7aee442a5c8cc274d3e52206984037"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa2d998744dbc9504bfe0358f85457fc4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#aa2d998744dbc9504bfe0358f85457fc4">pal_osSemaphoreWait</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID, uint32_t millisec, int32_t *countersAvailable)</td></tr> +<tr class="separator:aa2d998744dbc9504bfe0358f85457fc4"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a009d0c063119265f9c5c0c9bff379c14"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a009d0c063119265f9c5c0c9bff379c14">pal_osSemaphoreRelease</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> semaphoreID)</td></tr> +<tr class="separator:a009d0c063119265f9c5c0c9bff379c14"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a45f071482f8669821b90264e0470b33d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a45f071482f8669821b90264e0470b33d">pal_osSemaphoreDelete</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> *semaphoreID)</td></tr> +<tr class="separator:a45f071482f8669821b90264e0470b33d"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1245f053abb3fdb7ab2ceb5a2899e8c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_osPoolCreate</a> (uint32_t blockSize, uint32_t blockCount, <a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a1245f053abb3fdb7ab2ceb5a2899e8c6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a3a2b57685096d16a110ee38f7f29e099"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a3a2b57685096d16a110ee38f7f29e099">pal_osPoolAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a3a2b57685096d16a110ee38f7f29e099"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a5d20661cd387a172450a2fe12993687a"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a5d20661cd387a172450a2fe12993687a">pal_osPoolCAlloc</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID)</td></tr> +<tr class="separator:a5d20661cd387a172450a2fe12993687a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a79f4997069310aa7bbb6ae7995988dd7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a79f4997069310aa7bbb6ae7995988dd7">pal_osPoolFree</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> memoryPoolID, void *block)</td></tr> +<tr class="separator:a79f4997069310aa7bbb6ae7995988dd7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a1c01464448f8d7bd95bf518d651484c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a1c01464448f8d7bd95bf518d651484c6">pal_osPoolDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> *memoryPoolID)</td></tr> +<tr class="separator:a1c01464448f8d7bd95bf518d651484c6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a0c7f0003e92b3494089966d53ab24a1b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a0c7f0003e92b3494089966d53ab24a1b">pal_osMessageQueueCreate</a> (uint32_t messageQSize, <a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:a0c7f0003e92b3494089966d53ab24a1b"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a966daa5b0bd9282fbffa7c462da1c417"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a966daa5b0bd9282fbffa7c462da1c417">pal_osMessagePut</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t info, uint32_t timeout)</td></tr> +<tr class="separator:a966daa5b0bd9282fbffa7c462da1c417"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ab70d0be45514258874c0406c2040372c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#ab70d0be45514258874c0406c2040372c">pal_osMessageGet</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> messageQID, uint32_t timeout, uint32_t *messageValue)</td></tr> +<tr class="separator:ab70d0be45514258874c0406c2040372c"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:adba13212ec060092acdf6165e82be5b6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#adba13212ec060092acdf6165e82be5b6">pal_osMessageQueueDestroy</a> (<a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> *messageQID)</td></tr> +<tr class="separator:adba13212ec060092acdf6165e82be5b6"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9b33d260ee1022f5b5f6a9dfc3363f2a"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_osAtomicIncrement</a> (int32_t *valuePtr, int32_t increment)</td></tr> +<tr class="separator:a9b33d260ee1022f5b5f6a9dfc3363f2a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a2b4f475c89ea263557d6529c4d9a9353"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/d33/pal__rtos_8c.html#a2b4f475c89ea263557d6529c4d9a9353">dbgPrintf</a> (const char *function, uint32_t line, const char *format,...)</td></tr> +<tr class="separator:a2b4f475c89ea263557d6529c4d9a9353"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a2b4f475c89ea263557d6529c4d9a9353"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void dbgPrintf </td> + <td>(</td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>line</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>format</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"> </td> + <td class="paramname"><em>...</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Printf like function with prefix of function and line.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>name of the current function </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">line</td><td>line number to be printed </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">format</td><td>print format (just like printf)</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the value of the valuePtr after the increment operation. </dd></dl> + +</div> +</div> +<a class="anchor" id="a9b33d260ee1022f5b5f6a9dfc3363f2a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int32_t pal_osAtomicIncrement </td> + <td>(</td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>valuePtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t </td> + <td class="paramname"><em>increment</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Perform an atomic increment for a signed32 bit value</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">valuePtr</td><td>the address of the value to increment </td></tr> + <tr><td class="paramdir"></td><td class="paramname"></td><td></td></tr> + </table> + </dd> +</dl> + +</div> +</div> +<a class="anchor" id="ad6aaee432fd7ea5e35ab500a6278cc25"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osDelay </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>milliseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait for a specified time period in milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">milliseconds</td><td>the amount of milliseconds to wait before proceeding.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a59e85747582417a1395ed0f9c140eb8a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysMilliSecTick </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>sysTicks</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Converts value from kernel system ticks to milliseconds.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">sysTicks</td><td>the amount of kernel system ticks to convert into millieseconds</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>converted value in system ticks </dd></dl> + +</div> +</div> +<a class="anchor" id="a9800b8b9e057fe17e50c4259c809f898"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t pal_osKernelSysTick </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the RTOS kernel system timer counter. </p><dl class="section note"><dt>Note</dt><dd>this counter will wrap around very often (e.g. once every 42 sec for 100Mhz) </dd></dl> +<dl class="section return"><dt>Returns</dt><dd>the RTOS kernel system timer counter </dd></dl> + +</div> +</div> +<a class="anchor" id="af88551b6ca24a7a2bb6d94d423eb4401"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysTick64 </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the RTOS kernel system timer counter. </p><dl class="section return"><dt>Returns</dt><dd>the RTOS kernel system timer counter </dd></dl> + +</div> +</div> +<a class="anchor" id="a087214ae87c20fd59f47fe3c96d0eefc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysTickFrequency </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the system tick frequency </p><dl class="section return"><dt>Returns</dt><dd>the system tick frequency </dd></dl> + +</div> +</div> +<a class="anchor" id="a34375ee82619a4064849daccbdfbc966"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint64_t pal_osKernelSysTickMicroSec </td> + <td>(</td> + <td class="paramtype">uint64_t </td> + <td class="paramname"><em>microseconds</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Converts value from microseconds to kernel sys tick</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">microseconds</td><td>the amount of microseconds to convert into system ticks</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>converted value in system ticks </dd></dl> + +</div> +</div> +<a class="anchor" id="ab70d0be45514258874c0406c2040372c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessageGet </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>messageValue</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get a Message or Wait for a Message from a Queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>the handle for the memory pool </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>timeout in milliseconds </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">event</td><td>the data to send</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - in case semaphore was not available but not due to time out. PAL_ERR_RTOS_TIMEOUT - no message arrived during the timeout period. PAL_ERR_RTOS_RESOURCE - no message received and there was no timeout </dd></dl> + +</div> +</div> +<a class="anchor" id="a966daa5b0bd9282fbffa7c462da1c417"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessagePut </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> </td> + <td class="paramname"><em>messageQID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>info</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>timeout</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Put a Message to a Queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQID</td><td>the handle for the memory pool </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">info</td><td>the data to send </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timeout</td><td>timeout in milliseconds</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a0c7f0003e92b3494089966d53ab24a1b"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessageQueueCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>messageQSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a message queue.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">messageQSize</td><td>size of the message queue. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">memoryPoolID</td><td>holds the created memory pool ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when message queue created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create message queue object. </dd></dl> + +</div> +</div> +<a class="anchor" id="adba13212ec060092acdf6165e82be5b6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMessageQueueDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">palMessageQID_t</a> * </td> + <td class="paramname"><em>messageQID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a message queue object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">messageQID</td><td>the handle for the message queue, in success:(*messageQID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="af89aab14085207b1a0951f7aad24193c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize Mutex object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[out]</td><td class="paramname">mutexID</td><td>holds the created mutex ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when mutex created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create mutex object. </dd></dl> + +</div> +</div> +<a class="anchor" id="a03f43d7e53435d89f316862b48b573c4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> * </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a Mutex object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">mutexID</td><td>Mutex handle to delete, in success:(*mutexID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when mutex deleted successfully. PAL_ERR_RTOS_RESOURCE - mutex already released. PAL_ERR_RTOS_PARAMETER - mutex id is invalid. PAL_ERR_RTOS_ISR - cannot be called from interrupt service routines. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call the mutex_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1d976a616a5c850b2016b2b87d8b47cc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a Mutex that was obtained by osMutexWait.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>the handle for the mutex </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="acda0974247325955719b23494d66c622"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osMutexWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">palMutexID_t</a> </td> + <td class="paramname"><em>mutexID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a Mutex becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">mutexID</td><td>the handle for the mutex </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>the timeout for the waiting operation if the timeout expires before the semaphore is released and error will be returned from the function, PAL_RTOS_WAIT_FOREVER can be used.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and one of the following error codes in case of failure: PAL_ERR_RTOS_RESOURCE - mutex not avaialbe but no time out set. PAL_ERR_RTOS_TIMEOUT - mutex was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - mutex id is invalid PAL_ERR_RTOS_ISR - cannot be called from interrupt service routines </dd></dl> + +</div> +</div> +<a class="anchor" id="a3a2b57685096d16a110ee38f7f29e099"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_osPoolAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>the handle for the memory pool</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns a pointer to a single allocated memory from the pool or NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a5d20661cd387a172450a2fe12993687a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_osPoolCAlloc </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Allocate a single memory block from a memory pool and set memory block to zero.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolID</td><td>the handle for the memory pool</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns a pointer to a single allocated memory from the pool or NULL in case of failure. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1245f053abb3fdb7ab2ceb5a2899e8c6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osPoolCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>blockCount</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">blockSize</td><td>size of single block in bytes. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">blockCount</td><td>maximum number of blocks in memory pool. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">memoryPoolID</td><td>holds the created memory pool ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when memory pool created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create memory pool object. </dd></dl> + +</div> +</div> +<a class="anchor" id="a1c01464448f8d7bd95bf518d651484c6"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osPoolDestroy </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> * </td> + <td class="paramname"><em>memoryPoolID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a memory pool object.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">memoryPoolID</td><td>the handle for the memory pool, in success:(*memoryPoolID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a79f4997069310aa7bbb6ae7995988dd7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osPoolFree </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">palMemoryPoolID_t</a> </td> + <td class="paramname"><em>memoryPoolID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>block</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Return an memoryPoolID memory block back to a specific memory pool.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">memoryPoolHandle</td><td>the handle for the memory pool </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">block</td><td>the block to free</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="ab8ab0f31bbf4258b7684d22e7725a9f8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void pal_osReboot </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Initiates a system reboot </p> + +</div> +</div> +<a class="anchor" id="aaa7aee442a5c8cc274d3e52206984037"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreCreate </td> + <td>(</td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>count</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Create and initialize a Semaphore object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">count</td><td>number of available resources </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">semaphoreID</td><td>holds the created semaphore ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when semaphore created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create semaphore object. </dd></dl> + +</div> +</div> +<a class="anchor" id="a45f071482f8669821b90264e0470b33d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> * </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete a Semaphore object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">semaphoreID</td><td>Semaphore handle to delete, in success:(*semaphoreID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when semaphore deleted successfully. PAL_ERR_RTOS_RESOURCE - semaphore already released. PAL_ERR_RTOS_PARAMETER - semaphore id is invalid. </dd></dl> +<dl class="section note"><dt>Note</dt><dd>After this call the semaphore_id is no longer valid and cannot be used. </dd></dl> + +</div> +</div> +<a class="anchor" id="a009d0c063119265f9c5c0c9bff379c14"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreRelease </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Release a Semaphore token.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>the handle for the semaphore</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="aa2d998744dbc9504bfe0358f85457fc4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osSemaphoreWait </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">palSemaphoreID_t</a> </td> + <td class="paramname"><em>semaphoreID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">int32_t * </td> + <td class="paramname"><em>countersAvailable</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Wait until a Semaphore token becomes available.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">semaphoreID</td><td>the handle for the semaphore </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>the timeout for the waiting operation if the timeout expires before the semaphore is released and error will be returned from the function, PAL_RTOS_WAIT_FOREVER can be used. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">counteresAvailable</td><td>the number of semaphore available at the call if semaphore is available, if semaphore was not available (timeout/error) zero is returned. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and one of the following error codes in case of failure: PAL_ERR_RTOS_TIMEOUT - semaphore was not available until timeout expired. PAL_ERR_RTOS_PARAMETER - semaphore id is invalid. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2dae64d917f644982b893037adf562b4"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osThreadCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">palThreadFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">palThreadPriority_t</a> </td> + <td class="paramname"><em>priority</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>stackSize</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t * </td> + <td class="paramname"><em>stackPtr</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">palThreadLocalStore_t</a> * </td> + <td class="paramname"><em>store</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Creates and starts thread function.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>function pointer to the thread callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>argument for the thread function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">priority</td><td>priotity of the thread. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackSize</td><td>the stack size of the thread can NOT be 0. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">stackPtr</td><td>pointer to the thread's stack can NOT be NULL. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">store</td><td>pointer to thread's local sotre, can be NULL. </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">threadID</td><td>holds the created thread ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when thread created successfully. PAL_ERR_RTOS_PRIORITY : the given priority already used before in the system.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>Each thread MUST be with unique priority. </dd> +<dd> +When the priority of the created thread function is higher than the current running thread, the created thread function starts instantly and becomes the new running thread. </dd></dl> + +</div> +</div> +<a class="anchor" id="a2993b8f6b5e8d7ccd6121dc18330e4be"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> pal_osThreadGetId </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get ID of the current thread </p><dl class="section return"><dt>Returns</dt><dd>the ID of the current thread - in case of error return PAL_MAX_UINT32 </dd></dl> +<dl class="section note"><dt>Note</dt><dd>for thread with Real Time priority the function will always return PAL_MAX_UINT32 </dd></dl> + +</div> +</div> +<a class="anchor" id="ac94f4efc4bad73969e57c8255c136a0d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_osThreadGetLocalStore </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Get the storage of current thread </p><dl class="section return"><dt>Returns</dt><dd>the storage of the current thread </dd></dl> + +</div> +</div> +<a class="anchor" id="abcfa47b411929b33d5d9cfaaff28ce18"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osThreadTerminate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">palThreadID_t</a> * </td> + <td class="paramname"><em>threadID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Terminates and free allocated data for the thread.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">threadID</td><td>thread ID to stop and terminate.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure PAL_ERR_RTOS_RESOURCE: if the thread ID is not correct. </dd></dl> + +</div> +</div> +<a class="anchor" id="aa4da36fbbba744a14d1bdfe2a26d1a18"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerCreate </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">palTimerFuncPtr</a> </td> + <td class="paramname"><em>function</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void * </td> + <td class="paramname"><em>funcArgument</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">palTimerType_t</a> </td> + <td class="paramname"><em>timerType</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Creates a Timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">function</td><td>function pointer to the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">funcArgument</td><td>funcArgument for the timer callback function. </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">timerType</td><td>timer type to be created - (periodic or oneShot). </td></tr> + <tr><td class="paramdir">[out]</td><td class="paramname">timerID</td><td>holds the created timer ID handle - zero value indecates an error.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when timer created successfully. PAL_ERR_NO_MEMORY: no memory resource available to create timer object.</dd></dl> +<dl class="section note"><dt>Note</dt><dd>the timer function runs according to the platform resources of stack-size and priority. </dd></dl> + +</div> +</div> +<a class="anchor" id="ac7ca6e7c3c229f4092c9df4b69e7dd59"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerDelete </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> * </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Delete the timer object</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in,out]</td><td class="paramname">timerID</td><td>the handle for the timer to delete, in success:(*timerID = NULL).</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>PAL_SUCCESS when timer deleted successfully. PAL_ERR_RTOS_PARAMETER when timerID is incorrect. </dd></dl> + +</div> +</div> +<a class="anchor" id="a6c60c9e433bc6005bac6b02d5aba7363"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerStart </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">uint32_t </td> + <td class="paramname"><em>millisec</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Start or restart a timer.</p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>the handle for the timer to start </td></tr> + <tr><td class="paramdir">[in]</td><td class="paramname">millisec</td><td>the amount of time in milliseconds to set the timer to.</td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +<a class="anchor" id="a94f4df594102e582cbd2114f6eebb57d"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">palStatus_t</a> pal_osTimerStop </td> + <td>(</td> + <td class="paramtype"><a class="el" href="../../d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">palTimerID_t</a> </td> + <td class="paramname"><em>timerID</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> +<p>Stop a timer. </p><dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">timerID</td><td>the handle for the timer to stop </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>the function returns the status in the form of palStatus_t which will be <a class="el" href="../../d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">PAL_SUCCESS(0)</a> in case of success and another negative value indicating a specific error code in case of failure </dd></dl> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/de/dfc/structpal__time_val.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,99 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: pal_timeVal Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">pal_timeVal Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:a8c0bfa9026d4b23b598f0652aa975fcf"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf">pal_tv_sec</a></td></tr> +<tr class="separator:a8c0bfa9026d4b23b598f0652aa975fcf"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:acf8b8c0480064a16325f94f155db4e1c"><td class="memItemLeft" align="right" valign="top">int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c">pal_tv_usec</a></td></tr> +<tr class="separator:acf8b8c0480064a16325f94f155db4e1c"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="a8c0bfa9026d4b23b598f0652aa975fcf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int32_t pal_timeVal::pal_tv_sec</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="acf8b8c0480064a16325f94f155db4e1c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int32_t pal_timeVal::pal_tv_usec</td> + </tr> + </table> +</div><div class="memdoc"> +<p>seconds </p> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/<a class="el" href="../../d9/d17/pal__network_8h_source.html">pal_network.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/df/d0d/struct__pal_image_header_deails__t.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: _palImageHeaderDeails_t Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">_palImageHeaderDeails_t Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../dd/df9/pal__update_8h_source.html">pal_update.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:a5fcb0398af2a70c3e4fc9fa64afb77ba"><td class="memItemLeft" align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d0d/struct__pal_image_header_deails__t.html#a5fcb0398af2a70c3e4fc9fa64afb77ba">imageSize</a></td></tr> +<tr class="separator:a5fcb0398af2a70c3e4fc9fa64afb77ba"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afee39a7c86a46bf1f9de53284380869e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d0d/struct__pal_image_header_deails__t.html#afee39a7c86a46bf1f9de53284380869e">hash</a></td></tr> +<tr class="separator:afee39a7c86a46bf1f9de53284380869e"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a734411a639c41d6dc4b4252a006b134f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d0d/struct__pal_image_header_deails__t.html#a734411a639c41d6dc4b4252a006b134f">version</a></td></tr> +<tr class="separator:a734411a639c41d6dc4b4252a006b134f"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="afee39a7c86a46bf1f9de53284380869e"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> _palImageHeaderDeails_t::hash</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a5fcb0398af2a70c3e4fc9fa64afb77ba"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">size_t _palImageHeaderDeails_t::imageSize</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a734411a639c41d6dc4b4252a006b134f"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname"><a class="el" href="../../d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">palBuffer_t</a> _palImageHeaderDeails_t::version</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/<a class="el" href="../../dd/df9/pal__update_8h_source.html">pal_update.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,273 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest/pal_rtos_test_main_mbedOS.cpp File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> | +<a href="#var-members">Variables</a> </div> + <div class="headertitle"> +<div class="title">pal_rtos_test_main_mbedOS.cpp File Reference</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><code>#include "mbed.h"</code><br /> +<code>#include "rtos.h"</code><br /> +</div><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a6b71ffd718e2af00cebeb05560b44be7"><td class="memItemLeft" align="right" valign="top">DigitalOut </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">led1</a> (LED1)</td></tr> +<tr class="separator:a6b71ffd718e2af00cebeb05560b44be7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memItemLeft" align="right" valign="top">InterruptIn </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">sw2</a> (SW2)</td></tr> +<tr class="separator:af5543796fae8f0c3d5bfbd33f2389cb8"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a21e1e181f00d9dc8dbb912650459bfde"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">sw2_press</a> (void)</td></tr> +<tr class="separator:a21e1e181f00d9dc8dbb912650459bfde"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">led_thread</a> (void const *argument)</td></tr> +<tr class="separator:a602cc5fb415f60615dbfa0643b3b3e26"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:afe6a59684384290b7f8710db5203944a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">button_thread</a> (void const *argument)</td></tr> +<tr class="separator:afe6a59684384290b7f8710db5203944a"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a58ec279183697abbd5d3efea3442d4e5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">UnityMain</a> (int argc, const char *argv[], void(*runAllTests)(void))</td></tr> +<tr class="separator:a58ec279183697abbd5d3efea3442d4e5"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc">TEST_pal_rtos_GROUP_RUNNER</a> (void)</td></tr> +<tr class="separator:a9e9aa39842df82b3f5086f3215cc74fc"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ac0f2228420376f4db7e1274f2b41667c"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">main</a> (int argc, const char *argv[])</td></tr> +<tr class="separator:ac0f2228420376f4db7e1274f2b41667c"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a> +Variables</h2></td></tr> +<tr class="memitem:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">button_pressed</a></td></tr> +<tr class="separator:ae8697e1a75bad4a53dd6d6ec81e486cb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a7d37e93ff0246ad7bf396650eaf84487"><td class="memItemLeft" align="right" valign="top">Thread * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">thread2</a></td></tr> +<tr class="separator:a7d37e93ff0246ad7bf396650eaf84487"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="afe6a59684384290b7f8710db5203944a"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void button_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a6b71ffd718e2af00cebeb05560b44be7"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">DigitalOut led1 </td> + <td>(</td> + <td class="paramtype">LED1 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a602cc5fb415f60615dbfa0643b3b3e26"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void led_thread </td> + <td>(</td> + <td class="paramtype">void const * </td> + <td class="paramname"><em>argument</em></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="ac0f2228420376f4db7e1274f2b41667c"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int main </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[] </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="af5543796fae8f0c3d5bfbd33f2389cb8"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">InterruptIn sw2 </td> + <td>(</td> + <td class="paramtype">SW2 </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a21e1e181f00d9dc8dbb912650459bfde"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void sw2_press </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a9e9aa39842df82b3f5086f3215cc74fc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void TEST_pal_rtos_GROUP_RUNNER </td> + <td>(</td> + <td class="paramtype">void </td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a58ec279183697abbd5d3efea3442d4e5"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">int UnityMain </td> + <td>(</td> + <td class="paramtype">int </td> + <td class="paramname"><em>argc</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const char * </td> + <td class="paramname"><em>argv</em>[], </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">void(*)(void) </td> + <td class="paramname"><em>runAllTests</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<h2 class="groupheader">Variable Documentation</h2> +<a class="anchor" id="ae8697e1a75bad4a53dd6d6ec81e486cb"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">uint32_t button_pressed</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<a class="anchor" id="a7d37e93ff0246ad7bf396650eaf84487"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">Thread* thread2</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/df/d2a/pal__socket__test__utils_8h.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,87 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_socket_test_utils.h File Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#func-members">Functions</a> </div> + <div class="headertitle"> +<div class="title">pal_socket_test_utils.h File Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><a href="../../df/d2a/pal__socket__test__utils_8h_source.html">Go to the source code of this file.</a></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> +Functions</h2></td></tr> +<tr class="memitem:a5e4a39a385159acfd150a2e6098351cf"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d2a/pal__socket__test__utils_8h.html#a5e4a39a385159acfd150a2e6098351cf">palTestGetNetWorkInterfaceContext</a> ()</td></tr> +<tr class="separator:a5e4a39a385159acfd150a2e6098351cf"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<h2 class="groupheader">Function Documentation</h2> +<a class="anchor" id="a5e4a39a385159acfd150a2e6098351cf"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* palTestGetNetWorkInterfaceContext </td> + <td>(</td> + <td class="paramname"></td><td>)</td> + <td></td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/df/d2a/pal__socket__test__utils_8h_source.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,62 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common/pal_socket_test_utils.h Source File</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../files.html"><span>File List</span></a></li> + <li><a href="../../globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="../../dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="../../dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">pal_socket_test_utils.h</div> </div> +</div><!--header--> +<div class="contents"> +<a href="../../df/d2a/pal__socket__test__utils_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Copyright (c) 2016 ARM Limited. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">* SPDX-License-Identifier: Apache-2.0</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">* Licensed under the Apache License, Version 2.0 (the License); you may</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">* not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">* You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">*</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">* http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">*</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">* Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">* distributed under the License is distributed on an AS IS BASIS, WITHOUT</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">* See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">* limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">*/</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#ifndef _PAL_SOCKET_TEST_UTILS_H</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#define _PAL_SOCKET_TEST_UTILS_H</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="keywordtype">void</span>* <a class="code" href="../../df/d2a/pal__socket__test__utils_8h.html#a5e4a39a385159acfd150a2e6098351cf">palTestGetNetWorkInterfaceContext</a>();</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> }</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#endif //_PAL_SOCKET_TEST_UTILS_H</span></div><div class="ttc" id="pal__socket__test__utils_8h_html_a5e4a39a385159acfd150a2e6098351cf"><div class="ttname"><a href="../../df/d2a/pal__socket__test__utils_8h.html#a5e4a39a385159acfd150a2e6098351cf">palTestGetNetWorkInterfaceContext</a></div><div class="ttdeci">void * palTestGetNetWorkInterfaceContext()</div><div class="ttdef"><b>Definition:</b> pal_socket_test_utils.cpp:25</div></div> +</div><!-- fragment --></div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/df/d48/structpal__thread_local_store.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,86 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: pal_threadLocalStore Struct Reference</title> +<link href="../../tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="../../jquery.js"></script> +<script type="text/javascript" src="../../dynsections.js"></script> +<link href="../../doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="../../index.html"><span>Main Page</span></a></li> + <li class="current"><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="../../annotated.html"><span>Data Structures</span></a></li> + <li><a href="../../classes.html"><span>Data Structure Index</span></a></li> + <li><a href="../../functions.html"><span>Data Fields</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="summary"> +<a href="#pub-attribs">Data Fields</a> </div> + <div class="headertitle"> +<div class="title">pal_threadLocalStore Struct Reference</div> </div> +</div><!--header--> +<div class="contents"> + +<p><code>#include <<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a>></code></p> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a> +Data Fields</h2></td></tr> +<tr class="memitem:abe68dca8335fc1c9e6da5359117625bc"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="../../df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc">storeData</a></td></tr> +<tr class="separator:abe68dca8335fc1c9e6da5359117625bc"><td class="memSeparator" colspan="2"> </td></tr> +</table> +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> +<div class="textblock"><p>Thread priority levels for PAL threads - each thread must have a different priority Thread Local Store struct. Can be used to hold: State, configurations and etc inside the thread. </p> +</div><h2 class="groupheader">Field Documentation</h2> +<a class="anchor" id="abe68dca8335fc1c9e6da5359117625bc"></a> +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* pal_threadLocalStore::storeData</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> +<hr/>The documentation for this struct was generated from the following file:<ul> +<li>C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API/<a class="el" href="../../d4/d01/pal__rtos_8h_source.html">pal_rtos.h</a></li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="../../doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_0a6b9d10733e8fa4306fa781def1f127.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Modules/RTOS Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></li><li class="navelem"><a class="el" href="dir_0a6b9d10733e8fa4306fa781def1f127.html">RTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">RTOS Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:de/d33/pal__rtos_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="de/d33/pal__rtos_8c.html">pal_rtos.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_0bf78cffa0901bd3b5cb7be7888aabc9.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Port Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_21bbc5adf7d2637a4cb8a3cee979c96f"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dir_c08386f3c1aee312ced83a5951d11ed6"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_13f791b89962c34a017839eda04eb72e.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/FreeRTOS/Networking/LWIP Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="dir_352f9dac526e52874364d2b56bbb5ef5.html">FreeRTOS</a></li><li class="navelem"><a class="el" href="dir_1c5e63936b3e43504237da8820a7bc34.html">Networking</a></li><li class="navelem"><a class="el" href="dir_13f791b89962c34a017839eda04eb72e.html">LWIP</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">LWIP Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:dc/d89/pal__plat__socket__lwip_8cpp"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="dc/d89/pal__plat__socket__lwip_8cpp.html">pal_plat_socket_lwip.cpp</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_1460475e8e667d8c97e1be97dbcd2231.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/mbedOS/RTOS Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></li><li class="navelem"><a class="el" href="dir_1460475e8e667d8c97e1be97dbcd2231.html">RTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">RTOS Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d4/dc5/pal__plat__rtos_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d4/dc5/pal__plat__rtos_8c.html">pal_plat_rtos.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_18cc01a76aedd55acdee1b7ef37dd546.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Services-API Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Services-API Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d9/d16/pal_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d9/d16/pal_8h.html">pal.h</a> <a href="d9/d16/pal_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d2/d87/pal__configuration_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d2/d87/pal__configuration_8h.html">pal_configuration.h</a> <a href="d2/d87/pal__configuration_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:da/dfe/pal__errors_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="da/dfe/pal__errors_8h.html">pal_errors.h</a> <a href="da/dfe/pal__errors_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:db/dcf/pal__macros_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="db/dcf/pal__macros_8h.html">pal_macros.h</a> <a href="db/dcf/pal__macros_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d9/d17/pal__network_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d9/d17/pal__network_8h.html">pal_network.h</a> <a href="d9/d17/pal__network_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d4/d01/pal__rtos_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d4/d01/pal__rtos_8h.html">pal_rtos.h</a> <a href="d4/d01/pal__rtos_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d6/dc2/pal__types_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d6/dc2/pal__types_8h.html">pal_types.h</a> <a href="d6/dc2/pal__types_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_1c5e63936b3e43504237da8820a7bc34.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/FreeRTOS/Networking Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="dir_352f9dac526e52874364d2b56bbb5ef5.html">FreeRTOS</a></li><li class="navelem"><a class="el" href="dir_1c5e63936b3e43504237da8820a7bc34.html">Networking</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Networking Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_13f791b89962c34a017839eda04eb72e"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_13f791b89962c34a017839eda04eb72e.html">LWIP</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_21bbc5adf7d2637a4cb8a3cee979c96f.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Platform-API Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_21bbc5adf7d2637a4cb8a3cee979c96f.html">Platform-API</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Platform-API Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d9/d2c/pal__plat__network_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d9/d2c/pal__plat__network_8h.html">pal_plat_network.h</a> <a href="d9/d2c/pal__plat__network_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d5/d59/pal__plat__rtos_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d5/d59/pal__plat__rtos_8h.html">pal_plat_rtos.h</a> <a href="d5/d59/pal__plat__rtos_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_352f9dac526e52874364d2b56bbb5ef5.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/FreeRTOS Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="dir_352f9dac526e52874364d2b56bbb5ef5.html">FreeRTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">FreeRTOS Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_1c5e63936b3e43504237da8820a7bc34"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_1c5e63936b3e43504237da8820a7bc34.html">Networking</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_37618a71d99bdfed5979e976980d5eec.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Test Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_f8e9a069a0807d5f7341f9bc5892e16f"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dir_b922272f3c09a4cbb928a2f2eda5adf8"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_5097254b22164c5ad71a4eec719a72ee.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Modules Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Modules Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_59e3d70b06141856a554dd7aab1293ae"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_59e3d70b06141856a554dd7aab1293ae.html">Networking</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dir_0a6b9d10733e8fa4306fa781def1f127"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_0a6b9d10733e8fa4306fa781def1f127.html">RTOS</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_59e3d70b06141856a554dd7aab1293ae.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Modules/Networking Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></li><li class="navelem"><a class="el" href="dir_59e3d70b06141856a554dd7aab1293ae.html">Networking</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Networking Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d1/dc4/pal__network_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d1/dc4/pal__network_8c.html">pal_network.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_5b516ef453fd36a0929ce414690fe335.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/BUILD_FreeRTOS Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="dir_5b516ef453fd36a0929ce414690fe335.html">BUILD_FreeRTOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">BUILD_FreeRTOS Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:de/d33/_free_r_t_o_s_config_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="de/d33/_free_r_t_o_s_config_8h.html">FreeRTOSConfig.h</a> <a href="de/d33/_free_r_t_o_s_config_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_74389ed8173ad57b461b9d623a1f3867.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Source Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_8a9a67948239eaee56ff05ba80ad2d3c"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dir_0bf78cffa0901bd3b5cb7be7888aabc9"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/mbedOS Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">mbedOS Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_ddf5611ee10e8b15ebe1664d2c043f4e"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_ddf5611ee10e8b15ebe1664d2c043f4e.html">Networking</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dir_1460475e8e667d8c97e1be97dbcd2231"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_1460475e8e667d8c97e1be97dbcd2231.html">RTOS</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_8a9a67948239eaee56ff05ba80ad2d3c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,74 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">PAL-Impl Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_5097254b22164c5ad71a4eec719a72ee"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dir_18cc01a76aedd55acdee1b7ef37dd546"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_18cc01a76aedd55acdee1b7ef37dd546.html">Services-API</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table><table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d7/d66/pal__init_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d7/d66/pal__init_8c.html">pal_init.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_a9ff65e3f848f462604f5439bae27718.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/PAL-Impl/Modules/Update Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html">PAL-Impl</a></li><li class="navelem"><a class="el" href="dir_5097254b22164c5ad71a4eec719a72ee.html">Modules</a></li><li class="navelem"><a class="el" href="dir_a9ff65e3f848f462604f5439bae27718.html">Update</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Update Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:da/da9/pal__update_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="da/da9/pal__update_8c.html">pal_update.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_b922272f3c09a4cbb928a2f2eda5adf8.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Unitest Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="dir_b922272f3c09a4cbb928a2f2eda5adf8.html">Unitest</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Unitest Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d5/de2/pal__all__test_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d5/de2/pal__all__test_8c.html">pal_all_test.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dd/d30/pal__all__test__main__mbed_o_s_8cpp"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html">pal_all_test_main_mbedOS.cpp</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d3/dab/pal__all__test__runner_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d3/dab/pal__all__test__runner_8c.html">pal_all_test_runner.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:da/d2d/pal__rtos__test_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="da/d2d/pal__rtos__test_8c.html">pal_rtos_test.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:df/d12/pal__rtos__test__main__mbed_o_s_8cpp"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html">pal_rtos_test_main_mbedOS.cpp</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dd/df6/pal__rtos__test__runner_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="dd/df6/pal__rtos__test__runner_8c.html">pal_rtos_test_runner.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d5/d2a/pal__socket__test_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d5/d2a/pal__socket__test_8c.html">pal_socket_test.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d9/dc0/pal__socket__test__main__mbed_o_s_8cpp"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html">pal_socket_test_main_mbedOS.cpp</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:dc/da5/pal__socket__test__runner_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="dc/da5/pal__socket__test__runner_8c.html">pal_socket_test_runner.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_c08386f3c1aee312ced83a5951d11ed6.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Reference-Impl Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a> +Directories</h2></td></tr> +<tr class="memitem:dir_7b7fa73f1a1b36d6dab78f50bb89ca7b"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_ddf5611ee10e8b15ebe1664d2c043f4e.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/mbedOS/Networking Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></li><li class="navelem"><a class="el" href="dir_ddf5611ee10e8b15ebe1664d2c043f4e.html">Networking</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Networking Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d3/dfb/pal__plat__network_8cpp"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d3/dfb/pal__plat__network_8cpp.html">pal_plat_network.cpp</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_e0c4a7f8a7dec467104a1fe0064ec60f.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Source/Port/Reference-Impl/mbedOS/Update Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html">Source</a></li><li class="navelem"><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html">Port</a></li><li class="navelem"><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html">Reference-Impl</a></li><li class="navelem"><a class="el" href="dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html">mbedOS</a></li><li class="navelem"><a class="el" href="dir_e0c4a7f8a7dec467104a1fe0064ec60f.html">Update</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Update Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d3/d44/pal__plat__update_8cpp"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d3/d44/pal__plat__update_8cpp.html">pal_plat_update.cpp</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dir_f8e9a069a0807d5f7341f9bc5892e16f.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,75 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: C:/work/PAL/zolFull/mbed-client-pal/Test/Common Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_37618a71d99bdfed5979e976980d5eec.html">Test</a></li><li class="navelem"><a class="el" href="dir_f8e9a069a0807d5f7341f9bc5892e16f.html">Common</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">Common Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:d1/dee/pal__rtos__test__utils_8c"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d1/dee/pal__rtos__test__utils_8c.html">pal_rtos_test_utils.c</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d9/d28/pal__rtos__test__utils_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d9/d28/pal__rtos__test__utils_8h.html">pal_rtos_test_utils.h</a> <a href="d9/d28/pal__rtos__test__utils_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d8/d5f/pal__socket__test__utils_8cpp"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d8/d5f/pal__socket__test__utils_8cpp.html">pal_socket_test_utils.cpp</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:df/d2a/pal__socket__test__utils_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="df/d2a/pal__socket__test__utils_8h.html">pal_socket_test_utils.h</a> <a href="df/d2a/pal__socket__test__utils_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:d0/d51/pal__test__utils_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="d0/d51/pal__test__utils_8h.html">pal_test_utils.h</a> <a href="d0/d51/pal__test__utils_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
Binary file pal/Docs/html/doc.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/doxygen.css Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1475 @@ +/* The standard CSS for doxygen 1.8.11 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px 6px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} +
Binary file pal/Docs/html/doxygen.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/dynsections.js Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l<level+1) { + i.removeClass('iconfopen iconfclosed').addClass('iconfopen'); + a.html('▼'); + $(this).show(); + } else if (l==level+1) { + i.removeClass('iconfclosed iconfopen').addClass('iconfclosed'); + a.html('►'); + $(this).show(); + } else { + $(this).hide(); + } + }); + updateStripes(); +} + +function toggleFolder(id) +{ + // the clicked row + var currentRow = $('#row_'+id); + + // all rows after the clicked row + var rows = currentRow.nextAll("tr"); + + var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub + + // only match elements AFTER this one (can't hide elements before) + var childRows = rows.filter(function() { return this.id.match(re); }); + + // first row is visible we are HIDING + if (childRows.filter(':first').is(':visible')===true) { + // replace down arrow by right arrow for current row + var currentRowSpans = currentRow.find("span"); + currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); + currentRowSpans.filter(".arrow").html('►'); + rows.filter("[id^=row_"+id+"]").hide(); // hide all children + } else { // we are SHOWING + // replace right arrow by down arrow for current row + var currentRowSpans = currentRow.find("span"); + currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen"); + currentRowSpans.filter(".arrow").html('▼'); + // replace down arrows by right arrows for child rows + var childRowsSpans = childRows.find("span"); + childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); + childRowsSpans.filter(".arrow").html('►'); + childRows.show(); //show all children + } + updateStripes(); +} + + +function toggleInherit(id) +{ + var rows = $('tr.inherit.'+id); + var img = $('tr.inherit_header.'+id+' img'); + var src = $(img).attr('src'); + if (rows.filter(':first').is(':visible')===true) { + rows.css('display','none'); + $(img).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + rows.css('display','table-row'); // using show() causes jump in firefox + $(img).attr('src',src.substring(0,src.length-10)+'open.png'); + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/files.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,104 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: File List</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="files.html"><span>File List</span></a></li> + <li><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">File List</div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory"> +<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span><span onclick="javascript:toggleLevel(5);">5</span><span onclick="javascript:toggleLevel(6);">6</span>]</div><table class="directory"> +<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">▼</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')"> </span><a class="el" href="dir_74389ed8173ad57b461b9d623a1f3867.html" target="_self">Source</a></td><td class="desc"></td></tr> +<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">▼</span><span id="img_0_0_" class="iconfopen" onclick="toggleFolder('0_0_')"> </span><a class="el" href="dir_8a9a67948239eaee56ff05ba80ad2d3c.html" target="_self">PAL-Impl</a></td><td class="desc"></td></tr> +<tr id="row_0_0_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span id="arr_0_0_0_" class="arrow" onclick="toggleFolder('0_0_0_')">▼</span><span id="img_0_0_0_" class="iconfopen" onclick="toggleFolder('0_0_0_')"> </span><a class="el" href="dir_5097254b22164c5ad71a4eec719a72ee.html" target="_self">Modules</a></td><td class="desc"></td></tr> +<tr id="row_0_0_0_0_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span id="arr_0_0_0_0_" class="arrow" onclick="toggleFolder('0_0_0_0_')">▼</span><span id="img_0_0_0_0_" class="iconfopen" onclick="toggleFolder('0_0_0_0_')"> </span><a class="el" href="dir_59e3d70b06141856a554dd7aab1293ae.html" target="_self">Networking</a></td><td class="desc"></td></tr> +<tr id="row_0_0_0_0_0_" class="even"><td class="entry"><span style="width:80px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d1/dc4/pal__network_8c.html" target="_self">pal_network.c</a></td><td class="desc"></td></tr> +<tr id="row_0_0_0_1_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span id="arr_0_0_0_1_" class="arrow" onclick="toggleFolder('0_0_0_1_')">▼</span><span id="img_0_0_0_1_" class="iconfopen" onclick="toggleFolder('0_0_0_1_')"> </span><a class="el" href="dir_0a6b9d10733e8fa4306fa781def1f127.html" target="_self">RTOS</a></td><td class="desc"></td></tr> +<tr id="row_0_0_0_1_0_" class="even"><td class="entry"><span style="width:80px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="de/d33/pal__rtos_8c.html" target="_self">pal_rtos.c</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span id="arr_0_0_1_" class="arrow" onclick="toggleFolder('0_0_1_')">▼</span><span id="img_0_0_1_" class="iconfopen" onclick="toggleFolder('0_0_1_')"> </span><a class="el" href="dir_18cc01a76aedd55acdee1b7ef37dd546.html" target="_self">Services-API</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_0_" class="even"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="d9/d16/pal_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d9/d16/pal_8h.html" target="_self">pal.h</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_1_"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="d2/d87/pal__configuration_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d2/d87/pal__configuration_8h.html" target="_self">pal_configuration.h</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_2_" class="even"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="da/dfe/pal__errors_8h_source.html"><span class="icondoc"></span></a><a class="el" href="da/dfe/pal__errors_8h.html" target="_self">pal_errors.h</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_3_"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="db/dcf/pal__macros_8h_source.html"><span class="icondoc"></span></a><a class="el" href="db/dcf/pal__macros_8h.html" target="_self">pal_macros.h</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_4_" class="even"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="d9/d17/pal__network_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d9/d17/pal__network_8h.html" target="_self">pal_network.h</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_5_"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="d4/d01/pal__rtos_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d4/d01/pal__rtos_8h.html" target="_self">pal_rtos.h</a></td><td class="desc"></td></tr> +<tr id="row_0_0_1_6_" class="even"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="d6/dc2/pal__types_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d6/dc2/pal__types_8h.html" target="_self">pal_types.h</a></td><td class="desc"></td></tr> +<tr id="row_0_0_2_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d7/d66/pal__init_8c.html" target="_self">pal_init.c</a></td><td class="desc"></td></tr> +<tr id="row_0_1_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span id="arr_0_1_" class="arrow" onclick="toggleFolder('0_1_')">▼</span><span id="img_0_1_" class="iconfopen" onclick="toggleFolder('0_1_')"> </span><a class="el" href="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html" target="_self">Port</a></td><td class="desc"></td></tr> +<tr id="row_0_1_0_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span id="arr_0_1_0_" class="arrow" onclick="toggleFolder('0_1_0_')">▼</span><span id="img_0_1_0_" class="iconfopen" onclick="toggleFolder('0_1_0_')"> </span><a class="el" href="dir_21bbc5adf7d2637a4cb8a3cee979c96f.html" target="_self">Platform-API</a></td><td class="desc"></td></tr> +<tr id="row_0_1_0_0_" class="even"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="d9/d2c/pal__plat__network_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d9/d2c/pal__plat__network_8h.html" target="_self">pal_plat_network.h</a></td><td class="desc"></td></tr> +<tr id="row_0_1_0_1_"><td class="entry"><span style="width:64px;display:inline-block;"> </span><a href="d5/d59/pal__plat__rtos_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d5/d59/pal__plat__rtos_8h.html" target="_self">pal_plat_rtos.h</a></td><td class="desc"></td></tr> +<tr id="row_0_1_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span id="arr_0_1_1_" class="arrow" onclick="toggleFolder('0_1_1_')">▼</span><span id="img_0_1_1_" class="iconfopen" onclick="toggleFolder('0_1_1_')"> </span><a class="el" href="dir_c08386f3c1aee312ced83a5951d11ed6.html" target="_self">Reference-Impl</a></td><td class="desc"></td></tr> +<tr id="row_0_1_1_0_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span id="arr_0_1_1_0_" class="arrow" onclick="toggleFolder('0_1_1_0_')">▼</span><span id="img_0_1_1_0_" class="iconfopen" onclick="toggleFolder('0_1_1_0_')"> </span><a class="el" href="dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html" target="_self">mbedOS</a></td><td class="desc"></td></tr> +<tr id="row_0_1_1_0_0_" class="even"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span id="arr_0_1_1_0_0_" class="arrow" onclick="toggleFolder('0_1_1_0_0_')">▼</span><span id="img_0_1_1_0_0_" class="iconfopen" onclick="toggleFolder('0_1_1_0_0_')"> </span><a class="el" href="dir_ddf5611ee10e8b15ebe1664d2c043f4e.html" target="_self">Networking</a></td><td class="desc"></td></tr> +<tr id="row_0_1_1_0_0_0_"><td class="entry"><span style="width:96px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d3/dfb/pal__plat__network_8cpp.html" target="_self">pal_plat_network.cpp</a></td><td class="desc"></td></tr> +<tr id="row_0_1_1_0_1_" class="even"><td class="entry"><span style="width:64px;display:inline-block;"> </span><span id="arr_0_1_1_0_1_" class="arrow" onclick="toggleFolder('0_1_1_0_1_')">▼</span><span id="img_0_1_1_0_1_" class="iconfopen" onclick="toggleFolder('0_1_1_0_1_')"> </span><a class="el" href="dir_1460475e8e667d8c97e1be97dbcd2231.html" target="_self">RTOS</a></td><td class="desc"></td></tr> +<tr id="row_0_1_1_0_1_0_"><td class="entry"><span style="width:96px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d4/dc5/pal__plat__rtos_8c.html" target="_self">pal_plat_rtos.c</a></td><td class="desc"></td></tr> +<tr id="row_1_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">▼</span><span id="img_1_" class="iconfopen" onclick="toggleFolder('1_')"> </span><a class="el" href="dir_37618a71d99bdfed5979e976980d5eec.html" target="_self">Test</a></td><td class="desc"></td></tr> +<tr id="row_1_0_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span id="arr_1_0_" class="arrow" onclick="toggleFolder('1_0_')">▼</span><span id="img_1_0_" class="iconfopen" onclick="toggleFolder('1_0_')"> </span><a class="el" href="dir_f8e9a069a0807d5f7341f9bc5892e16f.html" target="_self">Common</a></td><td class="desc"></td></tr> +<tr id="row_1_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d1/dee/pal__rtos__test__utils_8c.html" target="_self">pal_rtos_test_utils.c</a></td><td class="desc"></td></tr> +<tr id="row_1_0_1_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><a href="d9/d28/pal__rtos__test__utils_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d9/d28/pal__rtos__test__utils_8h.html" target="_self">pal_rtos_test_utils.h</a></td><td class="desc"></td></tr> +<tr id="row_1_0_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d8/d5f/pal__socket__test__utils_8cpp.html" target="_self">pal_socket_test_utils.cpp</a></td><td class="desc"></td></tr> +<tr id="row_1_0_3_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><a href="df/d2a/pal__socket__test__utils_8h_source.html"><span class="icondoc"></span></a><a class="el" href="df/d2a/pal__socket__test__utils_8h.html" target="_self">pal_socket_test_utils.h</a></td><td class="desc"></td></tr> +<tr id="row_1_0_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><a href="d0/d51/pal__test__utils_8h_source.html"><span class="icondoc"></span></a><a class="el" href="d0/d51/pal__test__utils_8h.html" target="_self">pal_test_utils.h</a></td><td class="desc"></td></tr> +<tr id="row_1_1_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span id="arr_1_1_" class="arrow" onclick="toggleFolder('1_1_')">▼</span><span id="img_1_1_" class="iconfopen" onclick="toggleFolder('1_1_')"> </span><a class="el" href="dir_b922272f3c09a4cbb928a2f2eda5adf8.html" target="_self">Unitest</a></td><td class="desc"></td></tr> +<tr id="row_1_1_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d5/de2/pal__all__test_8c.html" target="_self">pal_all_test.c</a></td><td class="desc"></td></tr> +<tr id="row_1_1_1_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html" target="_self">pal_all_test_main_mbedOS.cpp</a></td><td class="desc"></td></tr> +<tr id="row_1_1_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d3/dab/pal__all__test__runner_8c.html" target="_self">pal_all_test_runner.c</a></td><td class="desc"></td></tr> +<tr id="row_1_1_3_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="da/d2d/pal__rtos__test_8c.html" target="_self">pal_rtos_test.c</a></td><td class="desc"></td></tr> +<tr id="row_1_1_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html" target="_self">pal_rtos_test_main_mbedOS.cpp</a></td><td class="desc"></td></tr> +<tr id="row_1_1_5_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="dd/df6/pal__rtos__test__runner_8c.html" target="_self">pal_rtos_test_runner.c</a></td><td class="desc"></td></tr> +<tr id="row_1_1_6_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d5/d2a/pal__socket__test_8c.html" target="_self">pal_socket_test.c</a></td><td class="desc"></td></tr> +<tr id="row_1_1_7_"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html" target="_self">pal_socket_test_main_mbedOS.cpp</a></td><td class="desc"></td></tr> +<tr id="row_1_1_8_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icondoc"></span><a class="el" href="dc/da5/pal__socket__test__runner_8c.html" target="_self">pal_socket_test_runner.c</a></td><td class="desc"></td></tr> +</table> +</div><!-- directory --> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
Binary file pal/Docs/html/folderclosed.png has changed
Binary file pal/Docs/html/folderopen.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/functions.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Data Fields</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="classes.html"><span>Data Structure Index</span></a></li> + <li class="current"><a href="functions.html"><span>Data Fields</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="functions.html"><span>All</span></a></li> + <li><a href="functions_vars.html"><span>Variables</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div><ul> +<li>address +: <a class="el" href="d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d">palNetInterfaceInfo</a> +</li> +<li>addressData +: <a class="el" href="db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c">palSocketAddress</a> +</li> +<li>addressSize +: <a class="el" href="d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e">palNetInterfaceInfo</a> +</li> +<li>addressType +: <a class="el" href="db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221">palSocketAddress</a> +</li> +<li>arg1 +: <a class="el" href="d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639">threadsArgument</a> +</li> +<li>arg2 +: <a class="el" href="d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78">threadsArgument</a> +</li> +<li>arg3 +: <a class="el" href="d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4">threadsArgument</a> +</li> +<li>arg4 +: <a class="el" href="d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a">threadsArgument</a> +</li> +<li>arg5 +: <a class="el" href="d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9">threadsArgument</a> +</li> +<li>arg6 +: <a class="el" href="d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074">threadsArgument</a> +</li> +<li>arg7 +: <a class="el" href="d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74">threadsArgument</a> +</li> +<li>buffer +: <a class="el" href="d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb">_palBuffer_t</a> +, <a class="el" href="d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3">_palConstBuffer_t</a> +</li> +<li>bufferLength +: <a class="el" href="d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a">_palBuffer_t</a> +, <a class="el" href="d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801">_palConstBuffer_t</a> +</li> +<li>interfaceName +: <a class="el" href="d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6">palNetInterfaceInfo</a> +</li> +<li>maxBufferLength +: <a class="el" href="d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd">_palBuffer_t</a> +, <a class="el" href="d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7">_palConstBuffer_t</a> +</li> +<li>pal_tv_sec +: <a class="el" href="de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf">pal_timeVal</a> +</li> +<li>pal_tv_usec +: <a class="el" href="de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c">pal_timeVal</a> +</li> +<li>storeData +: <a class="el" href="df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc">pal_threadLocalStore</a> +</li> +<li>ticksBeforeTimer +: <a class="el" href="dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1">timerArgument</a> +</li> +<li>ticksInFunc1 +: <a class="el" href="dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08">timerArgument</a> +</li> +<li>ticksInFunc2 +: <a class="el" href="dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34">timerArgument</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/functions_vars.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,128 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Data Fields - Variables</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="classes.html"><span>Data Structure Index</span></a></li> + <li class="current"><a href="functions.html"><span>Data Fields</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="functions.html"><span>All</span></a></li> + <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> + <ul> +<li>address +: <a class="el" href="d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d">palNetInterfaceInfo</a> +</li> +<li>addressData +: <a class="el" href="db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c">palSocketAddress</a> +</li> +<li>addressSize +: <a class="el" href="d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e">palNetInterfaceInfo</a> +</li> +<li>addressType +: <a class="el" href="db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221">palSocketAddress</a> +</li> +<li>arg1 +: <a class="el" href="d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639">threadsArgument</a> +</li> +<li>arg2 +: <a class="el" href="d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78">threadsArgument</a> +</li> +<li>arg3 +: <a class="el" href="d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4">threadsArgument</a> +</li> +<li>arg4 +: <a class="el" href="d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a">threadsArgument</a> +</li> +<li>arg5 +: <a class="el" href="d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9">threadsArgument</a> +</li> +<li>arg6 +: <a class="el" href="d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074">threadsArgument</a> +</li> +<li>arg7 +: <a class="el" href="d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74">threadsArgument</a> +</li> +<li>buffer +: <a class="el" href="d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb">_palBuffer_t</a> +, <a class="el" href="d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3">_palConstBuffer_t</a> +</li> +<li>bufferLength +: <a class="el" href="d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a">_palBuffer_t</a> +, <a class="el" href="d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801">_palConstBuffer_t</a> +</li> +<li>interfaceName +: <a class="el" href="d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6">palNetInterfaceInfo</a> +</li> +<li>maxBufferLength +: <a class="el" href="d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd">_palBuffer_t</a> +, <a class="el" href="d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7">_palConstBuffer_t</a> +</li> +<li>pal_tv_sec +: <a class="el" href="de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf">pal_timeVal</a> +</li> +<li>pal_tv_usec +: <a class="el" href="de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c">pal_timeVal</a> +</li> +<li>storeData +: <a class="el" href="df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc">pal_threadLocalStore</a> +</li> +<li>ticksBeforeTimer +: <a class="el" href="dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1">timerArgument</a> +</li> +<li>ticksInFunc1 +: <a class="el" href="dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08">timerArgument</a> +</li> +<li>ticksInFunc2 +: <a class="el" href="dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34">timerArgument</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li class="current"><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_b"></a>- b -</h3><ul> +<li>button_pressed +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>button_thread() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_socket_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_a.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,97 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index__"><span>_</span></a></li> + <li class="current"><a href="globals_a.html#index_a"><span>a</span></a></li> + <li><a href="globals_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_i.html#index_i"><span>i</span></a></li> + <li><a href="globals_k.html#index_k"><span>k</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li><a href="globals_v.html#index_v"><span>v</span></a></li> + <li><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_a"></a>- a -</h3><ul> +<li>APP_DEBUG_UART_BAUDRATE +: <a class="el" href="d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#a37fa0e609ebaa8565ad388e41cc92a43">pal_rtos_test_main_FreeRTOS.c</a> +, <a class="el" href="d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#a37fa0e609ebaa8565ad388e41cc92a43">pal_socket_test_main_FreeRTOS.c</a> +</li> +<li>APP_DEBUG_UART_CLKSRC_NAME +: <a class="el" href="d2/d3a/pal__rtos__test__main___free_r_t_o_s_8c.html#a3b196c652283b89130c86ca7bd1559bc">pal_rtos_test_main_FreeRTOS.c</a> +, <a class="el" href="d6/d71/pal__socket__test__main___free_r_t_o_s_8c.html#a3b196c652283b89130c86ca7bd1559bc">pal_socket_test_main_FreeRTOS.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_b.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,99 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_a"><span>a</span></a></li> + <li class="current"><a href="globals_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_i.html#index_i"><span>i</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li><a href="globals_v.html#index_v"><span>v</span></a></li> + <li><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_b"></a>- b -</h3><ul> +<li>button_pressed +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_rtos_test_main_mbedosClassic.cpp</a> +, <a class="el" href="da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_socket_test_main_mbedosClassic.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>button_thread() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_socket_test_main_mbedosClassic.cpp</a> +, <a class="el" href="d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_rtos_test_main_mbedosClassic.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_socket_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_c.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,186 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_a"><span>a</span></a></li> + <li><a href="globals_b.html#index_b"><span>b</span></a></li> + <li class="current"><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_i.html#index_i"><span>i</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li><a href="globals_v.html#index_v"><span>v</span></a></li> + <li><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_c"></a>- c -</h3><ul> +<li>configASSERT +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#adeb674dafd926ad4dd27b70ecdc41163">FreeRTOSConfig.h</a> +</li> +<li>configCHECK_FOR_STACK_OVERFLOW +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a847511ee433494b1e32c90602c967ae7">FreeRTOSConfig.h</a> +</li> +<li>configCPU_CLOCK_HZ +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#aa68082df879e6fc96bcb9b26513639e7">FreeRTOSConfig.h</a> +</li> +<li>configGENERATE_RUN_TIME_STATS +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ad8081822f3ebc7c917b63bd7bdd7bc58">FreeRTOSConfig.h</a> +</li> +<li>configIDLE_SHOULD_YIELD +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ad6a5061a742fee450ac455e4ad0f4b6c">FreeRTOSConfig.h</a> +</li> +<li>configKERNEL_INTERRUPT_PRIORITY +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ac42cff506ad61d4174fa23e952e3225e">FreeRTOSConfig.h</a> +</li> +<li>configLIBRARY_LOWEST_INTERRUPT_PRIORITY +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a10da20f180ec9bd131b0052a802dbc39">FreeRTOSConfig.h</a> +</li> +<li>configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a2254bd235d882be3061bcad0b1e8be98">FreeRTOSConfig.h</a> +</li> +<li>configMAX_CO_ROUTINE_PRIORITIES +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ae8f3fd645e6e78dfeb8a6e874af6195a">FreeRTOSConfig.h</a> +</li> +<li>configMAX_PRIORITIES +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a9a78f5ac61e6cb172dadf2a51f11db38">FreeRTOSConfig.h</a> +</li> +<li>configMAX_SYSCALL_INTERRUPT_PRIORITY +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a54bfc31c410ee452577a25a4552c3704">FreeRTOSConfig.h</a> +</li> +<li>configMAX_TASK_NAME_LEN +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ac388dc4041aab6997348828eb27fc1a8">FreeRTOSConfig.h</a> +</li> +<li>configMINIMAL_STACK_SIZE +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a6c534a6cf8a00528fe0be42083484f9a">FreeRTOSConfig.h</a> +</li> +<li>configPRIO_BITS +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a5796db11ec6f9aa38d017d2ac393c5ba">FreeRTOSConfig.h</a> +</li> +<li>configQUEUE_REGISTRY_SIZE +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#aa4b5138c4e42a180f0abd4f2455f90fb">FreeRTOSConfig.h</a> +</li> +<li>configTICK_RATE_HZ +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a2f0258dd1e3b877e5bc013be54c2db6a">FreeRTOSConfig.h</a> +</li> +<li>configTIMER_QUEUE_LENGTH +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#abb9aa0f31c1f3b14a15083a3c6120918">FreeRTOSConfig.h</a> +</li> +<li>configTIMER_TASK_PRIORITY +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a05c75ff9029ba3f0ab5bde9196f1e873">FreeRTOSConfig.h</a> +</li> +<li>configTIMER_TASK_STACK_DEPTH +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#aed7c7ebcdee603583a55e8ce04e55841">FreeRTOSConfig.h</a> +</li> +<li>configTOTAL_HEAP_SIZE +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a9f213227674effff0122a75d94d87938">FreeRTOSConfig.h</a> +</li> +<li>configUSE_16_BIT_TICKS +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#aac311ed9b9e5ae4d2d9648b33a24acce">FreeRTOSConfig.h</a> +</li> +<li>configUSE_APPLICATION_TASK_TAG +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a2eb2a0baf886a7adab15b5735029434b">FreeRTOSConfig.h</a> +</li> +<li>configUSE_CO_ROUTINES +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a57990715eb06402474b8b47e1d562616">FreeRTOSConfig.h</a> +</li> +<li>configUSE_COUNTING_SEMAPHORES +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a55778995203c57369d2fbfb10224943d">FreeRTOSConfig.h</a> +</li> +<li>configUSE_IDLE_HOOK +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ac637ae45863c19fa2e919db0ed49301f">FreeRTOSConfig.h</a> +</li> +<li>configUSE_MALLOC_FAILED_HOOK +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#abdf48e7c9cf513f083aa9cbed0dd7cd7">FreeRTOSConfig.h</a> +</li> +<li>configUSE_MUTEXES +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a543bf3c79008974cc1d36bab51d94fbf">FreeRTOSConfig.h</a> +</li> +<li>configUSE_PREEMPTION +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#adde83486022745409c40605922b0bdd6">FreeRTOSConfig.h</a> +</li> +<li>configUSE_RECURSIVE_MUTEXES +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a9fe02d866cb1c4fbaa0c3de79f53d42d">FreeRTOSConfig.h</a> +</li> +<li>configUSE_TICK_HOOK +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a23c5922c077106fad3f70b54d9071466">FreeRTOSConfig.h</a> +</li> +<li>configUSE_TIME_SLICING +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a493c5763eb7a39bd80779a1c58de0d82">FreeRTOSConfig.h</a> +</li> +<li>configUSE_TIMERS +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ac342ae309b0c53828d2ecad3e6de355b">FreeRTOSConfig.h</a> +</li> +<li>configUSE_TRACE_FACILITY +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a27f5ee137dc9f125681a31f0b0a4b3be">FreeRTOSConfig.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_d.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li class="current"><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_d"></a>- d -</h3><ul> +<li>dbgPrintf() +: <a class="el" href="de/d33/pal__rtos_8c.html#a2b4f475c89ea263557d6529c4d9a9353">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353">pal_rtos.h</a> +</li> +<li>DEBUG_PRINT +: <a class="el" href="db/dcf/pal__macros_8h.html#aa1b662a1198e5729d6d0934a7efb02c4">pal_macros.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_defs.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,319 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li class="current"><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="#index_d"><span>d</span></a></li> + <li><a href="#index_l"><span>l</span></a></li> + <li><a href="#index_m"><span>m</span></a></li> + <li><a href="#index_n"><span>n</span></a></li> + <li><a href="#index_p"><span>p</span></a></li> + <li class="current"><a href="#index_t"><span>t</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_d"></a>- d -</h3><ul> +<li>DEBUG_PRINT +: <a class="el" href="db/dcf/pal__macros_8h.html#aa1b662a1198e5729d6d0934a7efb02c4">pal_macros.h</a> +</li> +</ul> + + +<h3><a class="anchor" id="index_l"></a>- l -</h3><ul> +<li>LITTLE__ENDIAN +: <a class="el" href="db/dcf/pal__macros_8h.html#a1651594dc71abf466bddd0f6393edb8b">pal_macros.h</a> +</li> +</ul> + + +<h3><a class="anchor" id="index_m"></a>- m -</h3><ul> +<li>MEMORY_POOL1_BLOCK_COUNT +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a3c0ce22bdba74fe398c6adefbc7fbbdf">pal_rtos_test_utils.h</a> +</li> +<li>MEMORY_POOL1_BLOCK_SIZE +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#ae3c2c737bcf6b45c3bf394dfe8349c4d">pal_rtos_test_utils.h</a> +</li> +<li>MEMORY_POOL2_BLOCK_COUNT +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a593d40fc26d9d1664c57988a846a888e">pal_rtos_test_utils.h</a> +</li> +<li>MEMORY_POOL2_BLOCK_SIZE +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a3c85d7e7f47d26444477603d8e2fd5d5">pal_rtos_test_utils.h</a> +</li> +</ul> + + +<h3><a class="anchor" id="index_n"></a>- n -</h3><ul> +<li>NULLPTR +: <a class="el" href="d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">pal_types.h</a> +</li> +</ul> + + +<h3><a class="anchor" id="index_p"></a>- p -</h3><ul> +<li>PAL_DIVIDE_ROUND_UP +: <a class="el" href="db/dcf/pal__macros_8h.html#a966411fe41e3830553bb1b8cf8baf730">pal_macros.h</a> +</li> +<li>PAL_HOST_TO_LITTLE_ENDIAN_16BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#a9bd4f76c3897b4338fe50a8d69830fe5">pal_macros.h</a> +</li> +<li>PAL_HOST_TO_LITTLE_ENDIAN_32BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ab01046a25df49d7fe1d85a8bf722975f">pal_macros.h</a> +</li> +<li>PAL_HOST_TO_LITTLE_ENDIAN_64BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#adc0a4752569188800a75e1601a7e11b5">pal_macros.h</a> +</li> +<li>PAL_HTONL +: <a class="el" href="db/dcf/pal__macros_8h.html#a55b1a7d9f939231045521ec4a4817cff">pal_macros.h</a> +</li> +<li>PAL_HTONS +: <a class="el" href="db/dcf/pal__macros_8h.html#a98390512a7c2732f1197b07acf03e226">pal_macros.h</a> +</li> +<li>PAL_INVERSE_UINT16_BYTES +: <a class="el" href="db/dcf/pal__macros_8h.html#ad989cc9220df56cd410590fc628e93b7">pal_macros.h</a> +</li> +<li>PAL_INVERSE_UINT32_BYTES +: <a class="el" href="db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f">pal_macros.h</a> +</li> +<li>PAL_INVERSE_UINT64_BYTES +: <a class="el" href="db/dcf/pal__macros_8h.html#ae376dc7d0682fb2fc8927897fb065c4c">pal_macros.h</a> +</li> +<li>PAL_IPV4_ADDRESS_SIZE +: <a class="el" href="d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f">pal_network.h</a> +</li> +<li>PAL_IPV6_ADDRESS_SIZE +: <a class="el" href="d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24">pal_network.h</a> +</li> +<li>PAL_LITTLE_ENDIAN_TO_HOST_16BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ad1c98870c5eeba8fe649345e371ef866">pal_macros.h</a> +</li> +<li>PAL_LITTLE_ENDIAN_TO_HOST_32BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#aa6229ece344478c07677c8b0436b1bb0">pal_macros.h</a> +</li> +<li>PAL_LITTLE_ENDIAN_TO_HOST_64BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#a4ae1ca0100a3eee36eb95931cbec633e">pal_macros.h</a> +</li> +<li>PAL_MAX +: <a class="el" href="db/dcf/pal__macros_8h.html#a117c6ce53646b65b4cdcb5da01801675">pal_macros.h</a> +</li> +<li>PAL_MAX_INT32 +: <a class="el" href="db/dcf/pal__macros_8h.html#a6ee734c1fc41affa0926797e382fc8d4">pal_macros.h</a> +</li> +<li>PAL_MAX_INT64 +: <a class="el" href="db/dcf/pal__macros_8h.html#ada154fcb4b3ef9b641486f30de56c7b7">pal_macros.h</a> +</li> +<li>PAL_MAX_NUMBER_OF_THREADS +: <a class="el" href="d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d">pal_configuration.h</a> +</li> +<li>PAL_MAX_SUPORTED_NET_INTEFACES +: <a class="el" href="d2/d87/pal__configuration_8h.html#a79ed46284848e83d0dba68933c40f82a">pal_configuration.h</a> +</li> +<li>PAL_MAX_UINT16 +: <a class="el" href="db/dcf/pal__macros_8h.html#af8d58ab12b0f655fe922fc40b3e52ca2">pal_macros.h</a> +</li> +<li>PAL_MAX_UINT32 +: <a class="el" href="db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e">pal_macros.h</a> +</li> +<li>PAL_MAX_UINT64 +: <a class="el" href="db/dcf/pal__macros_8h.html#a28a8006d7bca3b64235ca4d0cb39bf2b">pal_macros.h</a> +</li> +<li>PAL_MAX_UINT8 +: <a class="el" href="db/dcf/pal__macros_8h.html#a08c56fc189bfb1a6864a7b5d68433e7e">pal_macros.h</a> +</li> +<li>PAL_MIN +: <a class="el" href="db/dcf/pal__macros_8h.html#a29066dd6aaf6aa8fa21f3a88feb6da59">pal_macros.h</a> +</li> +<li>PAL_MIN_INT32 +: <a class="el" href="db/dcf/pal__macros_8h.html#ac3a2f334767728e9bc57512139e0bd61">pal_macros.h</a> +</li> +<li>PAL_MODULE_DEINIT +: <a class="el" href="db/dcf/pal__macros_8h.html#aaeb3e06c7119793239368c0fe74cda05">pal_macros.h</a> +</li> +<li>PAL_MODULE_INIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ad2109677fa03720f6ab0df072c755529">pal_macros.h</a> +</li> +<li>PAL_MODULE_IS_INIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ade9a83a9aab96cf50058801afdef4ace">pal_macros.h</a> +</li> +<li>PAL_MUTEX_DATA_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#af12d673085039783ab1d2613eff7e4a4">pal_plat_rtos.c</a> +</li> +<li>PAL_NET_ASYNCHRONOUS_SOCKET_API +: <a class="el" href="d2/d87/pal__configuration_8h.html#a337c171a4cf5d7f04894051002d81eba">pal_configuration.h</a> +</li> +<li>PAL_NET_DEFAULT_INTERFACE +: <a class="el" href="d9/d17/pal__network_8h.html#aefc09884590381a71433c34b3f2e2aa5">pal_network.h</a> +</li> +<li>PAL_NET_DNS_SUPPORT +: <a class="el" href="d2/d87/pal__configuration_8h.html#ad7e2f6ebd028faacc239229cce972fa7">pal_configuration.h</a> +</li> +<li>PAL_NET_MAX_ADDR_SIZE +: <a class="el" href="d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039">pal_network.h</a> +</li> +<li>PAL_NET_SELECT_IS_ERR +: <a class="el" href="d9/d17/pal__network_8h.html#ac2b7451d38e150079fbef20b57ee3fe9">pal_network.h</a> +</li> +<li>PAL_NET_SELECT_IS_RX +: <a class="el" href="d9/d17/pal__network_8h.html#a8894a96773018ba6058811087b4b2ac8">pal_network.h</a> +</li> +<li>PAL_NET_SELECT_IS_TX +: <a class="el" href="d9/d17/pal__network_8h.html#a31ca79ac9ae5c2ddd890263a989fc4d8">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_ERR_BIT +: <a class="el" href="d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_MAX_SOCKETS +: <a class="el" href="d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_RX_BIT +: <a class="el" href="d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_TX_BIT +: <a class="el" href="d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d">pal_network.h</a> +</li> +<li>PAL_NET_SUPPORT_LWIP +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#abc23815d68dafc619e2c2ba210d65bd0">pal_socket_test.c</a> +</li> +<li>PAL_NET_TCP_AND_TLS_SUPPORT +: <a class="el" href="d2/d87/pal__configuration_8h.html#a4662be64705952cfa0925001c9d917c3">pal_configuration.h</a> +</li> +<li>PAL_NET_TEST_INCOMING_PORT +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#ab1873f5ba58eb802dd808f05a1101670">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_HTTP_PORT +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a7c3cef32674c412f87617e87a194e0e3">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_IP +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a0570e783c7412d25d0c33817da54c02f">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_IP_STRING +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a7175d943793d9a92ebe83d12f2a65063">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_NAME +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#abbe7571a0fc631eb43561606f4d5bb0e">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_UDP_PORT +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#abc63439a9af70c80b125accdc2afbb12">pal_socket_test.c</a> +</li> +<li>PAL_NTOHL +: <a class="el" href="db/dcf/pal__macros_8h.html#a7cbc81d1fb0dcddb1cc88b59d50c2aa9">pal_macros.h</a> +</li> +<li>PAL_NTOHS +: <a class="el" href="db/dcf/pal__macros_8h.html#a55fbcf7a453813fec69016916802de2c">pal_macros.h</a> +</li> +<li>PAL_NUM_OF_THREAD_INSTANCES +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a9b3b50428d7ad199287a291137041c43">pal_plat_rtos.c</a> +</li> +<li>PAL_PRINTF +: <a class="el" href="d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb">pal_rtos.h</a> +</li> +<li>PAL_RTOS_64BIT_TICK_SUPPORTED +: <a class="el" href="d2/d87/pal__configuration_8h.html#a2c7f7687d719d388a67c1f18f200962d">pal_configuration.h</a> +</li> +<li>PAL_RTOS_MEMORY_POOL_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a31d6d9a16b9891d7eb84e2b974c2c92b">pal_plat_rtos.c</a> +</li> +<li>PAL_RTOS_MESSAGE_Q_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aa1b17e5a20a5db09a3a3267f9a4191e0">pal_plat_rtos.c</a> +</li> +<li>PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aa25bb23dc9f40c91f9872c585e649723">pal_plat_rtos.c</a> +</li> +<li>PAL_RTOS_WAIT_FOREVER +: <a class="el" href="d4/d01/pal__rtos_8h.html#ad19aa2a408e848a5f86d897ab50500ec">pal_rtos.h</a> +</li> +<li>PAL_SEMAPHORE_DATA_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a66dcd5bd7ca661597fecabb1795fa393">pal_plat_rtos.c</a> +</li> +<li>PAL_SOCKET_OPTION_ERROR +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a8c607fcbfa526e4485fcdb55b79b39d6">pal_plat_network.cpp</a> +</li> +<li>PAL_SUCCESS +: <a class="el" href="db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">pal_macros.h</a> +, <a class="el" href="d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">pal_types.h</a> +</li> +<li>PAL_TEST_BUFFER_SIZE +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a0010ea5741ae7db441ef09f96eef47be">pal_socket_test.c</a> +</li> +<li>PAL_TICK_TO_MILLI_FACTOR +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a78b1f63823e34bc82e272358701cbe67">pal_plat_rtos.c</a> +</li> +<li>PAL_TIMER_DATA_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aba1d833ce13b78f5648ec26cdd25f639">pal_plat_rtos.c</a> +</li> +<li>PAL_UNIQUE_THREAD_PRIORITY +: <a class="el" href="d2/d87/pal__configuration_8h.html#a4d2f5187ecd7e90c094e2f103e5b6839">pal_configuration.h</a> +</li> +</ul> + + +<h3><a class="anchor" id="index_t"></a>- t -</h3><ul> +<li>TEST_PRINTF +: <a class="el" href="d8/d5f/pal__socket__test__utils_8cpp.html#ac641d6ab2d8d2f23e89e7c36694d85dd">pal_socket_test_utils.cpp</a> +, <a class="el" href="d0/d51/pal__test__utils_8h.html#a7f0c3a0f2f1c4062d776a7bc64bed815">pal_test_utils.h</a> +</li> +<li>THREAD_STACK_SIZE +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a90b7a8cb7bc3fdbd98014a3e15ee6e9a">pal_rtos_test_utils.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_enum.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,87 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li class="current"><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> + <ul> +<li>pal_osPriority +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_rtos.h</a> +</li> +<li>palError_t +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5">pal_errors.h</a> +</li> +<li>palErrorModules_t +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1">pal_errors.h</a> +</li> +<li>palSocketDomain_t +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">pal_network.h</a> +</li> +<li>palSocketOptionName_t +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">pal_network.h</a> +</li> +<li>palSocketType_t +: <a class="el" href="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">pal_network.h</a> +</li> +<li>palTimerType +: <a class="el" href="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">pal_rtos.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_eval.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,301 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li class="current"><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li class="current"><a href="#index_p"><span>p</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_p"></a>- p -</h3><ul> +<li>PAL_AF_INET +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f">pal_network.h</a> +</li> +<li>PAL_AF_INET6 +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7">pal_network.h</a> +</li> +<li>PAL_AF_UNSPEC +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3">pal_network.h</a> +</li> +<li>PAL_ERR_BUFFER_TOO_SMALL +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9">pal_errors.h</a> +</li> +<li>PAL_ERR_CREATION_FAILED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308">pal_errors.h</a> +</li> +<li>PAL_ERR_GENERAL_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">pal_errors.h</a> +</li> +<li>PAL_ERR_GENERIC_FAILURE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4">pal_errors.h</a> +</li> +<li>PAL_ERR_INVALID_ARGUMENT +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_C +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_CRYPTO +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_GENERAL +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_NET +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_PAL +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_RTOS +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_TLS +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_UPDATE +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e">pal_errors.h</a> +</li> +<li>PAL_ERR_NO_MEMORY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c">pal_errors.h</a> +</li> +<li>PAL_ERR_NOT_IMPLEMENTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a">pal_errors.h</a> +</li> +<li>PAL_ERR_NOT_INITIALIZED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c">pal_errors.h</a> +</li> +<li>PAL_ERR_NOT_SUPPORTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94">pal_errors.h</a> +</li> +<li>PAL_ERR_NULL_POINTER +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_ERROR_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_ISR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_ISR_RECURSIVE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_NO_MEMORY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_OS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_PARAMETER +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_PRIORITY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_RESOURCE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_TIMEOUT +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_VALUE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_ADDRESS_IN_USE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_ALREADY_CONNECTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_AUTH_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_CONNECTION_ABORTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_CONNECTION_CLOSED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_CONNECTION_RESET +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_DNS_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_ERROR_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_GENERIC +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_HDCP_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_HOST_UNREACHABLE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_IN_PROGRES +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INVALID_ADDRESS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INVALID_VALUE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_NO_BUFFERS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_NOT_CONNECTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_WOULD_BLOCK +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea">pal_errors.h</a> +</li> +<li>PAL_ERR_TIMEOUT_EXPIRED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_BUSY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_CHUNK_TO_SMALL +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_END_OF_IMAGE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_ERROR_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_OUT_OF_BOUNDS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_PALFROM_API +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_PALFROM_IO +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_TIMEOUT +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b">pal_errors.h</a> +</li> +<li>PAL_osPriorityAboveNormal +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af">pal_rtos.h</a> +</li> +<li>PAL_osPriorityBelowNormal +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5">pal_rtos.h</a> +</li> +<li>PAL_osPriorityError +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e">pal_rtos.h</a> +</li> +<li>PAL_osPriorityHigh +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2">pal_rtos.h</a> +</li> +<li>PAL_osPriorityIdle +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a">pal_rtos.h</a> +</li> +<li>PAL_osPriorityLow +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec">pal_rtos.h</a> +</li> +<li>PAL_osPriorityNormal +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1">pal_rtos.h</a> +</li> +<li>PAL_osPriorityRealtime +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce">pal_rtos.h</a> +</li> +<li>PAL_SO_RCVTIMEO +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca">pal_network.h</a> +</li> +<li>PAL_SO_REUSEADDR +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001">pal_network.h</a> +</li> +<li>PAL_SO_SNDTIMEO +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de">pal_network.h</a> +</li> +<li>PAL_SOCK_DGRAM +: <a class="el" href="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941">pal_network.h</a> +</li> +<li>palOsTimerOnce +: <a class="el" href="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30">pal_rtos.h</a> +</li> +<li>palOsTimerPeriodic +: <a class="el" href="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9">pal_rtos.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_f.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,99 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index__"><span>_</span></a></li> + <li><a href="globals_a.html#index_a"><span>a</span></a></li> + <li><a href="globals_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li class="current"><a href="globals_f.html#index_f"><span>f</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_i.html#index_i"><span>i</span></a></li> + <li><a href="globals_k.html#index_k"><span>k</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li><a href="globals_v.html#index_v"><span>v</span></a></li> + <li><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_f"></a>- f -</h3><ul> +<li>FIRMWARE_HEADER_MAGIC +: <a class="el" href="d3/d44/pal__plat__update_8cpp.html#a9762be6170804525a2b45df94fd9293c">pal_plat_update.cpp</a> +</li> +<li>FIRMWARE_HEADER_VERSION +: <a class="el" href="d3/d44/pal__plat__update_8cpp.html#af3abc5e3f32ad8114e385a7b137a602d">pal_plat_update.cpp</a> +</li> +<li>FirmwareHeader_t +: <a class="el" href="d3/d44/pal__plat__update_8cpp.html#ad53f6cbdcb10beae7d1bdf6a79d2a48f">pal_plat_update.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li class="current"><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_b"></a>- b -</h3><ul> +<li>button_thread() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_socket_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_b.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_a"><span>a</span></a></li> + <li class="current"><a href="globals_func_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_b"></a>- b -</h3><ul> +<li>button_thread() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="da/d64/pal__socket__test__main__mbedos_classic_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_socket_test_main_mbedosClassic.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_socket_test_main_mbedOS.cpp</a> +, <a class="el" href="d4/d68/pal__rtos__test__main__mbedos_classic_8cpp.html#afe6a59684384290b7f8710db5203944a">pal_rtos_test_main_mbedosClassic.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_d.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li class="current"><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_d"></a>- d -</h3><ul> +<li>dbgPrintf() +: <a class="el" href="de/d33/pal__rtos_8c.html#a2b4f475c89ea263557d6529c4d9a9353">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353">pal_rtos.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_l.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li class="current"><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_l"></a>- l -</h3><ul> +<li>led1() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>led_thread() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">pal_socket_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_m.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,86 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li class="current"><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_m"></a>- m -</h3><ul> +<li>main() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">pal_all_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">pal_socket_test_main_mbedOS.cpp</a> +, <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">pal_rtos_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_n.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li class="current"><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_n"></a>- n -</h3><ul> +<li>NVIC_SystemReset() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a1b47d17e90b6a03e7bd1ec6a0d549b46">pal_plat_rtos.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_p.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,560 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li class="current"><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_p"></a>- p -</h3><ul> +<li>pal_bind() +: <a class="el" href="d1/dc4/pal__network_8c.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_network.h</a> +</li> +<li>pal_close() +: <a class="el" href="d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644">pal_network.h</a> +, <a class="el" href="d1/dc4/pal__network_8c.html#a18197e0f047f17d2617461594f5ed644">pal_network.c</a> +</li> +<li>pal_destroy() +: <a class="el" href="d7/d66/pal__init_8c.html#a312dfda15122dbd2abff67b580c811ad">pal_init.c</a> +, <a class="el" href="d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad">pal.h</a> +</li> +<li>pal_getNetInterfaceInfo() +: <a class="el" href="d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8">pal_network.h</a> +, <a class="el" href="d1/dc4/pal__network_8c.html#a5258efd8b21d9c881df29b29686674d8">pal_network.c</a> +</li> +<li>pal_getNumberOfNetInterfaces() +: <a class="el" href="d1/dc4/pal__network_8c.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_network.h</a> +</li> +<li>pal_getSockAddrIPV4Addr() +: <a class="el" href="d1/dc4/pal__network_8c.html#ade5cf610808db5462666465b648e7724">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724">pal_network.h</a> +</li> +<li>pal_getSockAddrIPV6Addr() +: <a class="el" href="d1/dc4/pal__network_8c.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_network.h</a> +</li> +<li>pal_getSockAddrPort() +: <a class="el" href="d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e">pal_network.h</a> +, <a class="el" href="d1/dc4/pal__network_8c.html#a4658c7e8224b536d4fd71fed2602b12e">pal_network.c</a> +</li> +<li>pal_getSocketOptions() +: <a class="el" href="d1/dc4/pal__network_8c.html#a2d9d4e04e43995123efe134c767cd6e1">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1">pal_network.h</a> +</li> +<li>pal_init() +: <a class="el" href="d7/d66/pal__init_8c.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal_init.c</a> +, <a class="el" href="d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal.h</a> +</li> +<li>pal_osAtomicIncrement() +: <a class="el" href="de/d33/pal__rtos_8c.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_rtos.h</a> +</li> +<li>pal_osDelay() +: <a class="el" href="de/d33/pal__rtos_8c.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_rtos.h</a> +</li> +<li>pal_osKernelSysMilliSecTick() +: <a class="el" href="de/d33/pal__rtos_8c.html#a59e85747582417a1395ed0f9c140eb8a">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a">pal_rtos.h</a> +</li> +<li>pal_osKernelSysTick() +: <a class="el" href="de/d33/pal__rtos_8c.html#a9800b8b9e057fe17e50c4259c809f898">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898">pal_rtos.h</a> +</li> +<li>pal_osKernelSysTick64() +: <a class="el" href="de/d33/pal__rtos_8c.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_rtos.h</a> +</li> +<li>pal_osKernelSysTickFrequency() +: <a class="el" href="d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_rtos.h</a> +, <a class="el" href="de/d33/pal__rtos_8c.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_rtos.c</a> +</li> +<li>pal_osKernelSysTickMicroSec() +: <a class="el" href="de/d33/pal__rtos_8c.html#a34375ee82619a4064849daccbdfbc966">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966">pal_rtos.h</a> +</li> +<li>pal_osMessageGet() +: <a class="el" href="de/d33/pal__rtos_8c.html#ab70d0be45514258874c0406c2040372c">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c">pal_rtos.h</a> +</li> +<li>pal_osMessagePut() +: <a class="el" href="de/d33/pal__rtos_8c.html#a966daa5b0bd9282fbffa7c462da1c417">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417">pal_rtos.h</a> +</li> +<li>pal_osMessageQueueCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#a0c7f0003e92b3494089966d53ab24a1b">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b">pal_rtos.h</a> +</li> +<li>pal_osMessageQueueDestroy() +: <a class="el" href="de/d33/pal__rtos_8c.html#adba13212ec060092acdf6165e82be5b6">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6">pal_rtos.h</a> +</li> +<li>pal_osMutexCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#af89aab14085207b1a0951f7aad24193c">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c">pal_rtos.h</a> +</li> +<li>pal_osMutexDelete() +: <a class="el" href="de/d33/pal__rtos_8c.html#a03f43d7e53435d89f316862b48b573c4">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4">pal_rtos.h</a> +</li> +<li>pal_osMutexRelease() +: <a class="el" href="de/d33/pal__rtos_8c.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_rtos.h</a> +</li> +<li>pal_osMutexWait() +: <a class="el" href="de/d33/pal__rtos_8c.html#acda0974247325955719b23494d66c622">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622">pal_rtos.h</a> +</li> +<li>pal_osPoolAlloc() +: <a class="el" href="de/d33/pal__rtos_8c.html#a3a2b57685096d16a110ee38f7f29e099">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099">pal_rtos.h</a> +</li> +<li>pal_osPoolCAlloc() +: <a class="el" href="de/d33/pal__rtos_8c.html#a5d20661cd387a172450a2fe12993687a">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a">pal_rtos.h</a> +</li> +<li>pal_osPoolCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_rtos.h</a> +</li> +<li>pal_osPoolDestroy() +: <a class="el" href="de/d33/pal__rtos_8c.html#a1c01464448f8d7bd95bf518d651484c6">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6">pal_rtos.h</a> +</li> +<li>pal_osPoolFree() +: <a class="el" href="de/d33/pal__rtos_8c.html#a79f4997069310aa7bbb6ae7995988dd7">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7">pal_rtos.h</a> +</li> +<li>pal_osReboot() +: <a class="el" href="de/d33/pal__rtos_8c.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_rtos.h</a> +</li> +<li>pal_osSemaphoreCreate() +: <a class="el" href="d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037">pal_rtos.h</a> +, <a class="el" href="de/d33/pal__rtos_8c.html#aaa7aee442a5c8cc274d3e52206984037">pal_rtos.c</a> +</li> +<li>pal_osSemaphoreDelete() +: <a class="el" href="de/d33/pal__rtos_8c.html#a45f071482f8669821b90264e0470b33d">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d">pal_rtos.h</a> +</li> +<li>pal_osSemaphoreRelease() +: <a class="el" href="de/d33/pal__rtos_8c.html#a009d0c063119265f9c5c0c9bff379c14">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14">pal_rtos.h</a> +</li> +<li>pal_osSemaphoreWait() +: <a class="el" href="de/d33/pal__rtos_8c.html#aa2d998744dbc9504bfe0358f85457fc4">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4">pal_rtos.h</a> +</li> +<li>pal_osThreadCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#a2dae64d917f644982b893037adf562b4">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4">pal_rtos.h</a> +</li> +<li>pal_osThreadGetId() +: <a class="el" href="de/d33/pal__rtos_8c.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_rtos.h</a> +</li> +<li>pal_osThreadGetLocalStore() +: <a class="el" href="de/d33/pal__rtos_8c.html#ac94f4efc4bad73969e57c8255c136a0d">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d">pal_rtos.h</a> +</li> +<li>pal_osThreadTerminate() +: <a class="el" href="de/d33/pal__rtos_8c.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_rtos.h</a> +</li> +<li>pal_osTimerCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_rtos.h</a> +</li> +<li>pal_osTimerDelete() +: <a class="el" href="de/d33/pal__rtos_8c.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_rtos.h</a> +</li> +<li>pal_osTimerStart() +: <a class="el" href="de/d33/pal__rtos_8c.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_rtos.h</a> +</li> +<li>pal_osTimerStop() +: <a class="el" href="de/d33/pal__rtos_8c.html#a94f4df594102e582cbd2114f6eebb57d">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d">pal_rtos.h</a> +</li> +<li>pal_plat_bind() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_network.cpp</a> +</li> +<li>pal_plat_close() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_network.cpp</a> +</li> +<li>pal_plat_getNetInterfaceInfo() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_network.cpp</a> +</li> +<li>pal_plat_getNumberOfNetInterfaces() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#af36bf075867e5ed0be7479312469361f">pal_plat_network.cpp</a> +</li> +<li>pal_plat_getSocketOptions() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_network.cpp</a> +</li> +<li>pal_plat_osAtomicIncrement() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osDelay() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osKernelSysMilliSecTick() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osKernelSysTick() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osKernelSysTick64() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osKernelSysTickFrequency() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#addc790764a23a3e16344bd830ebe01ef">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osKernelSysTickMicroSec() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessageGet() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a67696b86a6116a82da7c26a433280e58">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessagePut() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessageQueueCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessageQueueDestroy() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMutexCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMutexDelete() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMutexRelease() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osMutexWait() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolAlloc() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osPoolCAlloc() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolDestroy() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolFree() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osReboot() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#abdb6ab5827d588b9c2e908beda4c3154">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osSemaphoreCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osSemaphoreDelete() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osSemaphoreRelease() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a252f210ce8a502891821b5af24b09822">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osSemaphoreWait() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osThreadCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osThreadGetId() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osThreadGetLocalStore() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osThreadTerminate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osTimerCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osTimerDelete() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osTimerStart() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osTimerStop() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_rtos.c</a> +</li> +<li>pal_plat_receiveFrom() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_network.cpp</a> +</li> +<li>pal_plat_RegisterNetworkInterface() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#ab37f007a0574ca73916b26240ff1126b">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c">pal_plat_network.h</a> +</li> +<li>pal_plat_RTOSDestroy() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_rtos.c</a> +</li> +<li>pal_plat_RTOSInitialize() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_rtos.h</a> +</li> +<li>pal_plat_sendTo() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a17365747ed8d29df153a336da3942187">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187">pal_plat_network.h</a> +</li> +<li>pal_plat_setSocketOptions() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_network.cpp</a> +</li> +<li>pal_plat_socket() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_network.cpp</a> +</li> +<li>pal_plat_socketMiniSelect() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_network.cpp</a> +</li> +<li>pal_plat_socketsInit() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_network.cpp</a> +</li> +<li>pal_plat_socketsTerminate() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_network.cpp</a> +</li> +<li>pal_receiveFrom() +: <a class="el" href="d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_network.h</a> +, <a class="el" href="d1/dc4/pal__network_8c.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_network.c</a> +</li> +<li>pal_registerNetworkInterface() +: <a class="el" href="d1/dc4/pal__network_8c.html#a081cc2fd09644c41068673487b39f6b8">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8">pal_network.h</a> +</li> +<li>pal_sendTo() +: <a class="el" href="d1/dc4/pal__network_8c.html#acce808f708e653b6bed317072888ca23">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23">pal_network.h</a> +</li> +<li>pal_setSockAddrIPV4Addr() +: <a class="el" href="d1/dc4/pal__network_8c.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_network.h</a> +</li> +<li>pal_setSockAddrIPV6Addr() +: <a class="el" href="d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_network.h</a> +, <a class="el" href="d1/dc4/pal__network_8c.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_network.c</a> +</li> +<li>pal_setSockAddrPort() +: <a class="el" href="d1/dc4/pal__network_8c.html#abbeb1395896eb79ab564568b9ab8a628">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628">pal_network.h</a> +</li> +<li>pal_setSocketOptions() +: <a class="el" href="d1/dc4/pal__network_8c.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_network.h</a> +</li> +<li>pal_socket() +: <a class="el" href="d1/dc4/pal__network_8c.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_network.h</a> +</li> +<li>pal_socketMiniSelect() +: <a class="el" href="d9/d17/pal__network_8h.html#a5cab4ea55a3d28cfd8d4dca8376a111c">pal_network.h</a> +, <a class="el" href="d1/dc4/pal__network_8c.html#a5cab4ea55a3d28cfd8d4dca8376a111c">pal_network.c</a> +</li> +<li>palRunThreads() +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#a393f7a6e534c05e534cfdaf46473db45">pal_rtos_test.c</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a393f7a6e534c05e534cfdaf46473db45">pal_rtos_test_utils.c</a> +</li> +<li>palSelectCallback0() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback1() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback2() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback3() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback4() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback5() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback6() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback7() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58">pal_plat_network.cpp</a> +</li> +<li>palTestGetNetWorkInterfaceContext() +: <a class="el" href="d8/d5f/pal__socket__test__utils_8cpp.html#a5e4a39a385159acfd150a2e6098351cf">pal_socket_test_utils.cpp</a> +, <a class="el" href="df/d2a/pal__socket__test__utils_8h.html#a5e4a39a385159acfd150a2e6098351cf">pal_socket_test_utils.h</a> +</li> +<li>palThreadFunc1() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a0a153da028aee8f220377b516ff065c8">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFunc2() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a29dc69cbcc48b55d48a5fd668da7fe15">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFunc3() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#acf68b041960be3c58f516986504fcd0f">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFunc4() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a844c7469189866b502ef85df5063e79c">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFunc5() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a5be7a07498de9cc847215e6aa8f77914">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFunc6() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a52dc025f6020b0d456bbbcacc3aa4e3e">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFuncCustom1() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a7c8c7a38fca8b62acc6094ba1f072ec7">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFuncCustom2() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a663a9130dc598399ec3bd9ab9e6680fa">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFuncCustom3() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a300d95346a90a5f17aa6140647243b64">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFuncCustom4() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#aa5b1f9c927c18d821a46d99dfe533cb0">pal_rtos_test_utils.c</a> +</li> +<li>palTimerFunc1() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#abac822ed4b356b85117101aa0d8701d6">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6">pal_rtos_test_utils.h</a> +</li> +<li>palTimerFunc2() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a8581bcb8f9f435a87c3dd651d65e32c8">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8">pal_rtos_test_utils.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_s.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,92 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li class="current"><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_s"></a>- s -</h3><ul> +<li>socketCallback() +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#ad62b547b432124475c3f5a94d9befe6d">pal_socket_test.c</a> +</li> +<li>sw2() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>sw2_press() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">pal_socket_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_t.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,122 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li class="current"><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_t"></a>- t -</h3><ul> +<li>TEST() +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#a1e33659cb747282e1869e9f86fe2d33f">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#a89cecd4b07ef1acbb0b40c00189a0f36">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#ab6e3467dab64a1ae60a313f6c004e337">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#a38479981768fb5d46c11768870af9d8e">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a236b8351236670bd5b5a07c92d22df4b">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#ab28ce473e377fbe30049cb41b31dfa4b">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a9286efb458d9a35e4c89e79111bc5b32">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#abbfd14915bd054b23f91a485d4f8fb1e">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a0efc309d0e8eb82d8caf439877959e21">pal_rtos_test.c</a> +</li> +<li>TEST_GROUP() +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#ad324fc284dd938317109a9fc47dd1732">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#ab19fea07339238925c3b105637ce92c1">pal_rtos_test.c</a> +</li> +<li>TEST_GROUP_RUNNER() +: <a class="el" href="dd/df6/pal__rtos__test__runner_8c.html#ace47ba1b1706d7b654cdf18e7008b174">pal_rtos_test_runner.c</a> +, <a class="el" href="dc/da5/pal__socket__test__runner_8c.html#a7d7471d47d062a2bf20410044b712192">pal_socket_test_runner.c</a> +</li> +<li>TEST_pal_all_GROUPS_RUNNER() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#adc9a94aa19f52027390d7b0256a6693c">pal_all_test_main_mbedOS.cpp</a> +</li> +<li>TEST_pal_rtos_GROUP_RUNNER() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc">pal_all_test_main_mbedOS.cpp</a> +, <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc">pal_rtos_test_main_mbedOS.cpp</a> +</li> +<li>TEST_pal_socket_GROUP_RUNNER() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab">pal_all_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>TEST_pal_update_GROUP_RUNNER() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a59390bc31498889208cfda7dea51bffa">pal_all_test_main_mbedOS.cpp</a> +</li> +<li>TEST_SETUP() +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a26217052dc55731aa82231669a8cf0df">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a8a7c6f6a71607f9dce69207f1f7ed3c1">pal_rtos_test.c</a> +</li> +<li>TEST_TEAR_DOWN() +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#ac307640c84843ab78607af150bcbe143">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#ac5fc4009112ba6cadc74ad8cd14c427b">pal_rtos_test.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_func_u.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,86 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li class="current"><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals_func.html#index_b"><span>b</span></a></li> + <li><a href="globals_func_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_func_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_func_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_func_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_func_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_func_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_func_t.html#index_t"><span>t</span></a></li> + <li class="current"><a href="globals_func_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_u"></a>- u -</h3><ul> +<li>UnityMain() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">pal_all_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">pal_socket_test_main_mbedOS.cpp</a> +, <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">pal_rtos_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_g.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,97 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li class="current"><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_g"></a>- g -</h3><ul> +<li>g_networkInterface +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a702871d3d9057fa4fc99031298fb425c">pal_socket_test.c</a> +</li> +<li>g_threadsArg +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a8f9b1f133f82ce955405d453f0c506d6">pal_rtos_test.c</a> +</li> +<li>g_threadStorage +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#a9beaf51023e475986b8b182c80ccc023">pal_rtos_test.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023">pal_rtos_test_utils.h</a> +</li> +<li>g_timerArgs +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a1a09db2f0cd5dd2d0929b34afad51ba1">pal_rtos_test.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_i.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_a"><span>a</span></a></li> + <li><a href="globals_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li class="current"><a href="globals_i.html#index_i"><span>i</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li><a href="globals_v.html#index_v"><span>v</span></a></li> + <li><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_i"></a>- i -</h3><ul> +<li>INCLUDE_uxTaskPriorityGet +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a1279eb797355460aeeec06aa524e91df">FreeRTOSConfig.h</a> +</li> +<li>INCLUDE_vTaskCleanUpResources +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a7ee138825e57f243c8ee5fd4207b9e26">FreeRTOSConfig.h</a> +</li> +<li>INCLUDE_vTaskDelay +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a24361a6eb816a965f1ee4e2e08e364f8">FreeRTOSConfig.h</a> +</li> +<li>INCLUDE_vTaskDelayUntil +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ae8459bfd5b428319bb10de9f504a53aa">FreeRTOSConfig.h</a> +</li> +<li>INCLUDE_vTaskDelete +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a5ae1434fdf995108dc749ff9329f53bd">FreeRTOSConfig.h</a> +</li> +<li>INCLUDE_vTaskPrioritySet +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ad6858ac8aaf726007fd19752956ef1bd">FreeRTOSConfig.h</a> +</li> +<li>INCLUDE_vTaskSuspend +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#aef8fbb97819ad3d962f334ac298206d1">FreeRTOSConfig.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_k.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,92 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index__"><span>_</span></a></li> + <li><a href="globals_a.html#index_a"><span>a</span></a></li> + <li><a href="globals_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_i.html#index_i"><span>i</span></a></li> + <li class="current"><a href="globals_k.html#index_k"><span>k</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li><a href="globals_v.html#index_v"><span>v</span></a></li> + <li><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_k"></a>- k -</h3><ul> +<li>KILOBYTE +: <a class="el" href="d8/ddd/pal__update__test_8c.html#a35721ed2d9f78cd139ea6f6c35432a4a">pal_update_test.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_l.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,93 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li class="current"><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_l"></a>- l -</h3><ul> +<li>led1() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>led_thread() +: <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">pal_socket_test_main_mbedOS.cpp</a> +, <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26">pal_rtos_test_main_mbedOS.cpp</a> +</li> +<li>LITTLE__ENDIAN +: <a class="el" href="db/dcf/pal__macros_8h.html#a1651594dc71abf466bddd0f6393edb8b">pal_macros.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_m.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,107 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li class="current"><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_m"></a>- m -</h3><ul> +<li>main() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">pal_all_test_main_mbedOS.cpp</a> +, <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>MEMORY_POOL1_BLOCK_COUNT +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a3c0ce22bdba74fe398c6adefbc7fbbdf">pal_rtos_test_utils.h</a> +</li> +<li>MEMORY_POOL1_BLOCK_SIZE +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#ae3c2c737bcf6b45c3bf394dfe8349c4d">pal_rtos_test_utils.h</a> +</li> +<li>MEMORY_POOL2_BLOCK_COUNT +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a593d40fc26d9d1664c57988a846a888e">pal_rtos_test_utils.h</a> +</li> +<li>MEMORY_POOL2_BLOCK_SIZE +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a3c85d7e7f47d26444477603d8e2fd5d5">pal_rtos_test_utils.h</a> +</li> +<li>mutex1 +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#adb164ebbfd2189f434f5e550e2d93bb4">pal_rtos_test.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4">pal_rtos_test_utils.h</a> +</li> +<li>mutex2 +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a8706c6b975e957968f23af2812bbc0cb">pal_rtos_test.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_n.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,88 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li class="current"><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_n"></a>- n -</h3><ul> +<li>NULLPTR +: <a class="el" href="d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab">pal_types.h</a> +</li> +<li>NVIC_SystemReset() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a1b47d17e90b6a03e7bd1ec6a0d549b46">pal_plat_rtos.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_p.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1099 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li class="current"><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_p"></a>- p -</h3><ul> +<li>PAL_AF_INET +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f">pal_network.h</a> +</li> +<li>PAL_AF_INET6 +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7">pal_network.h</a> +</li> +<li>PAL_AF_UNSPEC +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3">pal_network.h</a> +</li> +<li>pal_bind() +: <a class="el" href="d1/dc4/pal__network_8c.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63">pal_network.h</a> +</li> +<li>pal_close() +: <a class="el" href="d1/dc4/pal__network_8c.html#a18197e0f047f17d2617461594f5ed644">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644">pal_network.h</a> +</li> +<li>pal_destroy() +: <a class="el" href="d7/d66/pal__init_8c.html#a312dfda15122dbd2abff67b580c811ad">pal_init.c</a> +, <a class="el" href="d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad">pal.h</a> +</li> +<li>PAL_DIVIDE_ROUND_UP +: <a class="el" href="db/dcf/pal__macros_8h.html#a966411fe41e3830553bb1b8cf8baf730">pal_macros.h</a> +</li> +<li>PAL_ERR_BUFFER_TOO_SMALL +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9">pal_errors.h</a> +</li> +<li>PAL_ERR_CREATION_FAILED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308">pal_errors.h</a> +</li> +<li>PAL_ERR_GENERAL_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35">pal_errors.h</a> +</li> +<li>PAL_ERR_GENERIC_FAILURE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4">pal_errors.h</a> +</li> +<li>PAL_ERR_INVALID_ARGUMENT +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_C +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_CRYPTO +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_GENERAL +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_NET +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_PAL +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_RTOS +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_TLS +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d">pal_errors.h</a> +</li> +<li>PAL_ERR_MODULE_UPDATE +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e">pal_errors.h</a> +</li> +<li>PAL_ERR_NO_MEMORY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c">pal_errors.h</a> +</li> +<li>PAL_ERR_NOT_IMPLEMENTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a">pal_errors.h</a> +</li> +<li>PAL_ERR_NOT_INITIALIZED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c">pal_errors.h</a> +</li> +<li>PAL_ERR_NOT_SUPPORTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94">pal_errors.h</a> +</li> +<li>PAL_ERR_NULL_POINTER +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_ERROR_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_ISR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_ISR_RECURSIVE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_NO_MEMORY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_OS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_PARAMETER +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_PRIORITY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_RESOURCE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_TIMEOUT +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b">pal_errors.h</a> +</li> +<li>PAL_ERR_RTOS_VALUE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_ADDRESS_IN_USE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_ALREADY_CONNECTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_AUTH_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_CONNECTION_ABORTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_CONNECTION_CLOSED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_CONNECTION_RESET +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_DNS_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_ERROR_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_GENERIC +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_HDCP_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_HOST_UNREACHABLE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_IN_PROGRES +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INVALID_ADDRESS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_INVALID_VALUE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_NO_BUFFERS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_NOT_CONNECTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479">pal_errors.h</a> +</li> +<li>PAL_ERR_SOCKET_WOULD_BLOCK +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea">pal_errors.h</a> +</li> +<li>PAL_ERR_TIMEOUT_EXPIRED +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_BUSY +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_CHUNK_TO_SMALL +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_END_OF_IMAGE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_ERROR +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_ERROR_BASE +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_OUT_OF_BOUNDS +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_PALFROM_API +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_PALFROM_IO +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6">pal_errors.h</a> +</li> +<li>PAL_ERR_UPDATE_TIMEOUT +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b">pal_errors.h</a> +</li> +<li>pal_getNetInterfaceInfo() +: <a class="el" href="d1/dc4/pal__network_8c.html#a5258efd8b21d9c881df29b29686674d8">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8">pal_network.h</a> +</li> +<li>pal_getNumberOfNetInterfaces() +: <a class="el" href="d1/dc4/pal__network_8c.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c">pal_network.h</a> +</li> +<li>pal_getSockAddrIPV4Addr() +: <a class="el" href="d1/dc4/pal__network_8c.html#ade5cf610808db5462666465b648e7724">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724">pal_network.h</a> +</li> +<li>pal_getSockAddrIPV6Addr() +: <a class="el" href="d1/dc4/pal__network_8c.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f">pal_network.h</a> +</li> +<li>pal_getSockAddrPort() +: <a class="el" href="d1/dc4/pal__network_8c.html#a4658c7e8224b536d4fd71fed2602b12e">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e">pal_network.h</a> +</li> +<li>pal_getSocketOptions() +: <a class="el" href="d1/dc4/pal__network_8c.html#a2d9d4e04e43995123efe134c767cd6e1">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1">pal_network.h</a> +</li> +<li>PAL_HOST_TO_LITTLE_ENDIAN_16BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#a9bd4f76c3897b4338fe50a8d69830fe5">pal_macros.h</a> +</li> +<li>PAL_HOST_TO_LITTLE_ENDIAN_32BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ab01046a25df49d7fe1d85a8bf722975f">pal_macros.h</a> +</li> +<li>PAL_HOST_TO_LITTLE_ENDIAN_64BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#adc0a4752569188800a75e1601a7e11b5">pal_macros.h</a> +</li> +<li>PAL_HTONL +: <a class="el" href="db/dcf/pal__macros_8h.html#a55b1a7d9f939231045521ec4a4817cff">pal_macros.h</a> +</li> +<li>PAL_HTONS +: <a class="el" href="db/dcf/pal__macros_8h.html#a98390512a7c2732f1197b07acf03e226">pal_macros.h</a> +</li> +<li>pal_in_addr_t +: <a class="el" href="d1/dc4/pal__network_8c.html#abd4e26912e35fc58e5bc0172765bdc6e">pal_network.c</a> +</li> +<li>pal_init() +: <a class="el" href="d7/d66/pal__init_8c.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal_init.c</a> +, <a class="el" href="d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6">pal.h</a> +</li> +<li>PAL_INVERSE_UINT16_BYTES +: <a class="el" href="db/dcf/pal__macros_8h.html#ad989cc9220df56cd410590fc628e93b7">pal_macros.h</a> +</li> +<li>PAL_INVERSE_UINT32_BYTES +: <a class="el" href="db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f">pal_macros.h</a> +</li> +<li>PAL_INVERSE_UINT64_BYTES +: <a class="el" href="db/dcf/pal__macros_8h.html#ae376dc7d0682fb2fc8927897fb065c4c">pal_macros.h</a> +</li> +<li>PAL_IPV4_ADDRESS_SIZE +: <a class="el" href="d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f">pal_network.h</a> +</li> +<li>PAL_IPV6_ADDRESS_SIZE +: <a class="el" href="d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24">pal_network.h</a> +</li> +<li>PAL_LITTLE_ENDIAN_TO_HOST_16BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ad1c98870c5eeba8fe649345e371ef866">pal_macros.h</a> +</li> +<li>PAL_LITTLE_ENDIAN_TO_HOST_32BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#aa6229ece344478c07677c8b0436b1bb0">pal_macros.h</a> +</li> +<li>PAL_LITTLE_ENDIAN_TO_HOST_64BIT +: <a class="el" href="db/dcf/pal__macros_8h.html#a4ae1ca0100a3eee36eb95931cbec633e">pal_macros.h</a> +</li> +<li>PAL_MAX +: <a class="el" href="db/dcf/pal__macros_8h.html#a117c6ce53646b65b4cdcb5da01801675">pal_macros.h</a> +</li> +<li>PAL_MAX_INT32 +: <a class="el" href="db/dcf/pal__macros_8h.html#a6ee734c1fc41affa0926797e382fc8d4">pal_macros.h</a> +</li> +<li>PAL_MAX_INT64 +: <a class="el" href="db/dcf/pal__macros_8h.html#ada154fcb4b3ef9b641486f30de56c7b7">pal_macros.h</a> +</li> +<li>PAL_MAX_NUMBER_OF_THREADS +: <a class="el" href="d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d">pal_configuration.h</a> +</li> +<li>PAL_MAX_SUPORTED_NET_INTEFACES +: <a class="el" href="d2/d87/pal__configuration_8h.html#a79ed46284848e83d0dba68933c40f82a">pal_configuration.h</a> +</li> +<li>PAL_MAX_UINT16 +: <a class="el" href="db/dcf/pal__macros_8h.html#af8d58ab12b0f655fe922fc40b3e52ca2">pal_macros.h</a> +</li> +<li>PAL_MAX_UINT32 +: <a class="el" href="db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e">pal_macros.h</a> +</li> +<li>PAL_MAX_UINT64 +: <a class="el" href="db/dcf/pal__macros_8h.html#a28a8006d7bca3b64235ca4d0cb39bf2b">pal_macros.h</a> +</li> +<li>PAL_MAX_UINT8 +: <a class="el" href="db/dcf/pal__macros_8h.html#a08c56fc189bfb1a6864a7b5d68433e7e">pal_macros.h</a> +</li> +<li>PAL_MIN +: <a class="el" href="db/dcf/pal__macros_8h.html#a29066dd6aaf6aa8fa21f3a88feb6da59">pal_macros.h</a> +</li> +<li>PAL_MIN_INT32 +: <a class="el" href="db/dcf/pal__macros_8h.html#ac3a2f334767728e9bc57512139e0bd61">pal_macros.h</a> +</li> +<li>PAL_MODULE_DEINIT +: <a class="el" href="db/dcf/pal__macros_8h.html#aaeb3e06c7119793239368c0fe74cda05">pal_macros.h</a> +</li> +<li>PAL_MODULE_INIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ad2109677fa03720f6ab0df072c755529">pal_macros.h</a> +</li> +<li>PAL_MODULE_IS_INIT +: <a class="el" href="db/dcf/pal__macros_8h.html#ade9a83a9aab96cf50058801afdef4ace">pal_macros.h</a> +</li> +<li>PAL_MUTEX_DATA_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#af12d673085039783ab1d2613eff7e4a4">pal_plat_rtos.c</a> +</li> +<li>PAL_NET_ASYNCHRONOUS_SOCKET_API +: <a class="el" href="d2/d87/pal__configuration_8h.html#a337c171a4cf5d7f04894051002d81eba">pal_configuration.h</a> +</li> +<li>PAL_NET_DEFAULT_INTERFACE +: <a class="el" href="d9/d17/pal__network_8h.html#aefc09884590381a71433c34b3f2e2aa5">pal_network.h</a> +</li> +<li>PAL_NET_DNS_SUPPORT +: <a class="el" href="d2/d87/pal__configuration_8h.html#ad7e2f6ebd028faacc239229cce972fa7">pal_configuration.h</a> +</li> +<li>PAL_NET_MAX_ADDR_SIZE +: <a class="el" href="d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039">pal_network.h</a> +</li> +<li>PAL_NET_SELECT_IS_ERR +: <a class="el" href="d9/d17/pal__network_8h.html#ac2b7451d38e150079fbef20b57ee3fe9">pal_network.h</a> +</li> +<li>PAL_NET_SELECT_IS_RX +: <a class="el" href="d9/d17/pal__network_8h.html#a8894a96773018ba6058811087b4b2ac8">pal_network.h</a> +</li> +<li>PAL_NET_SELECT_IS_TX +: <a class="el" href="d9/d17/pal__network_8h.html#a31ca79ac9ae5c2ddd890263a989fc4d8">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_ERR_BIT +: <a class="el" href="d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_MAX_SOCKETS +: <a class="el" href="d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_RX_BIT +: <a class="el" href="d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2">pal_network.h</a> +</li> +<li>PAL_NET_SOCKET_SELECT_TX_BIT +: <a class="el" href="d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d">pal_network.h</a> +</li> +<li>PAL_NET_SUPPORT_LWIP +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#abc23815d68dafc619e2c2ba210d65bd0">pal_socket_test.c</a> +</li> +<li>PAL_NET_TCP_AND_TLS_SUPPORT +: <a class="el" href="d2/d87/pal__configuration_8h.html#a4662be64705952cfa0925001c9d917c3">pal_configuration.h</a> +</li> +<li>PAL_NET_TEST_INCOMING_PORT +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#ab1873f5ba58eb802dd808f05a1101670">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_HTTP_PORT +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a7c3cef32674c412f87617e87a194e0e3">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_IP +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a0570e783c7412d25d0c33817da54c02f">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_IP_STRING +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a7175d943793d9a92ebe83d12f2a65063">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_NAME +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#abbe7571a0fc631eb43561606f4d5bb0e">pal_socket_test.c</a> +</li> +<li>PAL_NET_TEST_SERVER_UDP_PORT +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#abc63439a9af70c80b125accdc2afbb12">pal_socket_test.c</a> +</li> +<li>PAL_NTOHL +: <a class="el" href="db/dcf/pal__macros_8h.html#a7cbc81d1fb0dcddb1cc88b59d50c2aa9">pal_macros.h</a> +</li> +<li>PAL_NTOHS +: <a class="el" href="db/dcf/pal__macros_8h.html#a55fbcf7a453813fec69016916802de2c">pal_macros.h</a> +</li> +<li>PAL_NUM_OF_THREAD_INSTANCES +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a9b3b50428d7ad199287a291137041c43">pal_plat_rtos.c</a> +</li> +<li>pal_osAtomicIncrement() +: <a class="el" href="de/d33/pal__rtos_8c.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a">pal_rtos.h</a> +</li> +<li>pal_osDelay() +: <a class="el" href="de/d33/pal__rtos_8c.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25">pal_rtos.h</a> +</li> +<li>pal_osKernelSysMilliSecTick() +: <a class="el" href="de/d33/pal__rtos_8c.html#a59e85747582417a1395ed0f9c140eb8a">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a">pal_rtos.h</a> +</li> +<li>pal_osKernelSysTick() +: <a class="el" href="de/d33/pal__rtos_8c.html#a9800b8b9e057fe17e50c4259c809f898">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898">pal_rtos.h</a> +</li> +<li>pal_osKernelSysTick64() +: <a class="el" href="de/d33/pal__rtos_8c.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401">pal_rtos.h</a> +</li> +<li>pal_osKernelSysTickFrequency() +: <a class="el" href="de/d33/pal__rtos_8c.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc">pal_rtos.h</a> +</li> +<li>pal_osKernelSysTickMicroSec() +: <a class="el" href="de/d33/pal__rtos_8c.html#a34375ee82619a4064849daccbdfbc966">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966">pal_rtos.h</a> +</li> +<li>pal_osMessageGet() +: <a class="el" href="de/d33/pal__rtos_8c.html#ab70d0be45514258874c0406c2040372c">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c">pal_rtos.h</a> +</li> +<li>pal_osMessagePut() +: <a class="el" href="de/d33/pal__rtos_8c.html#a966daa5b0bd9282fbffa7c462da1c417">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417">pal_rtos.h</a> +</li> +<li>pal_osMessageQueueCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#a0c7f0003e92b3494089966d53ab24a1b">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b">pal_rtos.h</a> +</li> +<li>pal_osMessageQueueDestroy() +: <a class="el" href="de/d33/pal__rtos_8c.html#adba13212ec060092acdf6165e82be5b6">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6">pal_rtos.h</a> +</li> +<li>pal_osMutexCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#af89aab14085207b1a0951f7aad24193c">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c">pal_rtos.h</a> +</li> +<li>pal_osMutexDelete() +: <a class="el" href="de/d33/pal__rtos_8c.html#a03f43d7e53435d89f316862b48b573c4">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4">pal_rtos.h</a> +</li> +<li>pal_osMutexRelease() +: <a class="el" href="de/d33/pal__rtos_8c.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc">pal_rtos.h</a> +</li> +<li>pal_osMutexWait() +: <a class="el" href="de/d33/pal__rtos_8c.html#acda0974247325955719b23494d66c622">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622">pal_rtos.h</a> +</li> +<li>pal_osPoolAlloc() +: <a class="el" href="de/d33/pal__rtos_8c.html#a3a2b57685096d16a110ee38f7f29e099">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099">pal_rtos.h</a> +</li> +<li>pal_osPoolCAlloc() +: <a class="el" href="de/d33/pal__rtos_8c.html#a5d20661cd387a172450a2fe12993687a">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a">pal_rtos.h</a> +</li> +<li>pal_osPoolCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6">pal_rtos.h</a> +</li> +<li>pal_osPoolDestroy() +: <a class="el" href="de/d33/pal__rtos_8c.html#a1c01464448f8d7bd95bf518d651484c6">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6">pal_rtos.h</a> +</li> +<li>pal_osPoolFree() +: <a class="el" href="de/d33/pal__rtos_8c.html#a79f4997069310aa7bbb6ae7995988dd7">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7">pal_rtos.h</a> +</li> +<li>pal_osPriority +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535">pal_rtos.h</a> +</li> +<li>PAL_osPriorityAboveNormal +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af">pal_rtos.h</a> +</li> +<li>PAL_osPriorityBelowNormal +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5">pal_rtos.h</a> +</li> +<li>PAL_osPriorityError +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e">pal_rtos.h</a> +</li> +<li>PAL_osPriorityHigh +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2">pal_rtos.h</a> +</li> +<li>PAL_osPriorityIdle +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a">pal_rtos.h</a> +</li> +<li>PAL_osPriorityLow +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec">pal_rtos.h</a> +</li> +<li>PAL_osPriorityNormal +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1">pal_rtos.h</a> +</li> +<li>PAL_osPriorityRealtime +: <a class="el" href="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce">pal_rtos.h</a> +</li> +<li>pal_osReboot() +: <a class="el" href="de/d33/pal__rtos_8c.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8">pal_rtos.h</a> +</li> +<li>pal_osSemaphoreCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#aaa7aee442a5c8cc274d3e52206984037">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037">pal_rtos.h</a> +</li> +<li>pal_osSemaphoreDelete() +: <a class="el" href="de/d33/pal__rtos_8c.html#a45f071482f8669821b90264e0470b33d">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d">pal_rtos.h</a> +</li> +<li>pal_osSemaphoreRelease() +: <a class="el" href="de/d33/pal__rtos_8c.html#a009d0c063119265f9c5c0c9bff379c14">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14">pal_rtos.h</a> +</li> +<li>pal_osSemaphoreWait() +: <a class="el" href="de/d33/pal__rtos_8c.html#aa2d998744dbc9504bfe0358f85457fc4">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4">pal_rtos.h</a> +</li> +<li>pal_osThreadCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#a2dae64d917f644982b893037adf562b4">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4">pal_rtos.h</a> +</li> +<li>pal_osThreadGetId() +: <a class="el" href="de/d33/pal__rtos_8c.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be">pal_rtos.h</a> +</li> +<li>pal_osThreadGetLocalStore() +: <a class="el" href="de/d33/pal__rtos_8c.html#ac94f4efc4bad73969e57c8255c136a0d">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d">pal_rtos.h</a> +</li> +<li>pal_osThreadTerminate() +: <a class="el" href="de/d33/pal__rtos_8c.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18">pal_rtos.h</a> +</li> +<li>pal_osTimerCreate() +: <a class="el" href="de/d33/pal__rtos_8c.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18">pal_rtos.h</a> +</li> +<li>pal_osTimerDelete() +: <a class="el" href="de/d33/pal__rtos_8c.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59">pal_rtos.h</a> +</li> +<li>pal_osTimerStart() +: <a class="el" href="de/d33/pal__rtos_8c.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363">pal_rtos.h</a> +</li> +<li>pal_osTimerStop() +: <a class="el" href="de/d33/pal__rtos_8c.html#a94f4df594102e582cbd2114f6eebb57d">pal_rtos.c</a> +, <a class="el" href="d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d">pal_rtos.h</a> +</li> +<li>pal_plat_bind() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c">pal_plat_network.cpp</a> +</li> +<li>pal_plat_close() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da">pal_plat_network.cpp</a> +</li> +<li>pal_plat_getNetInterfaceInfo() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e">pal_plat_network.h</a> +</li> +<li>pal_plat_getNumberOfNetInterfaces() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#af36bf075867e5ed0be7479312469361f">pal_plat_network.cpp</a> +</li> +<li>pal_plat_getSocketOptions() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9">pal_plat_network.h</a> +</li> +<li>pal_plat_osAtomicIncrement() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ac62a5b36fc159e12670c44a12dc08beb">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osDelay() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osKernelSysMilliSecTick() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a82eade9e7b100bd9dc9ab8312f98f827">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osKernelSysTick() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ae92f87b121a06e0062ee014025c0ba9e">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osKernelSysTick64() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osKernelSysTickFrequency() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#addc790764a23a3e16344bd830ebe01ef">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osKernelSysTickMicroSec() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2d18206974bdf17c48b97e2e16505f19">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessageGet() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a67696b86a6116a82da7c26a433280e58">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessagePut() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aa80549a557e50e0759991c6b11eb456a">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessageQueueCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ad25c8f7cb22985b077e893be5bc27d48">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMessageQueueDestroy() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a0e0e6dc9958a9efd9beb62493bc3f67a">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMutexCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ae2425f958ab7d58eff5c5b3183f40305">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMutexDelete() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a909f4ae03b0acef0b84609d9b76679b4">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMutexRelease() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#add4dbca7b11365e7301db1425c9fdf4d">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osMutexWait() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aea4ad5224c43ff0fff2b77798d19748c">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolAlloc() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a5938d16ea0c12594e8f8becd20acf3a7">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolCAlloc() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a8dff6b49f9798cdd4eed04f3dff30330">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a7a4fa20255fe38cf183f6c924419fe85">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osPoolDestroy() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osPoolFree() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a84e2f41a587335de053e0b7f8a4163c2">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osReboot() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#abdb6ab5827d588b9c2e908beda4c3154">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osSemaphoreCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a6e7b3c23b094270b4e013c4412f2d3b1">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osSemaphoreDelete() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osSemaphoreRelease() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a252f210ce8a502891821b5af24b09822">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osSemaphoreWait() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osThreadCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a9c965e0fdfd80fc86c901cf2bde88c64">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osThreadGetId() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osThreadGetLocalStore() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aca6b1b2f34861cf8e3d2dcc076992270">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osThreadTerminate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a3117f8911b3e83e27031f366aa652a4f">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osTimerCreate() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aee15bcaba1ed33c264bc4c91c1dbb1cf">pal_plat_rtos.c</a> +</li> +<li>pal_plat_osTimerDelete() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osTimerStart() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7">pal_plat_rtos.h</a> +</li> +<li>pal_plat_osTimerStop() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808">pal_plat_rtos.h</a> +</li> +<li>pal_plat_receiveFrom() +: <a class="el" href="d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_network.h</a> +, <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac">pal_plat_network.cpp</a> +</li> +<li>pal_plat_RegisterNetworkInterface() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#ab37f007a0574ca73916b26240ff1126b">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c">pal_plat_network.h</a> +</li> +<li>pal_plat_RTOSDestroy() +: <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_rtos.h</a> +, <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a8a484abc75cf595862459d6ab21c7a0c">pal_plat_rtos.c</a> +</li> +<li>pal_plat_RTOSInitialize() +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_rtos.c</a> +, <a class="el" href="d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42">pal_plat_rtos.h</a> +</li> +<li>pal_plat_sendTo() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a17365747ed8d29df153a336da3942187">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187">pal_plat_network.h</a> +</li> +<li>pal_plat_setSocketOptions() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d">pal_plat_network.h</a> +</li> +<li>pal_plat_socket() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c">pal_plat_network.h</a> +</li> +<li>pal_plat_socketMiniSelect() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09">pal_plat_network.h</a> +</li> +<li>pal_plat_socketsInit() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da">pal_plat_network.h</a> +</li> +<li>pal_plat_socketsTerminate() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_network.cpp</a> +, <a class="el" href="d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd">pal_plat_network.h</a> +</li> +<li>PAL_PRINTF +: <a class="el" href="d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb">pal_rtos.h</a> +</li> +<li>pal_receiveFrom() +: <a class="el" href="d1/dc4/pal__network_8c.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d">pal_network.h</a> +</li> +<li>pal_registerNetworkInterface() +: <a class="el" href="d1/dc4/pal__network_8c.html#a081cc2fd09644c41068673487b39f6b8">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8">pal_network.h</a> +</li> +<li>PAL_RTOS_64BIT_TICK_SUPPORTED +: <a class="el" href="d2/d87/pal__configuration_8h.html#a2c7f7687d719d388a67c1f18f200962d">pal_configuration.h</a> +</li> +<li>PAL_RTOS_MEMORY_POOL_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a31d6d9a16b9891d7eb84e2b974c2c92b">pal_plat_rtos.c</a> +</li> +<li>PAL_RTOS_MESSAGE_Q_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aa1b17e5a20a5db09a3a3267f9a4191e0">pal_plat_rtos.c</a> +</li> +<li>PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aa25bb23dc9f40c91f9872c585e649723">pal_plat_rtos.c</a> +</li> +<li>PAL_RTOS_WAIT_FOREVER +: <a class="el" href="d4/d01/pal__rtos_8h.html#ad19aa2a408e848a5f86d897ab50500ec">pal_rtos.h</a> +</li> +<li>PAL_SEMAPHORE_DATA_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a66dcd5bd7ca661597fecabb1795fa393">pal_plat_rtos.c</a> +</li> +<li>pal_sendTo() +: <a class="el" href="d1/dc4/pal__network_8c.html#acce808f708e653b6bed317072888ca23">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23">pal_network.h</a> +</li> +<li>pal_setSockAddrIPV4Addr() +: <a class="el" href="d1/dc4/pal__network_8c.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa">pal_network.h</a> +</li> +<li>pal_setSockAddrIPV6Addr() +: <a class="el" href="d1/dc4/pal__network_8c.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c">pal_network.h</a> +</li> +<li>pal_setSockAddrPort() +: <a class="el" href="d1/dc4/pal__network_8c.html#abbeb1395896eb79ab564568b9ab8a628">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628">pal_network.h</a> +</li> +<li>pal_setSocketOptions() +: <a class="el" href="d1/dc4/pal__network_8c.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f">pal_network.h</a> +</li> +<li>PAL_SO_RCVTIMEO +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca">pal_network.h</a> +</li> +<li>PAL_SO_REUSEADDR +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001">pal_network.h</a> +</li> +<li>PAL_SO_SNDTIMEO +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de">pal_network.h</a> +</li> +<li>PAL_SOCK_DGRAM +: <a class="el" href="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941">pal_network.h</a> +</li> +<li>pal_socket() +: <a class="el" href="d1/dc4/pal__network_8c.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_network.c</a> +, <a class="el" href="d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a">pal_network.h</a> +</li> +<li>PAL_SOCKET_OPTION_ERROR +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a8c607fcbfa526e4485fcdb55b79b39d6">pal_plat_network.cpp</a> +</li> +<li>pal_socketAddressInternal6_t +: <a class="el" href="d1/dc4/pal__network_8c.html#aaf4e46664d7b7f8902c69cb72a65c943">pal_network.c</a> +</li> +<li>pal_socketAddressInternal_t +: <a class="el" href="d1/dc4/pal__network_8c.html#abc2b368e206e7353e31a520fa573cd8a">pal_network.c</a> +</li> +<li>pal_socketMiniSelect() +: <a class="el" href="d9/d17/pal__network_8h.html#a5cab4ea55a3d28cfd8d4dca8376a111c">pal_network.h</a> +, <a class="el" href="d1/dc4/pal__network_8c.html#a5cab4ea55a3d28cfd8d4dca8376a111c">pal_network.c</a> +</li> +<li>PAL_SUCCESS +: <a class="el" href="d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">pal_types.h</a> +, <a class="el" href="db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5">pal_macros.h</a> +</li> +<li>PAL_TEST_BUFFER_SIZE +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a0010ea5741ae7db441ef09f96eef47be">pal_socket_test.c</a> +</li> +<li>PAL_TICK_TO_MILLI_FACTOR +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a78b1f63823e34bc82e272358701cbe67">pal_plat_rtos.c</a> +</li> +<li>PAL_TIMER_DATA_SIZE +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aba1d833ce13b78f5648ec26cdd25f639">pal_plat_rtos.c</a> +</li> +<li>pal_timeVal_t +: <a class="el" href="d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_network.h</a> +</li> +<li>PAL_UNIQUE_THREAD_PRIORITY +: <a class="el" href="d2/d87/pal__configuration_8h.html#a4d2f5187ecd7e90c094e2f103e5b6839">pal_configuration.h</a> +</li> +<li>palBuffer_t +: <a class="el" href="d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">pal_types.h</a> +</li> +<li>palConstBuffer_t +: <a class="el" href="d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">pal_types.h</a> +</li> +<li>palError_t +: <a class="el" href="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5">pal_errors.h</a> +</li> +<li>palErrorModules_t +: <a class="el" href="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1">pal_errors.h</a> +</li> +<li>palIpV4Addr_t +: <a class="el" href="d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">pal_network.h</a> +</li> +<li>palIpV6Addr_t +: <a class="el" href="d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">pal_network.h</a> +</li> +<li>palMemoryPool_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#afa12596f9e3d06ce0b6fde07eb52d07a">pal_plat_rtos.c</a> +</li> +<li>palMemoryPoolID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">pal_rtos.h</a> +</li> +<li>palMessageQ_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a550ebbfa0932f76e30a372710bff8f60">pal_plat_rtos.c</a> +</li> +<li>palMessageQID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">pal_rtos.h</a> +</li> +<li>palMutex_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a366960ed96b6cf998870481300a739d4">pal_plat_rtos.c</a> +</li> +<li>palMutexID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">pal_rtos.h</a> +</li> +<li>palNetInterfaceInfo_t +: <a class="el" href="d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">pal_network.h</a> +</li> +<li>palOsTimerOnce +: <a class="el" href="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30">pal_rtos.h</a> +</li> +<li>palOsTimerPeriodic +: <a class="el" href="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9">pal_rtos.h</a> +</li> +<li>palRunThreads() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a393f7a6e534c05e534cfdaf46473db45">pal_rtos_test_utils.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a393f7a6e534c05e534cfdaf46473db45">pal_rtos_test.c</a> +</li> +<li>palSelectCallback0() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback1() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback2() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback3() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback4() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback5() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback6() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27">pal_plat_network.cpp</a> +</li> +<li>palSelectCallback7() +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58">pal_plat_network.cpp</a> +</li> +<li>palSelectCallbackFunction_t +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf">pal_plat_network.cpp</a> +</li> +<li>palSemaphore_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aaab2b2c34911a85e67be94866be7e515">pal_plat_rtos.c</a> +</li> +<li>palSemaphoreID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">pal_rtos.h</a> +</li> +<li>palSocket_t +: <a class="el" href="d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">pal_network.h</a> +</li> +<li>palSocketAddress_t +: <a class="el" href="d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">pal_network.h</a> +</li> +<li>palSocketDomain_t +: <a class="el" href="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7">pal_network.h</a> +</li> +<li>palSocketLength_t +: <a class="el" href="d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">pal_network.h</a> +</li> +<li>palSocketOptionName_t +: <a class="el" href="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51">pal_network.h</a> +</li> +<li>palSocketType_t +: <a class="el" href="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418">pal_network.h</a> +</li> +<li>palStatus_t +: <a class="el" href="d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">pal_types.h</a> +</li> +<li>palTestGetNetWorkInterfaceContext() +: <a class="el" href="d8/d5f/pal__socket__test__utils_8cpp.html#a5e4a39a385159acfd150a2e6098351cf">pal_socket_test_utils.cpp</a> +, <a class="el" href="df/d2a/pal__socket__test__utils_8h.html#a5e4a39a385159acfd150a2e6098351cf">pal_socket_test_utils.h</a> +</li> +<li>palThread_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a06ecfc14d166863199ebfc4372d61127">pal_plat_rtos.c</a> +</li> +<li>palThreadFunc1() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a0a153da028aee8f220377b516ff065c8">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFunc2() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a29dc69cbcc48b55d48a5fd668da7fe15">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFunc3() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#acf68b041960be3c58f516986504fcd0f">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFunc4() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a844c7469189866b502ef85df5063e79c">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFunc5() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a5be7a07498de9cc847215e6aa8f77914">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFunc6() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a52dc025f6020b0d456bbbcacc3aa4e3e">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFuncCustom1() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a7c8c7a38fca8b62acc6094ba1f072ec7">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFuncCustom2() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a663a9130dc598399ec3bd9ab9e6680fa">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFuncCustom3() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a300d95346a90a5f17aa6140647243b64">pal_rtos_test_utils.c</a> +</li> +<li>palThreadFuncCustom4() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#aa5b1f9c927c18d821a46d99dfe533cb0">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0">pal_rtos_test_utils.h</a> +</li> +<li>palThreadFuncPtr +: <a class="el" href="d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">pal_rtos.h</a> +</li> +<li>palThreadFuncWrapper_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a3b3cdd4235f3b1a26e63840b91c98e18">pal_plat_rtos.c</a> +</li> +<li>palThreadID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">pal_rtos.h</a> +</li> +<li>palThreadLocalStore_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">pal_rtos.h</a> +</li> +<li>palThreadPriority_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">pal_rtos.h</a> +</li> +<li>palTimer_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2976c77ab047a577ddac4d82bfd40f10">pal_plat_rtos.c</a> +</li> +<li>palTimerFunc1() +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6">pal_rtos_test_utils.h</a> +, <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#abac822ed4b356b85117101aa0d8701d6">pal_rtos_test_utils.c</a> +</li> +<li>palTimerFunc2() +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#a8581bcb8f9f435a87c3dd651d65e32c8">pal_rtos_test_utils.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8">pal_rtos_test_utils.h</a> +</li> +<li>palTimerFuncPtr +: <a class="el" href="d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">pal_rtos.h</a> +</li> +<li>palTimerID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">pal_rtos.h</a> +</li> +<li>palTimerType +: <a class="el" href="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2">pal_rtos.h</a> +</li> +<li>palTimerType_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">pal_rtos.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_s.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,103 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li class="current"><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_s"></a>- s -</h3><ul> +<li>s_palSelectPalCallbackFunctions +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a4f6fdfaea202b7b50e57e7253705d96e">pal_plat_network.cpp</a> +</li> +<li>s_select_event_happened +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a77af6aede7e9f4d41f8c87ebc381b517">pal_plat_network.cpp</a> +</li> +<li>semaphore1 +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#a2f8d675e43058c8f8b853b52366abf38">pal_rtos_test.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38">pal_rtos_test_utils.h</a> +</li> +<li>socketCallback() +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#ad62b547b432124475c3f5a94d9befe6d">pal_socket_test.c</a> +</li> +<li>sw2() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>sw2_press() +: <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">pal_socket_test_main_mbedOS.cpp</a> +, <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde">pal_rtos_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_t.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,146 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li class="current"><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_t"></a>- t -</h3><ul> +<li>TEST() +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#a1e33659cb747282e1869e9f86fe2d33f">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#a89cecd4b07ef1acbb0b40c00189a0f36">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#ab6e3467dab64a1ae60a313f6c004e337">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#a38479981768fb5d46c11768870af9d8e">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a236b8351236670bd5b5a07c92d22df4b">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#ab28ce473e377fbe30049cb41b31dfa4b">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a9286efb458d9a35e4c89e79111bc5b32">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#abbfd14915bd054b23f91a485d4f8fb1e">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a0efc309d0e8eb82d8caf439877959e21">pal_rtos_test.c</a> +</li> +<li>TEST_GROUP() +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#ab19fea07339238925c3b105637ce92c1">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#ad324fc284dd938317109a9fc47dd1732">pal_socket_test.c</a> +</li> +<li>TEST_GROUP_RUNNER() +: <a class="el" href="dd/df6/pal__rtos__test__runner_8c.html#ace47ba1b1706d7b654cdf18e7008b174">pal_rtos_test_runner.c</a> +, <a class="el" href="dc/da5/pal__socket__test__runner_8c.html#a7d7471d47d062a2bf20410044b712192">pal_socket_test_runner.c</a> +</li> +<li>TEST_pal_all_GROUPS_RUNNER() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#adc9a94aa19f52027390d7b0256a6693c">pal_all_test_main_mbedOS.cpp</a> +</li> +<li>TEST_pal_rtos_GROUP_RUNNER() +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc">pal_all_test_main_mbedOS.cpp</a> +</li> +<li>TEST_pal_socket_GROUP_RUNNER() +: <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab">pal_socket_test_main_mbedOS.cpp</a> +, <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab">pal_all_test_main_mbedOS.cpp</a> +</li> +<li>TEST_pal_update_GROUP_RUNNER() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a59390bc31498889208cfda7dea51bffa">pal_all_test_main_mbedOS.cpp</a> +</li> +<li>TEST_PRINTF +: <a class="el" href="d0/d51/pal__test__utils_8h.html#a7f0c3a0f2f1c4062d776a7bc64bed815">pal_test_utils.h</a> +, <a class="el" href="d8/d5f/pal__socket__test__utils_8cpp.html#ac641d6ab2d8d2f23e89e7c36694d85dd">pal_socket_test_utils.cpp</a> +</li> +<li>TEST_SETUP() +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a26217052dc55731aa82231669a8cf0df">pal_socket_test.c</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a8a7c6f6a71607f9dce69207f1f7ed3c1">pal_rtos_test.c</a> +</li> +<li>TEST_TEAR_DOWN() +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#ac5fc4009112ba6cadc74ad8cd14c427b">pal_rtos_test.c</a> +, <a class="el" href="d5/d2a/pal__socket__test_8c.html#ac307640c84843ab78607af150bcbe143">pal_socket_test.c</a> +</li> +<li>thread2 +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>THREAD_STACK_SIZE +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a90b7a8cb7bc3fdbd98014a3e15ee6e9a">pal_rtos_test_utils.h</a> +</li> +<li>threadsArg +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#aecb21b545f5a0c542dc82a8ef0b89b3f">pal_rtos_test_utils.c</a> +</li> +<li>threadsArgument_t +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">pal_rtos_test_utils.h</a> +</li> +<li>timerArgs +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#ad4897778c444c8e8fbcb65c84901ac78">pal_rtos_test_utils.c</a> +</li> +<li>timerArgument_t +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">pal_rtos_test_utils.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_type.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,180 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="#index_p"><span>p</span></a></li> + <li class="current"><a href="#index_t"><span>t</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +  + +<h3><a class="anchor" id="index_p"></a>- p -</h3><ul> +<li>pal_in_addr_t +: <a class="el" href="d1/dc4/pal__network_8c.html#abd4e26912e35fc58e5bc0172765bdc6e">pal_network.c</a> +</li> +<li>pal_socketAddressInternal6_t +: <a class="el" href="d1/dc4/pal__network_8c.html#aaf4e46664d7b7f8902c69cb72a65c943">pal_network.c</a> +</li> +<li>pal_socketAddressInternal_t +: <a class="el" href="d1/dc4/pal__network_8c.html#abc2b368e206e7353e31a520fa573cd8a">pal_network.c</a> +</li> +<li>pal_timeVal_t +: <a class="el" href="d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4">pal_network.h</a> +</li> +<li>palBuffer_t +: <a class="el" href="d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4">pal_types.h</a> +</li> +<li>palConstBuffer_t +: <a class="el" href="d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81">pal_types.h</a> +</li> +<li>palIpV4Addr_t +: <a class="el" href="d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1">pal_network.h</a> +</li> +<li>palIpV6Addr_t +: <a class="el" href="d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192">pal_network.h</a> +</li> +<li>palMemoryPool_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#afa12596f9e3d06ce0b6fde07eb52d07a">pal_plat_rtos.c</a> +</li> +<li>palMemoryPoolID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb">pal_rtos.h</a> +</li> +<li>palMessageQ_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a550ebbfa0932f76e30a372710bff8f60">pal_plat_rtos.c</a> +</li> +<li>palMessageQID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910">pal_rtos.h</a> +</li> +<li>palMutex_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a366960ed96b6cf998870481300a739d4">pal_plat_rtos.c</a> +</li> +<li>palMutexID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901">pal_rtos.h</a> +</li> +<li>palNetInterfaceInfo_t +: <a class="el" href="d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da">pal_network.h</a> +</li> +<li>palSelectCallbackFunction_t +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf">pal_plat_network.cpp</a> +</li> +<li>palSemaphore_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#aaab2b2c34911a85e67be94866be7e515">pal_plat_rtos.c</a> +</li> +<li>palSemaphoreID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481">pal_rtos.h</a> +</li> +<li>palSocket_t +: <a class="el" href="d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996">pal_network.h</a> +</li> +<li>palSocketAddress_t +: <a class="el" href="d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10">pal_network.h</a> +</li> +<li>palSocketLength_t +: <a class="el" href="d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901">pal_network.h</a> +</li> +<li>palStatus_t +: <a class="el" href="d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d">pal_types.h</a> +</li> +<li>palThread_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a06ecfc14d166863199ebfc4372d61127">pal_plat_rtos.c</a> +</li> +<li>palThreadFuncPtr +: <a class="el" href="d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853">pal_rtos.h</a> +</li> +<li>palThreadFuncWrapper_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a3b3cdd4235f3b1a26e63840b91c98e18">pal_plat_rtos.c</a> +</li> +<li>palThreadID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5">pal_rtos.h</a> +</li> +<li>palThreadLocalStore_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c">pal_rtos.h</a> +</li> +<li>palThreadPriority_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be">pal_rtos.h</a> +</li> +<li>palTimer_t +: <a class="el" href="d4/dc5/pal__plat__rtos_8c.html#a2976c77ab047a577ddac4d82bfd40f10">pal_plat_rtos.c</a> +</li> +<li>palTimerFuncPtr +: <a class="el" href="d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b">pal_rtos.h</a> +</li> +<li>palTimerID_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985">pal_rtos.h</a> +</li> +<li>palTimerType_t +: <a class="el" href="d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a">pal_rtos.h</a> +</li> +</ul> + + +<h3><a class="anchor" id="index_t"></a>- t -</h3><ul> +<li>threadsArgument_t +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0">pal_rtos_test_utils.h</a> +</li> +<li>timerArgument_t +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76">pal_rtos_test_utils.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_u.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,87 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_b"><span>b</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li class="current"><a href="globals_u.html#index_u"><span>u</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_u"></a>- u -</h3><ul> +<li>UnityMain() +: <a class="el" href="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">pal_all_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">pal_socket_test_main_mbedOS.cpp</a> +, <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5">pal_rtos_test_main_mbedOS.cpp</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_v.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_a"><span>a</span></a></li> + <li><a href="globals_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_i.html#index_i"><span>i</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li class="current"><a href="globals_v.html#index_v"><span>v</span></a></li> + <li><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_v"></a>- v -</h3><ul> +<li>vPortSVCHandler +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ad43047b3ea0a146673e30637488bf754">FreeRTOSConfig.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_vars.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,113 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> + <ul> +<li>button_pressed +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>g_networkInterface +: <a class="el" href="d5/d2a/pal__socket__test_8c.html#a702871d3d9057fa4fc99031298fb425c">pal_socket_test.c</a> +</li> +<li>g_threadsArg +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a8f9b1f133f82ce955405d453f0c506d6">pal_rtos_test.c</a> +</li> +<li>g_threadStorage +: <a class="el" href="da/d2d/pal__rtos__test_8c.html#a9beaf51023e475986b8b182c80ccc023">pal_rtos_test.c</a> +, <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023">pal_rtos_test_utils.h</a> +</li> +<li>g_timerArgs +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a1a09db2f0cd5dd2d0929b34afad51ba1">pal_rtos_test.c</a> +</li> +<li>mutex1 +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#adb164ebbfd2189f434f5e550e2d93bb4">pal_rtos_test.c</a> +</li> +<li>mutex2 +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a8706c6b975e957968f23af2812bbc0cb">pal_rtos_test.c</a> +</li> +<li>s_palSelectPalCallbackFunctions +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a4f6fdfaea202b7b50e57e7253705d96e">pal_plat_network.cpp</a> +</li> +<li>s_select_event_happened +: <a class="el" href="d3/dfb/pal__plat__network_8cpp.html#a77af6aede7e9f4d41f8c87ebc381b517">pal_plat_network.cpp</a> +</li> +<li>semaphore1 +: <a class="el" href="d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38">pal_rtos_test_utils.h</a> +, <a class="el" href="da/d2d/pal__rtos__test_8c.html#a2f8d675e43058c8f8b853b52366abf38">pal_rtos_test.c</a> +</li> +<li>thread2 +: <a class="el" href="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">pal_rtos_test_main_mbedOS.cpp</a> +, <a class="el" href="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487">pal_socket_test_main_mbedOS.cpp</a> +</li> +<li>threadsArg +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#aecb21b545f5a0c542dc82a8ef0b89b3f">pal_rtos_test_utils.c</a> +</li> +<li>timerArgs +: <a class="el" href="d1/dee/pal__rtos__test__utils_8c.html#ad4897778c444c8e8fbcb65c84901ac78">pal_rtos_test_utils.c</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/globals_x.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,93 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Globals</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li class="current"><a href="files.html"><span>Files</span></a></li> + </ul> + </div> + <div id="navrow2" class="tabs2"> + <ul class="tablist"> + <li><a href="files.html"><span>File List</span></a></li> + <li class="current"><a href="globals.html"><span>Globals</span></a></li> + </ul> + </div> + <div id="navrow3" class="tabs2"> + <ul class="tablist"> + <li class="current"><a href="globals.html"><span>All</span></a></li> + <li><a href="globals_func.html"><span>Functions</span></a></li> + <li><a href="globals_vars.html"><span>Variables</span></a></li> + <li><a href="globals_type.html"><span>Typedefs</span></a></li> + <li><a href="globals_enum.html"><span>Enumerations</span></a></li> + <li><a href="globals_eval.html"><span>Enumerator</span></a></li> + <li><a href="globals_defs.html"><span>Macros</span></a></li> + </ul> + </div> + <div id="navrow4" class="tabs3"> + <ul class="tablist"> + <li><a href="globals.html#index_a"><span>a</span></a></li> + <li><a href="globals_b.html#index_b"><span>b</span></a></li> + <li><a href="globals_c.html#index_c"><span>c</span></a></li> + <li><a href="globals_d.html#index_d"><span>d</span></a></li> + <li><a href="globals_g.html#index_g"><span>g</span></a></li> + <li><a href="globals_i.html#index_i"><span>i</span></a></li> + <li><a href="globals_l.html#index_l"><span>l</span></a></li> + <li><a href="globals_m.html#index_m"><span>m</span></a></li> + <li><a href="globals_n.html#index_n"><span>n</span></a></li> + <li><a href="globals_p.html#index_p"><span>p</span></a></li> + <li><a href="globals_s.html#index_s"><span>s</span></a></li> + <li><a href="globals_t.html#index_t"><span>t</span></a></li> + <li><a href="globals_u.html#index_u"><span>u</span></a></li> + <li><a href="globals_v.html#index_v"><span>v</span></a></li> + <li class="current"><a href="globals_x.html#index_x"><span>x</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="contents"> +<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div> + +<h3><a class="anchor" id="index_x"></a>- x -</h3><ul> +<li>xPortPendSVHandler +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#a6f30022da7d797dd31f1b8a11cae9a35">FreeRTOSConfig.h</a> +</li> +<li>xPortSysTickHandler +: <a class="el" href="de/d33/_free_r_t_o_s_config_8h.html#ae42e6318b5d564e44f97f8c765859448">FreeRTOSConfig.h</a> +</li> +</ul> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/index.hhc Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,799 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<HTML><HEAD></HEAD><BODY> +<OBJECT type="text/site properties"> +<param name="FrameName" value="right"> +</OBJECT> +<UL> +<LI><OBJECT type="text/sitemap"><param name="Name" value="Data Structures"><param name="Local" value="annotated.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Data Structures"><param name="Local" value="annotated.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="_palBuffer_t"><param name="Local" value="d8/d19/struct__pal_buffer__t.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="buffer"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="bufferLength"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="maxBufferLength"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="_palConstBuffer_t"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="buffer"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="bufferLength"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="maxBufferLength"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_threadLocalStore"><param name="Local" value="df/d48/structpal__thread_local_store.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="storeData"><param name="Local" value="df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_timeVal"><param name="Local" value="de/dfc/structpal__time_val.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_tv_sec"><param name="Local" value="de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_tv_usec"><param name="Local" value="de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palNetInterfaceInfo"><param name="Local" value="d9/d16/structpal_net_interface_info.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="address"><param name="Local" value="d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="addressSize"><param name="Local" value="d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="interfaceName"><param name="Local" value="d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocketAddress"><param name="Local" value="db/d42/structpal_socket_address.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="addressData"><param name="Local" value="db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="addressType"><param name="Local" value="db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="threadsArgument"><param name="Local" value="d3/d30/structthreads_argument.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg1"><param name="Local" value="d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg2"><param name="Local" value="d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg3"><param name="Local" value="d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg4"><param name="Local" value="d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg5"><param name="Local" value="d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg6"><param name="Local" value="d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg7"><param name="Local" value="d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="timerArgument"><param name="Local" value="dc/d2c/structtimer_argument.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="ticksBeforeTimer"><param name="Local" value="dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="ticksInFunc1"><param name="Local" value="dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="ticksInFunc2"><param name="Local" value="dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Data Structure Index"><param name="Local" value="classes.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Data Fields"><param name="Local" value="functions.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="All"><param name="Local" value="functions.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Variables"><param name="Local" value="functions_vars.html"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> +<LI><OBJECT type="text/sitemap"><param name="Name" value="Files"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="File List"><param name="Local" value="files.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Source"><param name="Local" value="dir_74389ed8173ad57b461b9d623a1f3867.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL-Impl"><param name="Local" value="dir_8a9a67948239eaee56ff05ba80ad2d3c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Modules"><param name="Local" value="dir_5097254b22164c5ad71a4eec719a72ee.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Networking"><param name="Local" value="dir_59e3d70b06141856a554dd7aab1293ae.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_network.c"><param name="Local" value="d1/dc4/pal__network_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_in_addr_t"><param name="Local" value="d1/dc4/pal__network_8c.html#abd4e26912e35fc58e5bc0172765bdc6e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socketAddressInternal6_t"><param name="Local" value="d1/dc4/pal__network_8c.html#aaf4e46664d7b7f8902c69cb72a65c943"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socketAddressInternal_t"><param name="Local" value="d1/dc4/pal__network_8c.html#abc2b368e206e7353e31a520fa573cd8a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_bind"><param name="Local" value="d1/dc4/pal__network_8c.html#ac1ff0fb22cbd84e6c7920c095ddbde63"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_close"><param name="Local" value="d1/dc4/pal__network_8c.html#a18197e0f047f17d2617461594f5ed644"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getNetInterfaceInfo"><param name="Local" value="d1/dc4/pal__network_8c.html#a5258efd8b21d9c881df29b29686674d8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getNumberOfNetInterfaces"><param name="Local" value="d1/dc4/pal__network_8c.html#a65df7c68bcf7a21db5d1a7a3830fd19c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSockAddrIPV4Addr"><param name="Local" value="d1/dc4/pal__network_8c.html#ade5cf610808db5462666465b648e7724"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSockAddrIPV6Addr"><param name="Local" value="d1/dc4/pal__network_8c.html#a153bc6165f64bbf3e6bcc79b0d39138f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSockAddrPort"><param name="Local" value="d1/dc4/pal__network_8c.html#a4658c7e8224b536d4fd71fed2602b12e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSocketOptions"><param name="Local" value="d1/dc4/pal__network_8c.html#a2d9d4e04e43995123efe134c767cd6e1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_receiveFrom"><param name="Local" value="d1/dc4/pal__network_8c.html#a6b5e705be1e7c3c16080f2b05b87ff7d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_registerNetworkInterface"><param name="Local" value="d1/dc4/pal__network_8c.html#a081cc2fd09644c41068673487b39f6b8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_sendTo"><param name="Local" value="d1/dc4/pal__network_8c.html#acce808f708e653b6bed317072888ca23"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSockAddrIPV4Addr"><param name="Local" value="d1/dc4/pal__network_8c.html#aed02a6f53b88e1d5e81607b1221a3efa"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSockAddrIPV6Addr"><param name="Local" value="d1/dc4/pal__network_8c.html#a0cc13f7ef9ceb4a75884a8bebf0d831c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSockAddrPort"><param name="Local" value="d1/dc4/pal__network_8c.html#abbeb1395896eb79ab564568b9ab8a628"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSocketOptions"><param name="Local" value="d1/dc4/pal__network_8c.html#a2e1bbe81a35a1cb54c351912bb97736f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socket"><param name="Local" value="d1/dc4/pal__network_8c.html#aa852fb6e271fb91efd65e2a1ead93b9a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socketMiniSelect"><param name="Local" value="d1/dc4/pal__network_8c.html#a5cab4ea55a3d28cfd8d4dca8376a111c"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="RTOS"><param name="Local" value="dir_0a6b9d10733e8fa4306fa781def1f127.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_rtos.c"><param name="Local" value="de/d33/pal__rtos_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="dbgPrintf"><param name="Local" value="de/d33/pal__rtos_8c.html#a2b4f475c89ea263557d6529c4d9a9353"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osAtomicIncrement"><param name="Local" value="de/d33/pal__rtos_8c.html#a9b33d260ee1022f5b5f6a9dfc3363f2a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osDelay"><param name="Local" value="de/d33/pal__rtos_8c.html#ad6aaee432fd7ea5e35ab500a6278cc25"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysMilliSecTick"><param name="Local" value="de/d33/pal__rtos_8c.html#a59e85747582417a1395ed0f9c140eb8a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTick"><param name="Local" value="de/d33/pal__rtos_8c.html#a9800b8b9e057fe17e50c4259c809f898"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTick64"><param name="Local" value="de/d33/pal__rtos_8c.html#af88551b6ca24a7a2bb6d94d423eb4401"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTickFrequency"><param name="Local" value="de/d33/pal__rtos_8c.html#a087214ae87c20fd59f47fe3c96d0eefc"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTickMicroSec"><param name="Local" value="de/d33/pal__rtos_8c.html#a34375ee82619a4064849daccbdfbc966"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessageGet"><param name="Local" value="de/d33/pal__rtos_8c.html#ab70d0be45514258874c0406c2040372c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessagePut"><param name="Local" value="de/d33/pal__rtos_8c.html#a966daa5b0bd9282fbffa7c462da1c417"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessageQueueCreate"><param name="Local" value="de/d33/pal__rtos_8c.html#a0c7f0003e92b3494089966d53ab24a1b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessageQueueDestroy"><param name="Local" value="de/d33/pal__rtos_8c.html#adba13212ec060092acdf6165e82be5b6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexCreate"><param name="Local" value="de/d33/pal__rtos_8c.html#af89aab14085207b1a0951f7aad24193c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexDelete"><param name="Local" value="de/d33/pal__rtos_8c.html#a03f43d7e53435d89f316862b48b573c4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexRelease"><param name="Local" value="de/d33/pal__rtos_8c.html#a1d976a616a5c850b2016b2b87d8b47cc"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexWait"><param name="Local" value="de/d33/pal__rtos_8c.html#acda0974247325955719b23494d66c622"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolAlloc"><param name="Local" value="de/d33/pal__rtos_8c.html#a3a2b57685096d16a110ee38f7f29e099"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolCAlloc"><param name="Local" value="de/d33/pal__rtos_8c.html#a5d20661cd387a172450a2fe12993687a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolCreate"><param name="Local" value="de/d33/pal__rtos_8c.html#a1245f053abb3fdb7ab2ceb5a2899e8c6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolDestroy"><param name="Local" value="de/d33/pal__rtos_8c.html#a1c01464448f8d7bd95bf518d651484c6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolFree"><param name="Local" value="de/d33/pal__rtos_8c.html#a79f4997069310aa7bbb6ae7995988dd7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osReboot"><param name="Local" value="de/d33/pal__rtos_8c.html#ab8ab0f31bbf4258b7684d22e7725a9f8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreCreate"><param name="Local" value="de/d33/pal__rtos_8c.html#aaa7aee442a5c8cc274d3e52206984037"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreDelete"><param name="Local" value="de/d33/pal__rtos_8c.html#a45f071482f8669821b90264e0470b33d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreRelease"><param name="Local" value="de/d33/pal__rtos_8c.html#a009d0c063119265f9c5c0c9bff379c14"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreWait"><param name="Local" value="de/d33/pal__rtos_8c.html#aa2d998744dbc9504bfe0358f85457fc4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadCreate"><param name="Local" value="de/d33/pal__rtos_8c.html#a2dae64d917f644982b893037adf562b4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadGetId"><param name="Local" value="de/d33/pal__rtos_8c.html#a2993b8f6b5e8d7ccd6121dc18330e4be"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadGetLocalStore"><param name="Local" value="de/d33/pal__rtos_8c.html#ac94f4efc4bad73969e57c8255c136a0d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadTerminate"><param name="Local" value="de/d33/pal__rtos_8c.html#abcfa47b411929b33d5d9cfaaff28ce18"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerCreate"><param name="Local" value="de/d33/pal__rtos_8c.html#aa4da36fbbba744a14d1bdfe2a26d1a18"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerDelete"><param name="Local" value="de/d33/pal__rtos_8c.html#ac7ca6e7c3c229f4092c9df4b69e7dd59"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerStart"><param name="Local" value="de/d33/pal__rtos_8c.html#a6c60c9e433bc6005bac6b02d5aba7363"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerStop"><param name="Local" value="de/d33/pal__rtos_8c.html#a94f4df594102e582cbd2114f6eebb57d"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Services-API"><param name="Local" value="dir_18cc01a76aedd55acdee1b7ef37dd546.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal.h"><param name="Local" value="d9/d16/pal_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_destroy"><param name="Local" value="d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_init"><param name="Local" value="d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_configuration.h"><param name="Local" value="d2/d87/pal__configuration_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_NUMBER_OF_THREADS"><param name="Local" value="d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_SUPORTED_NET_INTEFACES"><param name="Local" value="d2/d87/pal__configuration_8h.html#a79ed46284848e83d0dba68933c40f82a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_ASYNCHRONOUS_SOCKET_API"><param name="Local" value="d2/d87/pal__configuration_8h.html#a337c171a4cf5d7f04894051002d81eba"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_DNS_SUPPORT"><param name="Local" value="d2/d87/pal__configuration_8h.html#ad7e2f6ebd028faacc239229cce972fa7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_TCP_AND_TLS_SUPPORT"><param name="Local" value="d2/d87/pal__configuration_8h.html#a4662be64705952cfa0925001c9d917c3"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_RTOS_64BIT_TICK_SUPPORTED"><param name="Local" value="d2/d87/pal__configuration_8h.html#a2c7f7687d719d388a67c1f18f200962d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_UNIQUE_THREAD_PRIORITY"><param name="Local" value="d2/d87/pal__configuration_8h.html#a4d2f5187ecd7e90c094e2f103e5b6839"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_errors.h"><param name="Local" value="da/dfe/pal__errors_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palError_t"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_GENERAL_BASE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_GENERIC_FAILURE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_INVALID_ARGUMENT"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_NO_MEMORY"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_BUFFER_TOO_SMALL"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_NOT_SUPPORTED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_TIMEOUT_EXPIRED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_NOT_INITIALIZED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_NULL_POINTER"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_CREATION_FAILED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_NOT_IMPLEMENTED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_ERROR_BASE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_PARAMETER"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_RESOURCE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_TIMEOUT"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_ISR"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_ISR_RECURSIVE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_PRIORITY"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_NO_MEMORY"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_VALUE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_RTOS_OS"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_ERROR_BASE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_GENERIC"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_NO_BUFFERS"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_HOST_UNREACHABLE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_IN_PROGRES"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_INVALID_VALUE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_WOULD_BLOCK"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_ADDRESS_IN_USE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_ALREADY_CONNECTED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_ABORTED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_RESET"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_NOT_CONNECTED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_CLOSED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_INVALID_ADDRESS"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_DNS_ERROR"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_HDCP_ERROR"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_AUTH_ERROR"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_ERROR_BASE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_ERROR"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_BUSY"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_TIMEOUT"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_OUT_OF_BOUNDS"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_PALFROM_API"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_PALFROM_IO"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_END_OF_IMAGE"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_UPDATE_CHUNK_TO_SMALL"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palErrorModules_t"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_GENERAL"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_PAL"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_C"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_RTOS"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_NET"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_TLS"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_CRYPTO"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_ERR_MODULE_UPDATE"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_macros.h"><param name="Local" value="db/dcf/pal__macros_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="DEBUG_PRINT"><param name="Local" value="db/dcf/pal__macros_8h.html#aa1b662a1198e5729d6d0934a7efb02c4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="LITTLE__ENDIAN"><param name="Local" value="db/dcf/pal__macros_8h.html#a1651594dc71abf466bddd0f6393edb8b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_DIVIDE_ROUND_UP"><param name="Local" value="db/dcf/pal__macros_8h.html#a966411fe41e3830553bb1b8cf8baf730"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_16BIT"><param name="Local" value="db/dcf/pal__macros_8h.html#a9bd4f76c3897b4338fe50a8d69830fe5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_32BIT"><param name="Local" value="db/dcf/pal__macros_8h.html#ab01046a25df49d7fe1d85a8bf722975f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_64BIT"><param name="Local" value="db/dcf/pal__macros_8h.html#adc0a4752569188800a75e1601a7e11b5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_HTONL"><param name="Local" value="db/dcf/pal__macros_8h.html#a55b1a7d9f939231045521ec4a4817cff"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_HTONS"><param name="Local" value="db/dcf/pal__macros_8h.html#a98390512a7c2732f1197b07acf03e226"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_INVERSE_UINT16_BYTES"><param name="Local" value="db/dcf/pal__macros_8h.html#ad989cc9220df56cd410590fc628e93b7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_INVERSE_UINT32_BYTES"><param name="Local" value="db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_INVERSE_UINT64_BYTES"><param name="Local" value="db/dcf/pal__macros_8h.html#ae376dc7d0682fb2fc8927897fb065c4c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_16BIT"><param name="Local" value="db/dcf/pal__macros_8h.html#ad1c98870c5eeba8fe649345e371ef866"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_32BIT"><param name="Local" value="db/dcf/pal__macros_8h.html#aa6229ece344478c07677c8b0436b1bb0"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_64BIT"><param name="Local" value="db/dcf/pal__macros_8h.html#a4ae1ca0100a3eee36eb95931cbec633e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX"><param name="Local" value="db/dcf/pal__macros_8h.html#a117c6ce53646b65b4cdcb5da01801675"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_INT32"><param name="Local" value="db/dcf/pal__macros_8h.html#a6ee734c1fc41affa0926797e382fc8d4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_INT64"><param name="Local" value="db/dcf/pal__macros_8h.html#ada154fcb4b3ef9b641486f30de56c7b7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_UINT16"><param name="Local" value="db/dcf/pal__macros_8h.html#af8d58ab12b0f655fe922fc40b3e52ca2"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_UINT32"><param name="Local" value="db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_UINT64"><param name="Local" value="db/dcf/pal__macros_8h.html#a28a8006d7bca3b64235ca4d0cb39bf2b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MAX_UINT8"><param name="Local" value="db/dcf/pal__macros_8h.html#a08c56fc189bfb1a6864a7b5d68433e7e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MIN"><param name="Local" value="db/dcf/pal__macros_8h.html#a29066dd6aaf6aa8fa21f3a88feb6da59"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MIN_INT32"><param name="Local" value="db/dcf/pal__macros_8h.html#ac3a2f334767728e9bc57512139e0bd61"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MODULE_DEINIT"><param name="Local" value="db/dcf/pal__macros_8h.html#aaeb3e06c7119793239368c0fe74cda05"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MODULE_INIT"><param name="Local" value="db/dcf/pal__macros_8h.html#ad2109677fa03720f6ab0df072c755529"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MODULE_IS_INIT"><param name="Local" value="db/dcf/pal__macros_8h.html#ade9a83a9aab96cf50058801afdef4ace"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NTOHL"><param name="Local" value="db/dcf/pal__macros_8h.html#a7cbc81d1fb0dcddb1cc88b59d50c2aa9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NTOHS"><param name="Local" value="db/dcf/pal__macros_8h.html#a55fbcf7a453813fec69016916802de2c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SUCCESS"><param name="Local" value="db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_network.h"><param name="Local" value="d9/d17/pal__network_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocketAddress"><param name="Local" value="db/d42/structpal_socket_address.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="addressData"><param name="Local" value="db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="addressType"><param name="Local" value="db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palNetInterfaceInfo"><param name="Local" value="d9/d16/structpal_net_interface_info.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="address"><param name="Local" value="d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="addressSize"><param name="Local" value="d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="interfaceName"><param name="Local" value="d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_timeVal"><param name="Local" value="de/dfc/structpal__time_val.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_tv_sec"><param name="Local" value="de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_tv_usec"><param name="Local" value="de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_IPV4_ADDRESS_SIZE"><param name="Local" value="d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_IPV6_ADDRESS_SIZE"><param name="Local" value="d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_DEFAULT_INTERFACE"><param name="Local" value="d9/d17/pal__network_8h.html#aefc09884590381a71433c34b3f2e2aa5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_MAX_ADDR_SIZE"><param name="Local" value="d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SELECT_IS_ERR"><param name="Local" value="d9/d17/pal__network_8h.html#ac2b7451d38e150079fbef20b57ee3fe9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SELECT_IS_RX"><param name="Local" value="d9/d17/pal__network_8h.html#a8894a96773018ba6058811087b4b2ac8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SELECT_IS_TX"><param name="Local" value="d9/d17/pal__network_8h.html#a31ca79ac9ae5c2ddd890263a989fc4d8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SOCKET_SELECT_ERR_BIT"><param name="Local" value="d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SOCKET_SELECT_MAX_SOCKETS"><param name="Local" value="d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SOCKET_SELECT_RX_BIT"><param name="Local" value="d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SOCKET_SELECT_TX_BIT"><param name="Local" value="d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_timeVal_t"><param name="Local" value="d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palIpV4Addr_t"><param name="Local" value="d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palIpV6Addr_t"><param name="Local" value="d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palNetInterfaceInfo_t"><param name="Local" value="d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocket_t"><param name="Local" value="d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocketAddress_t"><param name="Local" value="d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocketLength_t"><param name="Local" value="d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocketDomain_t"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_AF_UNSPEC"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_AF_INET"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_AF_INET6"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocketOptionName_t"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SO_REUSEADDR"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SO_SNDTIMEO"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SO_RCVTIMEO"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSocketType_t"><param name="Local" value="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SOCK_DGRAM"><param name="Local" value="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_bind"><param name="Local" value="d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_close"><param name="Local" value="d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getNetInterfaceInfo"><param name="Local" value="d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getNumberOfNetInterfaces"><param name="Local" value="d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSockAddrIPV4Addr"><param name="Local" value="d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSockAddrIPV6Addr"><param name="Local" value="d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSockAddrPort"><param name="Local" value="d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_getSocketOptions"><param name="Local" value="d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_receiveFrom"><param name="Local" value="d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_registerNetworkInterface"><param name="Local" value="d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_sendTo"><param name="Local" value="d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSockAddrIPV4Addr"><param name="Local" value="d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSockAddrIPV6Addr"><param name="Local" value="d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSockAddrPort"><param name="Local" value="d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_setSocketOptions"><param name="Local" value="d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socket"><param name="Local" value="d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socketMiniSelect"><param name="Local" value="d9/d17/pal__network_8h.html#a5cab4ea55a3d28cfd8d4dca8376a111c"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_rtos.h"><param name="Local" value="d4/d01/pal__rtos_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_threadLocalStore"><param name="Local" value="df/d48/structpal__thread_local_store.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="storeData"><param name="Local" value="df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_PRINTF"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_RTOS_WAIT_FOREVER"><param name="Local" value="d4/d01/pal__rtos_8h.html#ad19aa2a408e848a5f86d897ab50500ec"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palMemoryPoolID_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palMessageQID_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palMutexID_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSemaphoreID_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncPtr"><param name="Local" value="d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadID_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadLocalStore_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadPriority_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerFuncPtr"><param name="Local" value="d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerID_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerType_t"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPriority"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityIdle"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityLow"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityBelowNormal"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityNormal"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityAboveNormal"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityHigh"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityRealtime"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_osPriorityError"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerType"><param name="Local" value="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palOsTimerOnce"><param name="Local" value="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palOsTimerPeriodic"><param name="Local" value="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="dbgPrintf"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osAtomicIncrement"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osDelay"><param name="Local" value="d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysMilliSecTick"><param name="Local" value="d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTick"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTick64"><param name="Local" value="d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTickFrequency"><param name="Local" value="d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osKernelSysTickMicroSec"><param name="Local" value="d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessageGet"><param name="Local" value="d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessagePut"><param name="Local" value="d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessageQueueCreate"><param name="Local" value="d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMessageQueueDestroy"><param name="Local" value="d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexCreate"><param name="Local" value="d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexDelete"><param name="Local" value="d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexRelease"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osMutexWait"><param name="Local" value="d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolAlloc"><param name="Local" value="d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolCAlloc"><param name="Local" value="d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolCreate"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolDestroy"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osPoolFree"><param name="Local" value="d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osReboot"><param name="Local" value="d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreCreate"><param name="Local" value="d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreDelete"><param name="Local" value="d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreRelease"><param name="Local" value="d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osSemaphoreWait"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadCreate"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadGetId"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadGetLocalStore"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osThreadTerminate"><param name="Local" value="d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerCreate"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerDelete"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerStart"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_osTimerStop"><param name="Local" value="d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_types.h"><param name="Local" value="d6/dc2/pal__types_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="_palBuffer_t"><param name="Local" value="d8/d19/struct__pal_buffer__t.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="buffer"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="bufferLength"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="maxBufferLength"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="_palConstBuffer_t"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="buffer"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="bufferLength"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="maxBufferLength"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="NULLPTR"><param name="Local" value="d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SUCCESS"><param name="Local" value="d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palBuffer_t"><param name="Local" value="d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palConstBuffer_t"><param name="Local" value="d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palStatus_t"><param name="Local" value="d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_init.c"><param name="Local" value="d7/d66/pal__init_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_destroy"><param name="Local" value="d7/d66/pal__init_8c.html#a312dfda15122dbd2abff67b580c811ad"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_init"><param name="Local" value="d7/d66/pal__init_8c.html#a28095bec6e2c1c74ad3b08414f44b9d6"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Port"><param name="Local" value="dir_0bf78cffa0901bd3b5cb7be7888aabc9.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Platform-API"><param name="Local" value="dir_21bbc5adf7d2637a4cb8a3cee979c96f.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_network.h"><param name="Local" value="d9/d2c/pal__plat__network_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_bind"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_close"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_getNetInterfaceInfo"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_getNumberOfNetInterfaces"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_getSocketOptions"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_receiveFrom"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_RegisterNetworkInterface"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_sendTo"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_setSocketOptions"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socket"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socketMiniSelect"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socketsInit"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socketsTerminate"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_rtos.h"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osAtomicIncrement"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osDelay"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysMilliSecTick"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysTick"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysTick64"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysTickFrequency"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysTickMicroSec"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessageGet"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessagePut"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessageQueueCreate"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessageQueueDestroy"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexCreate"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexDelete"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexRelease"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexWait"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolAlloc"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolCAlloc"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolCreate"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolDestroy"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolFree"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osReboot"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreCreate"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreDelete"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreRelease"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreWait"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadCreate"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadGetId"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadGetLocalStore"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadTerminate"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerCreate"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerDelete"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerStart"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerStop"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_RTOSDestroy"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_RTOSInitialize"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Reference-Impl"><param name="Local" value="dir_c08386f3c1aee312ced83a5951d11ed6.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="mbedOS"><param name="Local" value="dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Networking"><param name="Local" value="dir_ddf5611ee10e8b15ebe1664d2c043f4e.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_network.cpp"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SOCKET_OPTION_ERROR"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a8c607fcbfa526e4485fcdb55b79b39d6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallbackFunction_t"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_bind"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_close"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_getNetInterfaceInfo"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6dc3b4c06e96b29068995809b98a935e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_getNumberOfNetInterfaces"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#af36bf075867e5ed0be7479312469361f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_getSocketOptions"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_receiveFrom"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_RegisterNetworkInterface"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab37f007a0574ca73916b26240ff1126b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_sendTo"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a17365747ed8d29df153a336da3942187"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_setSocketOptions"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socket"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a58a25ae30bb6225cc8b5344053fd705c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socketMiniSelect"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa0c26dfeee80444e58eacab238206d09"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socketsInit"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab92cca0e4facf3d62e03c0d0ca0523da"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_socketsTerminate"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback0"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback1"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback2"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback3"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback4"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback5"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback6"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSelectCallback7"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="s_palSelectPalCallbackFunctions"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a4f6fdfaea202b7b50e57e7253705d96e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="s_select_event_happened"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a77af6aede7e9f4d41f8c87ebc381b517"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="RTOS"><param name="Local" value="dir_1460475e8e667d8c97e1be97dbcd2231.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_rtos.c"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_MUTEX_DATA_SIZE"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#af12d673085039783ab1d2613eff7e4a4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NUM_OF_THREAD_INSTANCES"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9b3b50428d7ad199287a291137041c43"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_RTOS_MEMORY_POOL_SIZE"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a31d6d9a16b9891d7eb84e2b974c2c92b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_RTOS_MESSAGE_Q_SIZE"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa1b17e5a20a5db09a3a3267f9a4191e0"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa25bb23dc9f40c91f9872c585e649723"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_SEMAPHORE_DATA_SIZE"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a66dcd5bd7ca661597fecabb1795fa393"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_TICK_TO_MILLI_FACTOR"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a78b1f63823e34bc82e272358701cbe67"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_TIMER_DATA_SIZE"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aba1d833ce13b78f5648ec26cdd25f639"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palMemoryPool_t"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#afa12596f9e3d06ce0b6fde07eb52d07a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palMessageQ_t"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a550ebbfa0932f76e30a372710bff8f60"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palMutex_t"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a366960ed96b6cf998870481300a739d4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palSemaphore_t"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aaab2b2c34911a85e67be94866be7e515"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThread_t"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a06ecfc14d166863199ebfc4372d61127"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncWrapper_t"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a3b3cdd4235f3b1a26e63840b91c98e18"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimer_t"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2976c77ab047a577ddac4d82bfd40f10"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="NVIC_SystemReset"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a1b47d17e90b6a03e7bd1ec6a0d549b46"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osAtomicIncrement"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac62a5b36fc159e12670c44a12dc08beb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osDelay"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a140b31a48ac23c909f1a94ad11b04aac"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysMilliSecTick"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a82eade9e7b100bd9dc9ab8312f98f827"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysTick"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae92f87b121a06e0062ee014025c0ba9e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysTickFrequency"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#addc790764a23a3e16344bd830ebe01ef"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osKernelSysTickMicroSec"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2d18206974bdf17c48b97e2e16505f19"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessageGet"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a67696b86a6116a82da7c26a433280e58"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessagePut"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa80549a557e50e0759991c6b11eb456a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessageQueueCreate"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ad25c8f7cb22985b077e893be5bc27d48"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMessageQueueDestroy"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a0e0e6dc9958a9efd9beb62493bc3f67a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexCreate"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae2425f958ab7d58eff5c5b3183f40305"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexDelete"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a909f4ae03b0acef0b84609d9b76679b4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexRelease"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#add4dbca7b11365e7301db1425c9fdf4d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osMutexWait"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aea4ad5224c43ff0fff2b77798d19748c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolAlloc"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a5938d16ea0c12594e8f8becd20acf3a7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolCAlloc"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8dff6b49f9798cdd4eed04f3dff30330"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolCreate"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a7a4fa20255fe38cf183f6c924419fe85"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolDestroy"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a33ca5b5e9d3a80594de4977924e6bc1b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osPoolFree"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a84e2f41a587335de053e0b7f8a4163c2"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osReboot"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#abdb6ab5827d588b9c2e908beda4c3154"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreCreate"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a6e7b3c23b094270b4e013c4412f2d3b1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreDelete"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ab37f3153b73dc87ca609c4c2e1bf8d6a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreRelease"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a252f210ce8a502891821b5af24b09822"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osSemaphoreWait"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac9231eef550eb7b62a89e7a34b62d014"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadCreate"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9c965e0fdfd80fc86c901cf2bde88c64"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadGetId"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a4c42c35d3d7b375833a51b4670febe92"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadGetLocalStore"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aca6b1b2f34861cf8e3d2dcc076992270"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osThreadTerminate"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a3117f8911b3e83e27031f366aa652a4f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerCreate"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aee15bcaba1ed33c264bc4c91c1dbb1cf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerDelete"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9723baa43780a1083f43d786fa53a73d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerStart"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a80f5ca578197088e4cf84042c9efc2d7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_osTimerStop"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2f1fdb410c4d6ae382622ef4f1884808"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_RTOSDestroy"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8a484abc75cf595862459d6ab21c7a0c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_plat_RTOSInitialize"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2e7aaf20f2cad3b04061e1c3fd748c42"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + </UL> + </UL> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Test"><param name="Local" value="dir_37618a71d99bdfed5979e976980d5eec.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Common"><param name="Local" value="dir_f8e9a069a0807d5f7341f9bc5892e16f.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_rtos_test_utils.c"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palRunThreads"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a393f7a6e534c05e534cfdaf46473db45"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc1"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a0a153da028aee8f220377b516ff065c8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc2"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a29dc69cbcc48b55d48a5fd668da7fe15"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc3"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#acf68b041960be3c58f516986504fcd0f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc4"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a844c7469189866b502ef85df5063e79c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc5"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a5be7a07498de9cc847215e6aa8f77914"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc6"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a52dc025f6020b0d456bbbcacc3aa4e3e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom1"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a7c8c7a38fca8b62acc6094ba1f072ec7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom2"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a663a9130dc598399ec3bd9ab9e6680fa"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom3"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a300d95346a90a5f17aa6140647243b64"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom4"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#aa5b1f9c927c18d821a46d99dfe533cb0"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerFunc1"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#abac822ed4b356b85117101aa0d8701d6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerFunc2"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a8581bcb8f9f435a87c3dd651d65e32c8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="threadsArg"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#aecb21b545f5a0c542dc82a8ef0b89b3f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="timerArgs"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#ad4897778c444c8e8fbcb65c84901ac78"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_rtos_test_utils.h"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="threadsArgument"><param name="Local" value="d3/d30/structthreads_argument.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg1"><param name="Local" value="d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg2"><param name="Local" value="d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg3"><param name="Local" value="d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg4"><param name="Local" value="d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg5"><param name="Local" value="d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg6"><param name="Local" value="d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="arg7"><param name="Local" value="d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="timerArgument"><param name="Local" value="dc/d2c/structtimer_argument.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="ticksBeforeTimer"><param name="Local" value="dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="ticksInFunc1"><param name="Local" value="dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="ticksInFunc2"><param name="Local" value="dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="MEMORY_POOL1_BLOCK_COUNT"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a3c0ce22bdba74fe398c6adefbc7fbbdf"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="MEMORY_POOL1_BLOCK_SIZE"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#ae3c2c737bcf6b45c3bf394dfe8349c4d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="MEMORY_POOL2_BLOCK_COUNT"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a593d40fc26d9d1664c57988a846a888e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="MEMORY_POOL2_BLOCK_SIZE"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a3c85d7e7f47d26444477603d8e2fd5d5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="THREAD_STACK_SIZE"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a90b7a8cb7bc3fdbd98014a3e15ee6e9a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="threadsArgument_t"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="timerArgument_t"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc1"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc2"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc3"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc4"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc5"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFunc6"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom1"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom2"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom3"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palThreadFuncCustom4"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerFunc1"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTimerFunc2"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g_threadsArg"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g_threadStorage"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g_timerArgs"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="mutex1"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="mutex2"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="semaphore1"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socket_test_utils.cpp"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_PRINTF"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#ac641d6ab2d8d2f23e89e7c36694d85dd"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTestGetNetWorkInterfaceContext"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#a5e4a39a385159acfd150a2e6098351cf"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socket_test_utils.h"><param name="Local" value="df/d2a/pal__socket__test__utils_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palTestGetNetWorkInterfaceContext"><param name="Local" value="df/d2a/pal__socket__test__utils_8h.html#a5e4a39a385159acfd150a2e6098351cf"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_test_utils.h"><param name="Local" value="d0/d51/pal__test__utils_8h.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_PRINTF"><param name="Local" value="d0/d51/pal__test__utils_8h.html#a7f0c3a0f2f1c4062d776a7bc64bed815"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Unitest"><param name="Local" value="dir_b922272f3c09a4cbb928a2f2eda5adf8.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_all_test.c"><param name="Local" value="d5/de2/pal__all__test_8c.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_all_test_main_mbedOS.cpp"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="main"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_pal_all_GROUPS_RUNNER"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#adc9a94aa19f52027390d7b0256a6693c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_pal_rtos_GROUP_RUNNER"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_pal_socket_GROUP_RUNNER"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_pal_update_GROUP_RUNNER"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a59390bc31498889208cfda7dea51bffa"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="UnityMain"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_all_test_runner.c"><param name="Local" value="d3/dab/pal__all__test__runner_8c.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_rtos_test.c"><param name="Local" value="da/d2d/pal__rtos__test_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="palRunThreads"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a393f7a6e534c05e534cfdaf46473db45"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1e33659cb747282e1869e9f86fe2d33f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a19f494b1a336e145470aa415d517937f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a0efc309d0e8eb82d8caf439877959e21"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#af2b06d1978f845fac0eaf4d1d3801629"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a236b8351236670bd5b5a07c92d22df4b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a4291ec1155d61a686122f5d4d6f6d2c5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a60d7bdf4675622e4a19f1a5b3a0d8523"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ad59650144ddde4e89319fea8013711cd"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ab6e3467dab64a1ae60a313f6c004e337"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a15d1bcdd022e5ac3ded7f4c5c4d77195"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a9286efb458d9a35e4c89e79111bc5b32"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1ab2135517e3491868d55fd58d1cfc93"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a02ee4db9ce4bddd60ae6af604b0f821f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a283449eb9014d626632ed99b627e3549"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#aa4eb9db0c81e55785354f57fa97b1e0f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_GROUP"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ab19fea07339238925c3b105637ce92c1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_SETUP"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8a7c6f6a71607f9dce69207f1f7ed3c1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_TEAR_DOWN"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ac5fc4009112ba6cadc74ad8cd14c427b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g_threadsArg"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8f9b1f133f82ce955405d453f0c506d6"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g_threadStorage"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a9beaf51023e475986b8b182c80ccc023"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g_timerArgs"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1a09db2f0cd5dd2d0929b34afad51ba1"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="mutex1"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#adb164ebbfd2189f434f5e550e2d93bb4"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="mutex2"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8706c6b975e957968f23af2812bbc0cb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="semaphore1"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a2f8d675e43058c8f8b853b52366abf38"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="button_thread"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="led1"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="led_thread"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="main"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="sw2"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="sw2_press"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_pal_rtos_GROUP_RUNNER"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="UnityMain"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="button_pressed"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="thread2"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_rtos_test_runner.c"><param name="Local" value="dd/df6/pal__rtos__test__runner_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_GROUP_RUNNER"><param name="Local" value="dd/df6/pal__rtos__test__runner_8c.html#ace47ba1b1706d7b654cdf18e7008b174"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socket_test.c"><param name="Local" value="d5/d2a/pal__socket__test_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_SUPPORT_LWIP"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abc23815d68dafc619e2c2ba210d65bd0"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_TEST_INCOMING_PORT"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ab1873f5ba58eb802dd808f05a1101670"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_TEST_SERVER_HTTP_PORT"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a7c3cef32674c412f87617e87a194e0e3"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_TEST_SERVER_IP"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a0570e783c7412d25d0c33817da54c02f"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_TEST_SERVER_IP_STRING"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a7175d943793d9a92ebe83d12f2a65063"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_TEST_SERVER_NAME"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abbe7571a0fc631eb43561606f4d5bb0e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_NET_TEST_SERVER_UDP_PORT"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abc63439a9af70c80b125accdc2afbb12"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="PAL_TEST_BUFFER_SIZE"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a0010ea5741ae7db441ef09f96eef47be"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="socketCallback"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ad62b547b432124475c3f5a94d9befe6d"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a89cecd4b07ef1acbb0b40c00189a0f36"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a16068d3b8c2ae529cc46a5eb5b238f44"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a38479981768fb5d46c11768870af9d8e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ad2dc56bae3cc44082b05728caf3a8948"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ab28ce473e377fbe30049cb41b31dfa4b"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#af5e8d34fc9aaaae9d9e2af143e1320e2"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abbfd14915bd054b23f91a485d4f8fb1e"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_GROUP"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ad324fc284dd938317109a9fc47dd1732"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_SETUP"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a26217052dc55731aa82231669a8cf0df"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_TEAR_DOWN"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ac307640c84843ab78607af150bcbe143"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g_networkInterface"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a702871d3d9057fa4fc99031298fb425c"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="button_thread"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="led1"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="led_thread"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="main"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="sw2"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="sw2_press"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_pal_socket_GROUP_RUNNER"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="UnityMain"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="button_pressed"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="thread2"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="pal_socket_test_runner.c"><param name="Local" value="dc/da5/pal__socket__test__runner_8c.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="TEST_GROUP_RUNNER"><param name="Local" value="dc/da5/pal__socket__test__runner_8c.html#a7d7471d47d062a2bf20410044b712192"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> + </UL> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Globals"><param name="Local" value="globals.html"><param name="ImageNumber" value="11"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="All"><param name="Local" value="globals.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="b"><param name="Local" value="globals.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="d"><param name="Local" value="globals_d.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="g"><param name="Local" value="globals_g.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="l"><param name="Local" value="globals_l.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="m"><param name="Local" value="globals_m.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="n"><param name="Local" value="globals_n.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="p"><param name="Local" value="globals_p.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="s"><param name="Local" value="globals_s.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="t"><param name="Local" value="globals_t.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="u"><param name="Local" value="globals_u.html"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Functions"><param name="Local" value="globals_func.html"><param name="ImageNumber" value="1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="b"><param name="Local" value="globals_func.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="d"><param name="Local" value="globals_func_d.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="l"><param name="Local" value="globals_func_l.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="m"><param name="Local" value="globals_func_m.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="n"><param name="Local" value="globals_func_n.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="p"><param name="Local" value="globals_func_p.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="s"><param name="Local" value="globals_func_s.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="t"><param name="Local" value="globals_func_t.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="u"><param name="Local" value="globals_func_u.html"><param name="ImageNumber" value="11"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Variables"><param name="Local" value="globals_vars.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Typedefs"><param name="Local" value="globals_type.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Enumerations"><param name="Local" value="globals_enum.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Enumerator"><param name="Local" value="globals_eval.html"><param name="ImageNumber" value="11"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Name" value="Macros"><param name="Local" value="globals_defs.html"><param name="ImageNumber" value="11"></OBJECT> + </UL> + </UL> +</UL> +</BODY> +</HTML>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/index.hhk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1524 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<HTML><HEAD></HEAD><BODY> +<OBJECT type="text/site properties"> +<param name="FrameName" value="right"> +</OBJECT> +<UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html"><param name="Name" value="_palBuffer_t"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb"><param name="Name" value="buffer"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a"><param name="Name" value="bufferLength"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd"><param name="Name" value="maxBufferLength"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html"><param name="Name" value="_palConstBuffer_t"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3"><param name="Name" value="buffer"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801"><param name="Name" value="bufferLength"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7"><param name="Name" value="maxBufferLength"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d"><param name="Name" value="address"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c"><param name="Name" value="addressData"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e"><param name="Name" value="addressSize"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221"><param name="Name" value="addressType"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639"><param name="Name" value="arg1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78"><param name="Name" value="arg2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4"><param name="Name" value="arg3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a"><param name="Name" value="arg4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9"><param name="Name" value="arg5"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074"><param name="Name" value="arg6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74"><param name="Name" value="arg7"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb"><param name="Name" value="buffer"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a80fff022df87cf0d4817ae19eb8257bb"><param name="Name" value="_palBuffer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a3660dfb9336b8d57a3c2223de14646d3"><param name="Name" value="_palConstBuffer_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a"><param name="Name" value="bufferLength"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a7f87cfadd565637bee1de625d19f3d3a"><param name="Name" value="_palBuffer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#a8d4966dc771ad87628b4bd01ae4ea801"><param name="Name" value="_palConstBuffer_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb"><param name="Name" value="button_pressed"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a"><param name="Name" value="button_thread"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2b4f475c89ea263557d6529c4d9a9353"><param name="Name" value="dbgPrintf"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2b4f475c89ea263557d6529c4d9a9353"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#aa1b662a1198e5729d6d0934a7efb02c4"><param name="Name" value="DEBUG_PRINT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a702871d3d9057fa4fc99031298fb425c"><param name="Name" value="g_networkInterface"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8f9b1f133f82ce955405d453f0c506d6"><param name="Name" value="g_threadsArg"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8f9b1f133f82ce955405d453f0c506d6"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a9beaf51023e475986b8b182c80ccc023"><param name="Name" value="g_threadStorage"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a9beaf51023e475986b8b182c80ccc023"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1a09db2f0cd5dd2d0929b34afad51ba1"><param name="Name" value="g_timerArgs"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1a09db2f0cd5dd2d0929b34afad51ba1"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6"><param name="Name" value="interfaceName"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7"><param name="Name" value="led1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26"><param name="Name" value="led_thread"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a1651594dc71abf466bddd0f6393edb8b"><param name="Name" value="LITTLE__ENDIAN"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="Name" value="main"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="Name" value="pal_all_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd"><param name="Name" value="maxBufferLength"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d19/struct__pal_buffer__t.html#a27cc969a96cc37cb772a3fd76dd860cd"><param name="Name" value="_palBuffer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/dab/struct__pal_const_buffer__t.html#ad411a35599e0f8500f29e5bd2cb66cc7"><param name="Name" value="_palConstBuffer_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a3c0ce22bdba74fe398c6adefbc7fbbdf"><param name="Name" value="MEMORY_POOL1_BLOCK_COUNT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#ae3c2c737bcf6b45c3bf394dfe8349c4d"><param name="Name" value="MEMORY_POOL1_BLOCK_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a593d40fc26d9d1664c57988a846a888e"><param name="Name" value="MEMORY_POOL2_BLOCK_COUNT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a3c85d7e7f47d26444477603d8e2fd5d5"><param name="Name" value="MEMORY_POOL2_BLOCK_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#adb164ebbfd2189f434f5e550e2d93bb4"><param name="Name" value="mutex1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#adb164ebbfd2189f434f5e550e2d93bb4"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8706c6b975e957968f23af2812bbc0cb"><param name="Name" value="mutex2"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8706c6b975e957968f23af2812bbc0cb"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab"><param name="Name" value="NULLPTR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a1b47d17e90b6a03e7bd1ec6a0d549b46"><param name="Name" value="NVIC_SystemReset"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/pal_8h.html"><param name="Name" value="pal.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad"><param name="Name" value="pal_destroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6"><param name="Name" value="pal_init"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7"><param name="Name" value="PAL_AF_INET6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f"><param name="Name" value="PAL_AF_INET"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3"><param name="Name" value="PAL_AF_UNSPEC"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html"><param name="Name" value="pal_all_test_main_mbedOS.cpp"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="Name" value="main"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#adc9a94aa19f52027390d7b0256a6693c"><param name="Name" value="TEST_pal_all_GROUPS_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc"><param name="Name" value="TEST_pal_rtos_GROUP_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab"><param name="Name" value="TEST_pal_socket_GROUP_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a59390bc31498889208cfda7dea51bffa"><param name="Name" value="TEST_pal_update_GROUP_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="Name" value="UnityMain"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#ac1ff0fb22cbd84e6c7920c095ddbde63"><param name="Name" value="pal_bind"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#ac1ff0fb22cbd84e6c7920c095ddbde63"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a18197e0f047f17d2617461594f5ed644"><param name="Name" value="pal_close"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a18197e0f047f17d2617461594f5ed644"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html"><param name="Name" value="pal_configuration.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d"><param name="Name" value="PAL_MAX_NUMBER_OF_THREADS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a79ed46284848e83d0dba68933c40f82a"><param name="Name" value="PAL_MAX_SUPORTED_NET_INTEFACES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a337c171a4cf5d7f04894051002d81eba"><param name="Name" value="PAL_NET_ASYNCHRONOUS_SOCKET_API"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#ad7e2f6ebd028faacc239229cce972fa7"><param name="Name" value="PAL_NET_DNS_SUPPORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a4662be64705952cfa0925001c9d917c3"><param name="Name" value="PAL_NET_TCP_AND_TLS_SUPPORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a2c7f7687d719d388a67c1f18f200962d"><param name="Name" value="PAL_RTOS_64BIT_TICK_SUPPORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a4d2f5187ecd7e90c094e2f103e5b6839"><param name="Name" value="PAL_UNIQUE_THREAD_PRIORITY"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad"><param name="Name" value="pal_destroy"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/pal_8h.html#a312dfda15122dbd2abff67b580c811ad"><param name="Name" value="pal.h"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d7/d66/pal__init_8c.html#a312dfda15122dbd2abff67b580c811ad"><param name="Name" value="pal_init.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a966411fe41e3830553bb1b8cf8baf730"><param name="Name" value="PAL_DIVIDE_ROUND_UP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9"><param name="Name" value="PAL_ERR_BUFFER_TOO_SMALL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308"><param name="Name" value="PAL_ERR_CREATION_FAILED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35"><param name="Name" value="PAL_ERR_GENERAL_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4"><param name="Name" value="PAL_ERR_GENERIC_FAILURE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818"><param name="Name" value="PAL_ERR_INVALID_ARGUMENT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1"><param name="Name" value="PAL_ERR_MODULE_C"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944"><param name="Name" value="PAL_ERR_MODULE_CRYPTO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091"><param name="Name" value="PAL_ERR_MODULE_GENERAL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b"><param name="Name" value="PAL_ERR_MODULE_NET"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9"><param name="Name" value="PAL_ERR_MODULE_PAL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73"><param name="Name" value="PAL_ERR_MODULE_RTOS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d"><param name="Name" value="PAL_ERR_MODULE_TLS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e"><param name="Name" value="PAL_ERR_MODULE_UPDATE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c"><param name="Name" value="PAL_ERR_NO_MEMORY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a"><param name="Name" value="PAL_ERR_NOT_IMPLEMENTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c"><param name="Name" value="PAL_ERR_NOT_INITIALIZED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94"><param name="Name" value="PAL_ERR_NOT_SUPPORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107"><param name="Name" value="PAL_ERR_NULL_POINTER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65"><param name="Name" value="PAL_ERR_RTOS_ERROR_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef"><param name="Name" value="PAL_ERR_RTOS_ISR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4"><param name="Name" value="PAL_ERR_RTOS_ISR_RECURSIVE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413"><param name="Name" value="PAL_ERR_RTOS_NO_MEMORY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70"><param name="Name" value="PAL_ERR_RTOS_OS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7"><param name="Name" value="PAL_ERR_RTOS_PARAMETER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb"><param name="Name" value="PAL_ERR_RTOS_PRIORITY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3"><param name="Name" value="PAL_ERR_RTOS_RESOURCE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b"><param name="Name" value="PAL_ERR_RTOS_TIMEOUT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690"><param name="Name" value="PAL_ERR_RTOS_VALUE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e"><param name="Name" value="PAL_ERR_SOCKET_ADDRESS_IN_USE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20"><param name="Name" value="PAL_ERR_SOCKET_ALREADY_CONNECTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8"><param name="Name" value="PAL_ERR_SOCKET_AUTH_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_ABORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_CLOSED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_RESET"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f"><param name="Name" value="PAL_ERR_SOCKET_DNS_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10"><param name="Name" value="PAL_ERR_SOCKET_ERROR_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd"><param name="Name" value="PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe"><param name="Name" value="PAL_ERR_SOCKET_GENERIC"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577"><param name="Name" value="PAL_ERR_SOCKET_HDCP_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2"><param name="Name" value="PAL_ERR_SOCKET_HOST_UNREACHABLE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829"><param name="Name" value="PAL_ERR_SOCKET_IN_PROGRES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d"><param name="Name" value="PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8"><param name="Name" value="PAL_ERR_SOCKET_INVALID_ADDRESS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35"><param name="Name" value="PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e"><param name="Name" value="PAL_ERR_SOCKET_INVALID_VALUE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d"><param name="Name" value="PAL_ERR_SOCKET_NO_BUFFERS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58"><param name="Name" value="PAL_ERR_SOCKET_NOT_CONNECTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479"><param name="Name" value="PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea"><param name="Name" value="PAL_ERR_SOCKET_WOULD_BLOCK"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49"><param name="Name" value="PAL_ERR_TIMEOUT_EXPIRED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf"><param name="Name" value="PAL_ERR_UPDATE_BUSY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9"><param name="Name" value="PAL_ERR_UPDATE_CHUNK_TO_SMALL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42"><param name="Name" value="PAL_ERR_UPDATE_END_OF_IMAGE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5"><param name="Name" value="PAL_ERR_UPDATE_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b"><param name="Name" value="PAL_ERR_UPDATE_ERROR_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6"><param name="Name" value="PAL_ERR_UPDATE_OUT_OF_BOUNDS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57"><param name="Name" value="PAL_ERR_UPDATE_PALFROM_API"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6"><param name="Name" value="PAL_ERR_UPDATE_PALFROM_IO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b"><param name="Name" value="PAL_ERR_UPDATE_TIMEOUT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html"><param name="Name" value="pal_errors.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a46dd726962c185841ba6b2a6a51716f9"><param name="Name" value="PAL_ERR_BUFFER_TOO_SMALL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aed6967ecb83464f0d078f210da21c308"><param name="Name" value="PAL_ERR_CREATION_FAILED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad147e6a77995779cf9cd4bc996816f35"><param name="Name" value="PAL_ERR_GENERAL_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa7f2512e5c7b5a9ac52c061d139bc7d4"><param name="Name" value="PAL_ERR_GENERIC_FAILURE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a744e1823284f7cc0575234cb7ef00818"><param name="Name" value="PAL_ERR_INVALID_ARGUMENT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a393e3aee68a29b56f296410882a61ee1"><param name="Name" value="PAL_ERR_MODULE_C"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a8a27e540ac27fc7fb67c75eeb233b944"><param name="Name" value="PAL_ERR_MODULE_CRYPTO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a1daf9a88891fbb0bbe33c617a8958091"><param name="Name" value="PAL_ERR_MODULE_GENERAL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a04a1e6438edc955995d01b752026dd9b"><param name="Name" value="PAL_ERR_MODULE_NET"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a16c89c0872bc1336fa7f3c59ee962ac9"><param name="Name" value="PAL_ERR_MODULE_PAL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a6a6bce2cba25a0aa0afc4575825eca73"><param name="Name" value="PAL_ERR_MODULE_RTOS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1aa9aff26dbdc5924c6d244d7c0727957d"><param name="Name" value="PAL_ERR_MODULE_TLS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a1800b4754588cdf0f544d1a7194168d1a73ed4010871e4e635d42af5db55b565e"><param name="Name" value="PAL_ERR_MODULE_UPDATE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a12207f367341fdf5946140874b26729c"><param name="Name" value="PAL_ERR_NO_MEMORY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abeb3c1cb1631b2decdf863ba4875f86a"><param name="Name" value="PAL_ERR_NOT_IMPLEMENTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4d8a84476204387d3b5e720b3e0777c"><param name="Name" value="PAL_ERR_NOT_INITIALIZED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7b7f0ee07b070ec75d101dfa292b9d94"><param name="Name" value="PAL_ERR_NOT_SUPPORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5a632cfd6ad51b23b088ef5bf8a50107"><param name="Name" value="PAL_ERR_NULL_POINTER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4a45604a11c2e6ed03aad942c20fba65"><param name="Name" value="PAL_ERR_RTOS_ERROR_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a81f5a29e0f8f421412636195cd7eafef"><param name="Name" value="PAL_ERR_RTOS_ISR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a5791ca907d7d2c5e811c1ff8a79ef3f4"><param name="Name" value="PAL_ERR_RTOS_ISR_RECURSIVE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa4e823bf084db0abf95f92e644e44413"><param name="Name" value="PAL_ERR_RTOS_NO_MEMORY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ad783bb526712a8fc40b8c7e9e2dcca70"><param name="Name" value="PAL_ERR_RTOS_OS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5af57d1b96cac027006285d3e946f72da7"><param name="Name" value="PAL_ERR_RTOS_PARAMETER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aa372d184ebea174a9a807a6af5feedbb"><param name="Name" value="PAL_ERR_RTOS_PRIORITY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ab842a33fc2033095f7526d36e76ffde3"><param name="Name" value="PAL_ERR_RTOS_RESOURCE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4f005aeb7022829339f50e6a1c48f07b"><param name="Name" value="PAL_ERR_RTOS_TIMEOUT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a166a7c0ad427986e42eee2d7ed5f2690"><param name="Name" value="PAL_ERR_RTOS_VALUE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aef19ff78785fd271b93bec327551f74e"><param name="Name" value="PAL_ERR_SOCKET_ADDRESS_IN_USE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a05b82765d558b836fc988283d1d93e20"><param name="Name" value="PAL_ERR_SOCKET_ALREADY_CONNECTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8f07f3411c26d3107b86d64739b18fd8"><param name="Name" value="PAL_ERR_SOCKET_AUTH_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7027cc594e676d26ade0efcca3d4a8cf"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_ABORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a7449190771bd90f1b5dd54f0626c4d50"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_CLOSED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae917d0749e3e541369413c782d6a1f3b"><param name="Name" value="PAL_ERR_SOCKET_CONNECTION_RESET"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aeb186326d561fd71f180d59ab12b0d5f"><param name="Name" value="PAL_ERR_SOCKET_DNS_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a8b42b332534523a5e81162bdb8e2cc10"><param name="Name" value="PAL_ERR_SOCKET_ERROR_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a557f240d9723393b246c9d03ad5789cd"><param name="Name" value="PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5abd4cc21a7f65533cf8dfc118b19957fe"><param name="Name" value="PAL_ERR_SOCKET_GENERIC"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a352e14b96bd1489c42728f4da485b577"><param name="Name" value="PAL_ERR_SOCKET_HDCP_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4d5cc5d96a1f1d23f69cf3fead9291e2"><param name="Name" value="PAL_ERR_SOCKET_HOST_UNREACHABLE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a493871f4bc0b3223df779b89a3b0b829"><param name="Name" value="PAL_ERR_SOCKET_IN_PROGRES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ae2f7bce589b21231745767161c43349d"><param name="Name" value="PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a033490de59972a46877f230267a070c8"><param name="Name" value="PAL_ERR_SOCKET_INVALID_ADDRESS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a3c0172ff8cc391873b83c9a1b7b6bd35"><param name="Name" value="PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ade5fcfb0a8b3810ef513c25e7722db6e"><param name="Name" value="PAL_ERR_SOCKET_INVALID_VALUE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a25f6affacd34aaf7e734a666b5186f2d"><param name="Name" value="PAL_ERR_SOCKET_NO_BUFFERS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a90f2efed44c1dbb04928d381355ece58"><param name="Name" value="PAL_ERR_SOCKET_NOT_CONNECTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a9a2d6af2657b5abd81bd38c7c6cf0479"><param name="Name" value="PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a089003c7bd380a8426f211fedfb813ea"><param name="Name" value="PAL_ERR_SOCKET_WOULD_BLOCK"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a316210ded62b55ed1bbcc4e3c5ce8a49"><param name="Name" value="PAL_ERR_TIMEOUT_EXPIRED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a123c0937e9046005938c724b7e0c7daf"><param name="Name" value="PAL_ERR_UPDATE_BUSY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a4dffb58d0202d7ca5ac60eff42313ac9"><param name="Name" value="PAL_ERR_UPDATE_CHUNK_TO_SMALL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaacb4fc41bcde230f42aeb05bfaccf42"><param name="Name" value="PAL_ERR_UPDATE_END_OF_IMAGE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a29017351514ed7e0a1fb46d6f1b53cb5"><param name="Name" value="PAL_ERR_UPDATE_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5adbf49b864b46d39640bc1c0ba65b1d2b"><param name="Name" value="PAL_ERR_UPDATE_ERROR_BASE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5a6f29986bcfb1cc0f26c1dfa17fa44cf6"><param name="Name" value="PAL_ERR_UPDATE_OUT_OF_BOUNDS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5ada39f2992787040da527359ce7a25a57"><param name="Name" value="PAL_ERR_UPDATE_PALFROM_API"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5aaa9a76afb13586743e21ece5310487e6"><param name="Name" value="PAL_ERR_UPDATE_PALFROM_IO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/dfe/pal__errors_8h.html#a480f42f9c6533ec9a36f3312a285a7d5afaeb01c79160229de16f8b764224823b"><param name="Name" value="PAL_ERR_UPDATE_TIMEOUT"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a5258efd8b21d9c881df29b29686674d8"><param name="Name" value="pal_getNetInterfaceInfo"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a5258efd8b21d9c881df29b29686674d8"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a65df7c68bcf7a21db5d1a7a3830fd19c"><param name="Name" value="pal_getNumberOfNetInterfaces"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a65df7c68bcf7a21db5d1a7a3830fd19c"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#ade5cf610808db5462666465b648e7724"><param name="Name" value="pal_getSockAddrIPV4Addr"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#ade5cf610808db5462666465b648e7724"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a153bc6165f64bbf3e6bcc79b0d39138f"><param name="Name" value="pal_getSockAddrIPV6Addr"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a153bc6165f64bbf3e6bcc79b0d39138f"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a4658c7e8224b536d4fd71fed2602b12e"><param name="Name" value="pal_getSockAddrPort"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a4658c7e8224b536d4fd71fed2602b12e"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a2d9d4e04e43995123efe134c767cd6e1"><param name="Name" value="pal_getSocketOptions"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a2d9d4e04e43995123efe134c767cd6e1"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a9bd4f76c3897b4338fe50a8d69830fe5"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_16BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ab01046a25df49d7fe1d85a8bf722975f"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_32BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#adc0a4752569188800a75e1601a7e11b5"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_64BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a55b1a7d9f939231045521ec4a4817cff"><param name="Name" value="PAL_HTONL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a98390512a7c2732f1197b07acf03e226"><param name="Name" value="PAL_HTONS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#abd4e26912e35fc58e5bc0172765bdc6e"><param name="Name" value="pal_in_addr_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d7/d66/pal__init_8c.html"><param name="Name" value="pal_init.c"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d7/d66/pal__init_8c.html#a312dfda15122dbd2abff67b580c811ad"><param name="Name" value="pal_destroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d7/d66/pal__init_8c.html#a28095bec6e2c1c74ad3b08414f44b9d6"><param name="Name" value="pal_init"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6"><param name="Name" value="pal_init"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/pal_8h.html#a28095bec6e2c1c74ad3b08414f44b9d6"><param name="Name" value="pal.h"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d7/d66/pal__init_8c.html#a28095bec6e2c1c74ad3b08414f44b9d6"><param name="Name" value="pal_init.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ad989cc9220df56cd410590fc628e93b7"><param name="Name" value="PAL_INVERSE_UINT16_BYTES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f"><param name="Name" value="PAL_INVERSE_UINT32_BYTES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ae376dc7d0682fb2fc8927897fb065c4c"><param name="Name" value="PAL_INVERSE_UINT64_BYTES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f"><param name="Name" value="PAL_IPV4_ADDRESS_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24"><param name="Name" value="PAL_IPV6_ADDRESS_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ad1c98870c5eeba8fe649345e371ef866"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_16BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#aa6229ece344478c07677c8b0436b1bb0"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_32BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a4ae1ca0100a3eee36eb95931cbec633e"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_64BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html"><param name="Name" value="pal_macros.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#aa1b662a1198e5729d6d0934a7efb02c4"><param name="Name" value="DEBUG_PRINT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a1651594dc71abf466bddd0f6393edb8b"><param name="Name" value="LITTLE__ENDIAN"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a966411fe41e3830553bb1b8cf8baf730"><param name="Name" value="PAL_DIVIDE_ROUND_UP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a9bd4f76c3897b4338fe50a8d69830fe5"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_16BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ab01046a25df49d7fe1d85a8bf722975f"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_32BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#adc0a4752569188800a75e1601a7e11b5"><param name="Name" value="PAL_HOST_TO_LITTLE_ENDIAN_64BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a55b1a7d9f939231045521ec4a4817cff"><param name="Name" value="PAL_HTONL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a98390512a7c2732f1197b07acf03e226"><param name="Name" value="PAL_HTONS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ad989cc9220df56cd410590fc628e93b7"><param name="Name" value="PAL_INVERSE_UINT16_BYTES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a4a0b711e344955017ab60ff37977e18f"><param name="Name" value="PAL_INVERSE_UINT32_BYTES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ae376dc7d0682fb2fc8927897fb065c4c"><param name="Name" value="PAL_INVERSE_UINT64_BYTES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ad1c98870c5eeba8fe649345e371ef866"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_16BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#aa6229ece344478c07677c8b0436b1bb0"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_32BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a4ae1ca0100a3eee36eb95931cbec633e"><param name="Name" value="PAL_LITTLE_ENDIAN_TO_HOST_64BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a117c6ce53646b65b4cdcb5da01801675"><param name="Name" value="PAL_MAX"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a6ee734c1fc41affa0926797e382fc8d4"><param name="Name" value="PAL_MAX_INT32"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ada154fcb4b3ef9b641486f30de56c7b7"><param name="Name" value="PAL_MAX_INT64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#af8d58ab12b0f655fe922fc40b3e52ca2"><param name="Name" value="PAL_MAX_UINT16"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e"><param name="Name" value="PAL_MAX_UINT32"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a28a8006d7bca3b64235ca4d0cb39bf2b"><param name="Name" value="PAL_MAX_UINT64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a08c56fc189bfb1a6864a7b5d68433e7e"><param name="Name" value="PAL_MAX_UINT8"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a29066dd6aaf6aa8fa21f3a88feb6da59"><param name="Name" value="PAL_MIN"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ac3a2f334767728e9bc57512139e0bd61"><param name="Name" value="PAL_MIN_INT32"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#aaeb3e06c7119793239368c0fe74cda05"><param name="Name" value="PAL_MODULE_DEINIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ad2109677fa03720f6ab0df072c755529"><param name="Name" value="PAL_MODULE_INIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ade9a83a9aab96cf50058801afdef4ace"><param name="Name" value="PAL_MODULE_IS_INIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a7cbc81d1fb0dcddb1cc88b59d50c2aa9"><param name="Name" value="PAL_NTOHL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a55fbcf7a453813fec69016916802de2c"><param name="Name" value="PAL_NTOHS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"><param name="Name" value="PAL_SUCCESS"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a117c6ce53646b65b4cdcb5da01801675"><param name="Name" value="PAL_MAX"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a6ee734c1fc41affa0926797e382fc8d4"><param name="Name" value="PAL_MAX_INT32"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ada154fcb4b3ef9b641486f30de56c7b7"><param name="Name" value="PAL_MAX_INT64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#abb1ceb83ff6a709614d1394e7e39391d"><param name="Name" value="PAL_MAX_NUMBER_OF_THREADS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a79ed46284848e83d0dba68933c40f82a"><param name="Name" value="PAL_MAX_SUPORTED_NET_INTEFACES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#af8d58ab12b0f655fe922fc40b3e52ca2"><param name="Name" value="PAL_MAX_UINT16"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ac7e2d509703ff033a302b325aa664f6e"><param name="Name" value="PAL_MAX_UINT32"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a28a8006d7bca3b64235ca4d0cb39bf2b"><param name="Name" value="PAL_MAX_UINT64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a08c56fc189bfb1a6864a7b5d68433e7e"><param name="Name" value="PAL_MAX_UINT8"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a29066dd6aaf6aa8fa21f3a88feb6da59"><param name="Name" value="PAL_MIN"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ac3a2f334767728e9bc57512139e0bd61"><param name="Name" value="PAL_MIN_INT32"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#aaeb3e06c7119793239368c0fe74cda05"><param name="Name" value="PAL_MODULE_DEINIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ad2109677fa03720f6ab0df072c755529"><param name="Name" value="PAL_MODULE_INIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#ade9a83a9aab96cf50058801afdef4ace"><param name="Name" value="PAL_MODULE_IS_INIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#af12d673085039783ab1d2613eff7e4a4"><param name="Name" value="PAL_MUTEX_DATA_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a337c171a4cf5d7f04894051002d81eba"><param name="Name" value="PAL_NET_ASYNCHRONOUS_SOCKET_API"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aefc09884590381a71433c34b3f2e2aa5"><param name="Name" value="PAL_NET_DEFAULT_INTERFACE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#ad7e2f6ebd028faacc239229cce972fa7"><param name="Name" value="PAL_NET_DNS_SUPPORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039"><param name="Name" value="PAL_NET_MAX_ADDR_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac2b7451d38e150079fbef20b57ee3fe9"><param name="Name" value="PAL_NET_SELECT_IS_ERR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a8894a96773018ba6058811087b4b2ac8"><param name="Name" value="PAL_NET_SELECT_IS_RX"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a31ca79ac9ae5c2ddd890263a989fc4d8"><param name="Name" value="PAL_NET_SELECT_IS_TX"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a"><param name="Name" value="PAL_NET_SOCKET_SELECT_ERR_BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31"><param name="Name" value="PAL_NET_SOCKET_SELECT_MAX_SOCKETS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2"><param name="Name" value="PAL_NET_SOCKET_SELECT_RX_BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d"><param name="Name" value="PAL_NET_SOCKET_SELECT_TX_BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abc23815d68dafc619e2c2ba210d65bd0"><param name="Name" value="PAL_NET_SUPPORT_LWIP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a4662be64705952cfa0925001c9d917c3"><param name="Name" value="PAL_NET_TCP_AND_TLS_SUPPORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ab1873f5ba58eb802dd808f05a1101670"><param name="Name" value="PAL_NET_TEST_INCOMING_PORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a7c3cef32674c412f87617e87a194e0e3"><param name="Name" value="PAL_NET_TEST_SERVER_HTTP_PORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a0570e783c7412d25d0c33817da54c02f"><param name="Name" value="PAL_NET_TEST_SERVER_IP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a7175d943793d9a92ebe83d12f2a65063"><param name="Name" value="PAL_NET_TEST_SERVER_IP_STRING"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abbe7571a0fc631eb43561606f4d5bb0e"><param name="Name" value="PAL_NET_TEST_SERVER_NAME"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abc63439a9af70c80b125accdc2afbb12"><param name="Name" value="PAL_NET_TEST_SERVER_UDP_PORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html"><param name="Name" value="pal_network.c"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#ac1ff0fb22cbd84e6c7920c095ddbde63"><param name="Name" value="pal_bind"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a18197e0f047f17d2617461594f5ed644"><param name="Name" value="pal_close"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a5258efd8b21d9c881df29b29686674d8"><param name="Name" value="pal_getNetInterfaceInfo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a65df7c68bcf7a21db5d1a7a3830fd19c"><param name="Name" value="pal_getNumberOfNetInterfaces"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#ade5cf610808db5462666465b648e7724"><param name="Name" value="pal_getSockAddrIPV4Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a153bc6165f64bbf3e6bcc79b0d39138f"><param name="Name" value="pal_getSockAddrIPV6Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a4658c7e8224b536d4fd71fed2602b12e"><param name="Name" value="pal_getSockAddrPort"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a2d9d4e04e43995123efe134c767cd6e1"><param name="Name" value="pal_getSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#abd4e26912e35fc58e5bc0172765bdc6e"><param name="Name" value="pal_in_addr_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a6b5e705be1e7c3c16080f2b05b87ff7d"><param name="Name" value="pal_receiveFrom"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a081cc2fd09644c41068673487b39f6b8"><param name="Name" value="pal_registerNetworkInterface"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#acce808f708e653b6bed317072888ca23"><param name="Name" value="pal_sendTo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aed02a6f53b88e1d5e81607b1221a3efa"><param name="Name" value="pal_setSockAddrIPV4Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a0cc13f7ef9ceb4a75884a8bebf0d831c"><param name="Name" value="pal_setSockAddrIPV6Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#abbeb1395896eb79ab564568b9ab8a628"><param name="Name" value="pal_setSockAddrPort"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a2e1bbe81a35a1cb54c351912bb97736f"><param name="Name" value="pal_setSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aa852fb6e271fb91efd65e2a1ead93b9a"><param name="Name" value="pal_socket"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aaf4e46664d7b7f8902c69cb72a65c943"><param name="Name" value="pal_socketAddressInternal6_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#abc2b368e206e7353e31a520fa573cd8a"><param name="Name" value="pal_socketAddressInternal_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a5cab4ea55a3d28cfd8d4dca8376a111c"><param name="Name" value="pal_socketMiniSelect"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html"><param name="Name" value="pal_network.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a9420d0656d763eeeb6c97243e0514f4f"><param name="Name" value="PAL_AF_INET"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7a7375b598bd48e43e8869594d96b2c0d7"><param name="Name" value="PAL_AF_INET6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a01b7e0ab9c2845885f6a7e012002dba7af6e1af9f402ae053ad1ac009b61957c3"><param name="Name" value="PAL_AF_UNSPEC"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac1ff0fb22cbd84e6c7920c095ddbde63"><param name="Name" value="pal_bind"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a18197e0f047f17d2617461594f5ed644"><param name="Name" value="pal_close"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a5258efd8b21d9c881df29b29686674d8"><param name="Name" value="pal_getNetInterfaceInfo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a65df7c68bcf7a21db5d1a7a3830fd19c"><param name="Name" value="pal_getNumberOfNetInterfaces"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ade5cf610808db5462666465b648e7724"><param name="Name" value="pal_getSockAddrIPV4Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a153bc6165f64bbf3e6bcc79b0d39138f"><param name="Name" value="pal_getSockAddrIPV6Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a4658c7e8224b536d4fd71fed2602b12e"><param name="Name" value="pal_getSockAddrPort"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2d9d4e04e43995123efe134c767cd6e1"><param name="Name" value="pal_getSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ad7a3e182cb430da7c139858b0bfbb27f"><param name="Name" value="PAL_IPV4_ADDRESS_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a9903ebae215b70520c8dcc9f0aa03e24"><param name="Name" value="PAL_IPV6_ADDRESS_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aefc09884590381a71433c34b3f2e2aa5"><param name="Name" value="PAL_NET_DEFAULT_INTERFACE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac831e2e5064065e10c741da1003ff039"><param name="Name" value="PAL_NET_MAX_ADDR_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac2b7451d38e150079fbef20b57ee3fe9"><param name="Name" value="PAL_NET_SELECT_IS_ERR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a8894a96773018ba6058811087b4b2ac8"><param name="Name" value="PAL_NET_SELECT_IS_RX"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a31ca79ac9ae5c2ddd890263a989fc4d8"><param name="Name" value="PAL_NET_SELECT_IS_TX"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aa66d7131cc6c44ac6c5ab6a9dda3f69a"><param name="Name" value="PAL_NET_SOCKET_SELECT_ERR_BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a5607f2af4b642ef0548bd47c891c6d31"><param name="Name" value="PAL_NET_SOCKET_SELECT_MAX_SOCKETS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aae14933b48cd31821913f2bfb15e18b2"><param name="Name" value="PAL_NET_SOCKET_SELECT_RX_BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ad8ddc879cf2eace65036137660b8b53d"><param name="Name" value="PAL_NET_SOCKET_SELECT_TX_BIT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d"><param name="Name" value="pal_receiveFrom"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8"><param name="Name" value="pal_registerNetworkInterface"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23"><param name="Name" value="pal_sendTo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa"><param name="Name" value="pal_setSockAddrIPV4Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c"><param name="Name" value="pal_setSockAddrIPV6Addr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628"><param name="Name" value="pal_setSockAddrPort"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f"><param name="Name" value="pal_setSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca"><param name="Name" value="PAL_SO_RCVTIMEO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001"><param name="Name" value="PAL_SO_REUSEADDR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de"><param name="Name" value="PAL_SO_SNDTIMEO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941"><param name="Name" value="PAL_SOCK_DGRAM"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a"><param name="Name" value="pal_socket"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a5cab4ea55a3d28cfd8d4dca8376a111c"><param name="Name" value="pal_socketMiniSelect"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4"><param name="Name" value="pal_timeVal_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1"><param name="Name" value="palIpV4Addr_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192"><param name="Name" value="palIpV6Addr_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da"><param name="Name" value="palNetInterfaceInfo_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996"><param name="Name" value="palSocket_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10"><param name="Name" value="palSocketAddress_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901"><param name="Name" value="palSocketLength_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a7cbc81d1fb0dcddb1cc88b59d50c2aa9"><param name="Name" value="PAL_NTOHL"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a55fbcf7a453813fec69016916802de2c"><param name="Name" value="PAL_NTOHS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9b3b50428d7ad199287a291137041c43"><param name="Name" value="PAL_NUM_OF_THREAD_INSTANCES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a9b33d260ee1022f5b5f6a9dfc3363f2a"><param name="Name" value="pal_osAtomicIncrement"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a9b33d260ee1022f5b5f6a9dfc3363f2a"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ad6aaee432fd7ea5e35ab500a6278cc25"><param name="Name" value="pal_osDelay"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ad6aaee432fd7ea5e35ab500a6278cc25"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a59e85747582417a1395ed0f9c140eb8a"><param name="Name" value="pal_osKernelSysMilliSecTick"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a59e85747582417a1395ed0f9c140eb8a"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#af88551b6ca24a7a2bb6d94d423eb4401"><param name="Name" value="pal_osKernelSysTick64"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#af88551b6ca24a7a2bb6d94d423eb4401"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a9800b8b9e057fe17e50c4259c809f898"><param name="Name" value="pal_osKernelSysTick"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a9800b8b9e057fe17e50c4259c809f898"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a087214ae87c20fd59f47fe3c96d0eefc"><param name="Name" value="pal_osKernelSysTickFrequency"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a087214ae87c20fd59f47fe3c96d0eefc"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a34375ee82619a4064849daccbdfbc966"><param name="Name" value="pal_osKernelSysTickMicroSec"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a34375ee82619a4064849daccbdfbc966"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ab70d0be45514258874c0406c2040372c"><param name="Name" value="pal_osMessageGet"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ab70d0be45514258874c0406c2040372c"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a966daa5b0bd9282fbffa7c462da1c417"><param name="Name" value="pal_osMessagePut"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a966daa5b0bd9282fbffa7c462da1c417"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a0c7f0003e92b3494089966d53ab24a1b"><param name="Name" value="pal_osMessageQueueCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a0c7f0003e92b3494089966d53ab24a1b"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#adba13212ec060092acdf6165e82be5b6"><param name="Name" value="pal_osMessageQueueDestroy"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#adba13212ec060092acdf6165e82be5b6"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#af89aab14085207b1a0951f7aad24193c"><param name="Name" value="pal_osMutexCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#af89aab14085207b1a0951f7aad24193c"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a03f43d7e53435d89f316862b48b573c4"><param name="Name" value="pal_osMutexDelete"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a03f43d7e53435d89f316862b48b573c4"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1d976a616a5c850b2016b2b87d8b47cc"><param name="Name" value="pal_osMutexRelease"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1d976a616a5c850b2016b2b87d8b47cc"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#acda0974247325955719b23494d66c622"><param name="Name" value="pal_osMutexWait"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#acda0974247325955719b23494d66c622"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a3a2b57685096d16a110ee38f7f29e099"><param name="Name" value="pal_osPoolAlloc"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a3a2b57685096d16a110ee38f7f29e099"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a5d20661cd387a172450a2fe12993687a"><param name="Name" value="pal_osPoolCAlloc"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a5d20661cd387a172450a2fe12993687a"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1245f053abb3fdb7ab2ceb5a2899e8c6"><param name="Name" value="pal_osPoolCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1245f053abb3fdb7ab2ceb5a2899e8c6"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1c01464448f8d7bd95bf518d651484c6"><param name="Name" value="pal_osPoolDestroy"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1c01464448f8d7bd95bf518d651484c6"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a79f4997069310aa7bbb6ae7995988dd7"><param name="Name" value="pal_osPoolFree"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a79f4997069310aa7bbb6ae7995988dd7"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af"><param name="Name" value="PAL_osPriorityAboveNormal"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5"><param name="Name" value="PAL_osPriorityBelowNormal"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e"><param name="Name" value="PAL_osPriorityError"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2"><param name="Name" value="PAL_osPriorityHigh"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a"><param name="Name" value="PAL_osPriorityIdle"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec"><param name="Name" value="PAL_osPriorityLow"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1"><param name="Name" value="PAL_osPriorityNormal"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce"><param name="Name" value="PAL_osPriorityRealtime"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ab8ab0f31bbf4258b7684d22e7725a9f8"><param name="Name" value="pal_osReboot"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ab8ab0f31bbf4258b7684d22e7725a9f8"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aaa7aee442a5c8cc274d3e52206984037"><param name="Name" value="pal_osSemaphoreCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aaa7aee442a5c8cc274d3e52206984037"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a45f071482f8669821b90264e0470b33d"><param name="Name" value="pal_osSemaphoreDelete"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a45f071482f8669821b90264e0470b33d"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a009d0c063119265f9c5c0c9bff379c14"><param name="Name" value="pal_osSemaphoreRelease"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a009d0c063119265f9c5c0c9bff379c14"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aa2d998744dbc9504bfe0358f85457fc4"><param name="Name" value="pal_osSemaphoreWait"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aa2d998744dbc9504bfe0358f85457fc4"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2dae64d917f644982b893037adf562b4"><param name="Name" value="pal_osThreadCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2dae64d917f644982b893037adf562b4"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2993b8f6b5e8d7ccd6121dc18330e4be"><param name="Name" value="pal_osThreadGetId"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2993b8f6b5e8d7ccd6121dc18330e4be"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ac94f4efc4bad73969e57c8255c136a0d"><param name="Name" value="pal_osThreadGetLocalStore"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ac94f4efc4bad73969e57c8255c136a0d"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#abcfa47b411929b33d5d9cfaaff28ce18"><param name="Name" value="pal_osThreadTerminate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#abcfa47b411929b33d5d9cfaaff28ce18"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aa4da36fbbba744a14d1bdfe2a26d1a18"><param name="Name" value="pal_osTimerCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aa4da36fbbba744a14d1bdfe2a26d1a18"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ac7ca6e7c3c229f4092c9df4b69e7dd59"><param name="Name" value="pal_osTimerDelete"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ac7ca6e7c3c229f4092c9df4b69e7dd59"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a6c60c9e433bc6005bac6b02d5aba7363"><param name="Name" value="pal_osTimerStart"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a6c60c9e433bc6005bac6b02d5aba7363"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a94f4df594102e582cbd2114f6eebb57d"><param name="Name" value="pal_osTimerStop"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a94f4df594102e582cbd2114f6eebb57d"><param name="Name" value="pal_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d"><param name="Name" value="pal_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c"><param name="Name" value="pal_plat_bind"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da"><param name="Name" value="pal_plat_close"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6dc3b4c06e96b29068995809b98a935e"><param name="Name" value="pal_plat_getNetInterfaceInfo"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6dc3b4c06e96b29068995809b98a935e"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#af36bf075867e5ed0be7479312469361f"><param name="Name" value="pal_plat_getNumberOfNetInterfaces"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#af36bf075867e5ed0be7479312469361f"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9"><param name="Name" value="pal_plat_getSocketOptions"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a53a267fd8ed0b7a5cf988224e95bd47c"><param name="Name" value="pal_plat_bind"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a071355a0ca4d4eece45f0ed85a9ab1da"><param name="Name" value="pal_plat_close"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6dc3b4c06e96b29068995809b98a935e"><param name="Name" value="pal_plat_getNetInterfaceInfo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#af36bf075867e5ed0be7479312469361f"><param name="Name" value="pal_plat_getNumberOfNetInterfaces"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a76c4e2adf95702c4db8f3792ae373bf9"><param name="Name" value="pal_plat_getSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac"><param name="Name" value="pal_plat_receiveFrom"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab37f007a0574ca73916b26240ff1126b"><param name="Name" value="pal_plat_RegisterNetworkInterface"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a17365747ed8d29df153a336da3942187"><param name="Name" value="pal_plat_sendTo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d"><param name="Name" value="pal_plat_setSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a58a25ae30bb6225cc8b5344053fd705c"><param name="Name" value="pal_plat_socket"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa0c26dfeee80444e58eacab238206d09"><param name="Name" value="pal_plat_socketMiniSelect"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab92cca0e4facf3d62e03c0d0ca0523da"><param name="Name" value="pal_plat_socketsInit"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd"><param name="Name" value="pal_plat_socketsTerminate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a8c607fcbfa526e4485fcdb55b79b39d6"><param name="Name" value="PAL_SOCKET_OPTION_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da"><param name="Name" value="palSelectCallback0"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e"><param name="Name" value="palSelectCallback1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f"><param name="Name" value="palSelectCallback2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c"><param name="Name" value="palSelectCallback3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b"><param name="Name" value="palSelectCallback4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075"><param name="Name" value="palSelectCallback5"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27"><param name="Name" value="palSelectCallback6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58"><param name="Name" value="palSelectCallback7"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf"><param name="Name" value="palSelectCallbackFunction_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a4f6fdfaea202b7b50e57e7253705d96e"><param name="Name" value="s_palSelectPalCallbackFunctions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a77af6aede7e9f4d41f8c87ebc381b517"><param name="Name" value="s_select_event_happened"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html"><param name="Name" value="pal_plat_network.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a53a267fd8ed0b7a5cf988224e95bd47c"><param name="Name" value="pal_plat_bind"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a071355a0ca4d4eece45f0ed85a9ab1da"><param name="Name" value="pal_plat_close"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a6dc3b4c06e96b29068995809b98a935e"><param name="Name" value="pal_plat_getNetInterfaceInfo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#af36bf075867e5ed0be7479312469361f"><param name="Name" value="pal_plat_getNumberOfNetInterfaces"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a76c4e2adf95702c4db8f3792ae373bf9"><param name="Name" value="pal_plat_getSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac"><param name="Name" value="pal_plat_receiveFrom"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c"><param name="Name" value="pal_plat_RegisterNetworkInterface"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187"><param name="Name" value="pal_plat_sendTo"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d"><param name="Name" value="pal_plat_setSocketOptions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c"><param name="Name" value="pal_plat_socket"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09"><param name="Name" value="pal_plat_socketMiniSelect"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da"><param name="Name" value="pal_plat_socketsInit"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd"><param name="Name" value="pal_plat_socketsTerminate"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac62a5b36fc159e12670c44a12dc08beb"><param name="Name" value="pal_plat_osAtomicIncrement"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac62a5b36fc159e12670c44a12dc08beb"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a140b31a48ac23c909f1a94ad11b04aac"><param name="Name" value="pal_plat_osDelay"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a140b31a48ac23c909f1a94ad11b04aac"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a82eade9e7b100bd9dc9ab8312f98f827"><param name="Name" value="pal_plat_osKernelSysMilliSecTick"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a82eade9e7b100bd9dc9ab8312f98f827"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826"><param name="Name" value="pal_plat_osKernelSysTick64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae92f87b121a06e0062ee014025c0ba9e"><param name="Name" value="pal_plat_osKernelSysTick"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae92f87b121a06e0062ee014025c0ba9e"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#addc790764a23a3e16344bd830ebe01ef"><param name="Name" value="pal_plat_osKernelSysTickFrequency"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#addc790764a23a3e16344bd830ebe01ef"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2d18206974bdf17c48b97e2e16505f19"><param name="Name" value="pal_plat_osKernelSysTickMicroSec"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2d18206974bdf17c48b97e2e16505f19"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a67696b86a6116a82da7c26a433280e58"><param name="Name" value="pal_plat_osMessageGet"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a67696b86a6116a82da7c26a433280e58"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa80549a557e50e0759991c6b11eb456a"><param name="Name" value="pal_plat_osMessagePut"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa80549a557e50e0759991c6b11eb456a"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ad25c8f7cb22985b077e893be5bc27d48"><param name="Name" value="pal_plat_osMessageQueueCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ad25c8f7cb22985b077e893be5bc27d48"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a0e0e6dc9958a9efd9beb62493bc3f67a"><param name="Name" value="pal_plat_osMessageQueueDestroy"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a0e0e6dc9958a9efd9beb62493bc3f67a"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae2425f958ab7d58eff5c5b3183f40305"><param name="Name" value="pal_plat_osMutexCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae2425f958ab7d58eff5c5b3183f40305"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a909f4ae03b0acef0b84609d9b76679b4"><param name="Name" value="pal_plat_osMutexDelete"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a909f4ae03b0acef0b84609d9b76679b4"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#add4dbca7b11365e7301db1425c9fdf4d"><param name="Name" value="pal_plat_osMutexRelease"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#add4dbca7b11365e7301db1425c9fdf4d"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aea4ad5224c43ff0fff2b77798d19748c"><param name="Name" value="pal_plat_osMutexWait"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aea4ad5224c43ff0fff2b77798d19748c"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a5938d16ea0c12594e8f8becd20acf3a7"><param name="Name" value="pal_plat_osPoolAlloc"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a5938d16ea0c12594e8f8becd20acf3a7"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8dff6b49f9798cdd4eed04f3dff30330"><param name="Name" value="pal_plat_osPoolCAlloc"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8dff6b49f9798cdd4eed04f3dff30330"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a7a4fa20255fe38cf183f6c924419fe85"><param name="Name" value="pal_plat_osPoolCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a7a4fa20255fe38cf183f6c924419fe85"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a33ca5b5e9d3a80594de4977924e6bc1b"><param name="Name" value="pal_plat_osPoolDestroy"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a33ca5b5e9d3a80594de4977924e6bc1b"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a84e2f41a587335de053e0b7f8a4163c2"><param name="Name" value="pal_plat_osPoolFree"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a84e2f41a587335de053e0b7f8a4163c2"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#abdb6ab5827d588b9c2e908beda4c3154"><param name="Name" value="pal_plat_osReboot"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#abdb6ab5827d588b9c2e908beda4c3154"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a6e7b3c23b094270b4e013c4412f2d3b1"><param name="Name" value="pal_plat_osSemaphoreCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a6e7b3c23b094270b4e013c4412f2d3b1"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ab37f3153b73dc87ca609c4c2e1bf8d6a"><param name="Name" value="pal_plat_osSemaphoreDelete"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ab37f3153b73dc87ca609c4c2e1bf8d6a"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a252f210ce8a502891821b5af24b09822"><param name="Name" value="pal_plat_osSemaphoreRelease"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a252f210ce8a502891821b5af24b09822"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac9231eef550eb7b62a89e7a34b62d014"><param name="Name" value="pal_plat_osSemaphoreWait"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac9231eef550eb7b62a89e7a34b62d014"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9c965e0fdfd80fc86c901cf2bde88c64"><param name="Name" value="pal_plat_osThreadCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9c965e0fdfd80fc86c901cf2bde88c64"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a4c42c35d3d7b375833a51b4670febe92"><param name="Name" value="pal_plat_osThreadGetId"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a4c42c35d3d7b375833a51b4670febe92"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aca6b1b2f34861cf8e3d2dcc076992270"><param name="Name" value="pal_plat_osThreadGetLocalStore"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aca6b1b2f34861cf8e3d2dcc076992270"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a3117f8911b3e83e27031f366aa652a4f"><param name="Name" value="pal_plat_osThreadTerminate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a3117f8911b3e83e27031f366aa652a4f"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aee15bcaba1ed33c264bc4c91c1dbb1cf"><param name="Name" value="pal_plat_osTimerCreate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aee15bcaba1ed33c264bc4c91c1dbb1cf"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9723baa43780a1083f43d786fa53a73d"><param name="Name" value="pal_plat_osTimerDelete"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9723baa43780a1083f43d786fa53a73d"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a80f5ca578197088e4cf84042c9efc2d7"><param name="Name" value="pal_plat_osTimerStart"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a80f5ca578197088e4cf84042c9efc2d7"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2f1fdb410c4d6ae382622ef4f1884808"><param name="Name" value="pal_plat_osTimerStop"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2f1fdb410c4d6ae382622ef4f1884808"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac"><param name="Name" value="pal_plat_receiveFrom"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa869b5eddbf4eb6aebbbb587ece84aac"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#aa869b5eddbf4eb6aebbbb587ece84aac"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab37f007a0574ca73916b26240ff1126b"><param name="Name" value="pal_plat_RegisterNetworkInterface"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab37f007a0574ca73916b26240ff1126b"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a9f6e13112366978741749649356a886c"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a1b47d17e90b6a03e7bd1ec6a0d549b46"><param name="Name" value="NVIC_SystemReset"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#af12d673085039783ab1d2613eff7e4a4"><param name="Name" value="PAL_MUTEX_DATA_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9b3b50428d7ad199287a291137041c43"><param name="Name" value="PAL_NUM_OF_THREAD_INSTANCES"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac62a5b36fc159e12670c44a12dc08beb"><param name="Name" value="pal_plat_osAtomicIncrement"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a140b31a48ac23c909f1a94ad11b04aac"><param name="Name" value="pal_plat_osDelay"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a82eade9e7b100bd9dc9ab8312f98f827"><param name="Name" value="pal_plat_osKernelSysMilliSecTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae92f87b121a06e0062ee014025c0ba9e"><param name="Name" value="pal_plat_osKernelSysTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#addc790764a23a3e16344bd830ebe01ef"><param name="Name" value="pal_plat_osKernelSysTickFrequency"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2d18206974bdf17c48b97e2e16505f19"><param name="Name" value="pal_plat_osKernelSysTickMicroSec"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a67696b86a6116a82da7c26a433280e58"><param name="Name" value="pal_plat_osMessageGet"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa80549a557e50e0759991c6b11eb456a"><param name="Name" value="pal_plat_osMessagePut"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ad25c8f7cb22985b077e893be5bc27d48"><param name="Name" value="pal_plat_osMessageQueueCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a0e0e6dc9958a9efd9beb62493bc3f67a"><param name="Name" value="pal_plat_osMessageQueueDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ae2425f958ab7d58eff5c5b3183f40305"><param name="Name" value="pal_plat_osMutexCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a909f4ae03b0acef0b84609d9b76679b4"><param name="Name" value="pal_plat_osMutexDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#add4dbca7b11365e7301db1425c9fdf4d"><param name="Name" value="pal_plat_osMutexRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aea4ad5224c43ff0fff2b77798d19748c"><param name="Name" value="pal_plat_osMutexWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a5938d16ea0c12594e8f8becd20acf3a7"><param name="Name" value="pal_plat_osPoolAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8dff6b49f9798cdd4eed04f3dff30330"><param name="Name" value="pal_plat_osPoolCAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a7a4fa20255fe38cf183f6c924419fe85"><param name="Name" value="pal_plat_osPoolCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a33ca5b5e9d3a80594de4977924e6bc1b"><param name="Name" value="pal_plat_osPoolDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a84e2f41a587335de053e0b7f8a4163c2"><param name="Name" value="pal_plat_osPoolFree"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#abdb6ab5827d588b9c2e908beda4c3154"><param name="Name" value="pal_plat_osReboot"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a6e7b3c23b094270b4e013c4412f2d3b1"><param name="Name" value="pal_plat_osSemaphoreCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ab37f3153b73dc87ca609c4c2e1bf8d6a"><param name="Name" value="pal_plat_osSemaphoreDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a252f210ce8a502891821b5af24b09822"><param name="Name" value="pal_plat_osSemaphoreRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#ac9231eef550eb7b62a89e7a34b62d014"><param name="Name" value="pal_plat_osSemaphoreWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9c965e0fdfd80fc86c901cf2bde88c64"><param name="Name" value="pal_plat_osThreadCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a4c42c35d3d7b375833a51b4670febe92"><param name="Name" value="pal_plat_osThreadGetId"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aca6b1b2f34861cf8e3d2dcc076992270"><param name="Name" value="pal_plat_osThreadGetLocalStore"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a3117f8911b3e83e27031f366aa652a4f"><param name="Name" value="pal_plat_osThreadTerminate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aee15bcaba1ed33c264bc4c91c1dbb1cf"><param name="Name" value="pal_plat_osTimerCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a9723baa43780a1083f43d786fa53a73d"><param name="Name" value="pal_plat_osTimerDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a80f5ca578197088e4cf84042c9efc2d7"><param name="Name" value="pal_plat_osTimerStart"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2f1fdb410c4d6ae382622ef4f1884808"><param name="Name" value="pal_plat_osTimerStop"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8a484abc75cf595862459d6ab21c7a0c"><param name="Name" value="pal_plat_RTOSDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2e7aaf20f2cad3b04061e1c3fd748c42"><param name="Name" value="pal_plat_RTOSInitialize"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a31d6d9a16b9891d7eb84e2b974c2c92b"><param name="Name" value="PAL_RTOS_MEMORY_POOL_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa1b17e5a20a5db09a3a3267f9a4191e0"><param name="Name" value="PAL_RTOS_MESSAGE_Q_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa25bb23dc9f40c91f9872c585e649723"><param name="Name" value="PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a66dcd5bd7ca661597fecabb1795fa393"><param name="Name" value="PAL_SEMAPHORE_DATA_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a78b1f63823e34bc82e272358701cbe67"><param name="Name" value="PAL_TICK_TO_MILLI_FACTOR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aba1d833ce13b78f5648ec26cdd25f639"><param name="Name" value="PAL_TIMER_DATA_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#afa12596f9e3d06ce0b6fde07eb52d07a"><param name="Name" value="palMemoryPool_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a550ebbfa0932f76e30a372710bff8f60"><param name="Name" value="palMessageQ_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a366960ed96b6cf998870481300a739d4"><param name="Name" value="palMutex_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aaab2b2c34911a85e67be94866be7e515"><param name="Name" value="palSemaphore_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a06ecfc14d166863199ebfc4372d61127"><param name="Name" value="palThread_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a3b3cdd4235f3b1a26e63840b91c98e18"><param name="Name" value="palThreadFuncWrapper_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2976c77ab047a577ddac4d82bfd40f10"><param name="Name" value="palTimer_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ac62a5b36fc159e12670c44a12dc08beb"><param name="Name" value="pal_plat_osAtomicIncrement"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a140b31a48ac23c909f1a94ad11b04aac"><param name="Name" value="pal_plat_osDelay"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a82eade9e7b100bd9dc9ab8312f98f827"><param name="Name" value="pal_plat_osKernelSysMilliSecTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ae92f87b121a06e0062ee014025c0ba9e"><param name="Name" value="pal_plat_osKernelSysTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ad104e06e7b043305fdbfbc37e4ea2826"><param name="Name" value="pal_plat_osKernelSysTick64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aacd58e95c23ad1c8f39b8b12ed2d83dd"><param name="Name" value="pal_plat_osKernelSysTickFrequency"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2d18206974bdf17c48b97e2e16505f19"><param name="Name" value="pal_plat_osKernelSysTickMicroSec"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a67696b86a6116a82da7c26a433280e58"><param name="Name" value="pal_plat_osMessageGet"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aa80549a557e50e0759991c6b11eb456a"><param name="Name" value="pal_plat_osMessagePut"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ad25c8f7cb22985b077e893be5bc27d48"><param name="Name" value="pal_plat_osMessageQueueCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a0e0e6dc9958a9efd9beb62493bc3f67a"><param name="Name" value="pal_plat_osMessageQueueDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ae2425f958ab7d58eff5c5b3183f40305"><param name="Name" value="pal_plat_osMutexCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a909f4ae03b0acef0b84609d9b76679b4"><param name="Name" value="pal_plat_osMutexDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#add4dbca7b11365e7301db1425c9fdf4d"><param name="Name" value="pal_plat_osMutexRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aea4ad5224c43ff0fff2b77798d19748c"><param name="Name" value="pal_plat_osMutexWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a5938d16ea0c12594e8f8becd20acf3a7"><param name="Name" value="pal_plat_osPoolAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a8dff6b49f9798cdd4eed04f3dff30330"><param name="Name" value="pal_plat_osPoolCAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a7a4fa20255fe38cf183f6c924419fe85"><param name="Name" value="pal_plat_osPoolCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a33ca5b5e9d3a80594de4977924e6bc1b"><param name="Name" value="pal_plat_osPoolDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a84e2f41a587335de053e0b7f8a4163c2"><param name="Name" value="pal_plat_osPoolFree"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a894db4d6fe636ef7a7ebf83d4334adbd"><param name="Name" value="pal_plat_osReboot"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a6e7b3c23b094270b4e013c4412f2d3b1"><param name="Name" value="pal_plat_osSemaphoreCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ab37f3153b73dc87ca609c4c2e1bf8d6a"><param name="Name" value="pal_plat_osSemaphoreDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a252f210ce8a502891821b5af24b09822"><param name="Name" value="pal_plat_osSemaphoreRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#ac9231eef550eb7b62a89e7a34b62d014"><param name="Name" value="pal_plat_osSemaphoreWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a9c965e0fdfd80fc86c901cf2bde88c64"><param name="Name" value="pal_plat_osThreadCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a4c42c35d3d7b375833a51b4670febe92"><param name="Name" value="pal_plat_osThreadGetId"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aca6b1b2f34861cf8e3d2dcc076992270"><param name="Name" value="pal_plat_osThreadGetLocalStore"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a3117f8911b3e83e27031f366aa652a4f"><param name="Name" value="pal_plat_osThreadTerminate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#aee15bcaba1ed33c264bc4c91c1dbb1cf"><param name="Name" value="pal_plat_osTimerCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a9723baa43780a1083f43d786fa53a73d"><param name="Name" value="pal_plat_osTimerDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a80f5ca578197088e4cf84042c9efc2d7"><param name="Name" value="pal_plat_osTimerStart"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2f1fdb410c4d6ae382622ef4f1884808"><param name="Name" value="pal_plat_osTimerStop"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c"><param name="Name" value="pal_plat_RTOSDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42"><param name="Name" value="pal_plat_RTOSInitialize"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8a484abc75cf595862459d6ab21c7a0c"><param name="Name" value="pal_plat_RTOSDestroy"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a8a484abc75cf595862459d6ab21c7a0c"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a8a484abc75cf595862459d6ab21c7a0c"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2e7aaf20f2cad3b04061e1c3fd748c42"><param name="Name" value="pal_plat_RTOSInitialize"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2e7aaf20f2cad3b04061e1c3fd748c42"><param name="Name" value="pal_plat_rtos.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d59/pal__plat__rtos_8h.html#a2e7aaf20f2cad3b04061e1c3fd748c42"><param name="Name" value="pal_plat_rtos.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a17365747ed8d29df153a336da3942187"><param name="Name" value="pal_plat_sendTo"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a17365747ed8d29df153a336da3942187"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a17365747ed8d29df153a336da3942187"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d"><param name="Name" value="pal_plat_setSocketOptions"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a08ea05dacec7f7d9dc892dab0318542d"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a08ea05dacec7f7d9dc892dab0318542d"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a58a25ae30bb6225cc8b5344053fd705c"><param name="Name" value="pal_plat_socket"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a58a25ae30bb6225cc8b5344053fd705c"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a58a25ae30bb6225cc8b5344053fd705c"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa0c26dfeee80444e58eacab238206d09"><param name="Name" value="pal_plat_socketMiniSelect"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aa0c26dfeee80444e58eacab238206d09"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#aa0c26dfeee80444e58eacab238206d09"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab92cca0e4facf3d62e03c0d0ca0523da"><param name="Name" value="pal_plat_socketsInit"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ab92cca0e4facf3d62e03c0d0ca0523da"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#ab92cca0e4facf3d62e03c0d0ca0523da"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd"><param name="Name" value="pal_plat_socketsTerminate"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd"><param name="Name" value="pal_plat_network.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d2c/pal__plat__network_8h.html#a6a2b36db2bb5d71ade0fe8cb00d3cecd"><param name="Name" value="pal_plat_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb"><param name="Name" value="PAL_PRINTF"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a6b5e705be1e7c3c16080f2b05b87ff7d"><param name="Name" value="pal_receiveFrom"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a6b5e705be1e7c3c16080f2b05b87ff7d"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a6b5e705be1e7c3c16080f2b05b87ff7d"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a081cc2fd09644c41068673487b39f6b8"><param name="Name" value="pal_registerNetworkInterface"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a081cc2fd09644c41068673487b39f6b8"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a081cc2fd09644c41068673487b39f6b8"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html"><param name="Name" value="pal_rtos.c"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2b4f475c89ea263557d6529c4d9a9353"><param name="Name" value="dbgPrintf"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a9b33d260ee1022f5b5f6a9dfc3363f2a"><param name="Name" value="pal_osAtomicIncrement"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ad6aaee432fd7ea5e35ab500a6278cc25"><param name="Name" value="pal_osDelay"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a59e85747582417a1395ed0f9c140eb8a"><param name="Name" value="pal_osKernelSysMilliSecTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a9800b8b9e057fe17e50c4259c809f898"><param name="Name" value="pal_osKernelSysTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#af88551b6ca24a7a2bb6d94d423eb4401"><param name="Name" value="pal_osKernelSysTick64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a087214ae87c20fd59f47fe3c96d0eefc"><param name="Name" value="pal_osKernelSysTickFrequency"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a34375ee82619a4064849daccbdfbc966"><param name="Name" value="pal_osKernelSysTickMicroSec"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ab70d0be45514258874c0406c2040372c"><param name="Name" value="pal_osMessageGet"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a966daa5b0bd9282fbffa7c462da1c417"><param name="Name" value="pal_osMessagePut"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a0c7f0003e92b3494089966d53ab24a1b"><param name="Name" value="pal_osMessageQueueCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#adba13212ec060092acdf6165e82be5b6"><param name="Name" value="pal_osMessageQueueDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#af89aab14085207b1a0951f7aad24193c"><param name="Name" value="pal_osMutexCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a03f43d7e53435d89f316862b48b573c4"><param name="Name" value="pal_osMutexDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1d976a616a5c850b2016b2b87d8b47cc"><param name="Name" value="pal_osMutexRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#acda0974247325955719b23494d66c622"><param name="Name" value="pal_osMutexWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a3a2b57685096d16a110ee38f7f29e099"><param name="Name" value="pal_osPoolAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a5d20661cd387a172450a2fe12993687a"><param name="Name" value="pal_osPoolCAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1245f053abb3fdb7ab2ceb5a2899e8c6"><param name="Name" value="pal_osPoolCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a1c01464448f8d7bd95bf518d651484c6"><param name="Name" value="pal_osPoolDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a79f4997069310aa7bbb6ae7995988dd7"><param name="Name" value="pal_osPoolFree"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ab8ab0f31bbf4258b7684d22e7725a9f8"><param name="Name" value="pal_osReboot"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aaa7aee442a5c8cc274d3e52206984037"><param name="Name" value="pal_osSemaphoreCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a45f071482f8669821b90264e0470b33d"><param name="Name" value="pal_osSemaphoreDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a009d0c063119265f9c5c0c9bff379c14"><param name="Name" value="pal_osSemaphoreRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aa2d998744dbc9504bfe0358f85457fc4"><param name="Name" value="pal_osSemaphoreWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2dae64d917f644982b893037adf562b4"><param name="Name" value="pal_osThreadCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a2993b8f6b5e8d7ccd6121dc18330e4be"><param name="Name" value="pal_osThreadGetId"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ac94f4efc4bad73969e57c8255c136a0d"><param name="Name" value="pal_osThreadGetLocalStore"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#abcfa47b411929b33d5d9cfaaff28ce18"><param name="Name" value="pal_osThreadTerminate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#aa4da36fbbba744a14d1bdfe2a26d1a18"><param name="Name" value="pal_osTimerCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#ac7ca6e7c3c229f4092c9df4b69e7dd59"><param name="Name" value="pal_osTimerDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a6c60c9e433bc6005bac6b02d5aba7363"><param name="Name" value="pal_osTimerStart"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/d33/pal__rtos_8c.html#a94f4df594102e582cbd2114f6eebb57d"><param name="Name" value="pal_osTimerStop"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html"><param name="Name" value="pal_rtos.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2b4f475c89ea263557d6529c4d9a9353"><param name="Name" value="dbgPrintf"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9b33d260ee1022f5b5f6a9dfc3363f2a"><param name="Name" value="pal_osAtomicIncrement"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ad6aaee432fd7ea5e35ab500a6278cc25"><param name="Name" value="pal_osDelay"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a59e85747582417a1395ed0f9c140eb8a"><param name="Name" value="pal_osKernelSysMilliSecTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9800b8b9e057fe17e50c4259c809f898"><param name="Name" value="pal_osKernelSysTick"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#af88551b6ca24a7a2bb6d94d423eb4401"><param name="Name" value="pal_osKernelSysTick64"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a087214ae87c20fd59f47fe3c96d0eefc"><param name="Name" value="pal_osKernelSysTickFrequency"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a34375ee82619a4064849daccbdfbc966"><param name="Name" value="pal_osKernelSysTickMicroSec"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ab70d0be45514258874c0406c2040372c"><param name="Name" value="pal_osMessageGet"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a966daa5b0bd9282fbffa7c462da1c417"><param name="Name" value="pal_osMessagePut"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a0c7f0003e92b3494089966d53ab24a1b"><param name="Name" value="pal_osMessageQueueCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#adba13212ec060092acdf6165e82be5b6"><param name="Name" value="pal_osMessageQueueDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#af89aab14085207b1a0951f7aad24193c"><param name="Name" value="pal_osMutexCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a03f43d7e53435d89f316862b48b573c4"><param name="Name" value="pal_osMutexDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1d976a616a5c850b2016b2b87d8b47cc"><param name="Name" value="pal_osMutexRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#acda0974247325955719b23494d66c622"><param name="Name" value="pal_osMutexWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a3a2b57685096d16a110ee38f7f29e099"><param name="Name" value="pal_osPoolAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a5d20661cd387a172450a2fe12993687a"><param name="Name" value="pal_osPoolCAlloc"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1245f053abb3fdb7ab2ceb5a2899e8c6"><param name="Name" value="pal_osPoolCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a1c01464448f8d7bd95bf518d651484c6"><param name="Name" value="pal_osPoolDestroy"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a79f4997069310aa7bbb6ae7995988dd7"><param name="Name" value="pal_osPoolFree"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ac6ad927a77b4275e1da2373f810ee2af"><param name="Name" value="PAL_osPriorityAboveNormal"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a23fdf72acf5a9475ca4054d4e1a187a5"><param name="Name" value="PAL_osPriorityBelowNormal"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a94aea8f14f0bc89f7f4540416c08da3e"><param name="Name" value="PAL_osPriorityError"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a70d584591ab861e247ccfe94e55e35a2"><param name="Name" value="PAL_osPriorityHigh"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a62b0350b25146b93c57a71ce65bb017a"><param name="Name" value="PAL_osPriorityIdle"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535ab3b5b218f45b07de8153427c63273fec"><param name="Name" value="PAL_osPriorityLow"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a897a2d3cf2fa39f82141535d0d4e51a1"><param name="Name" value="PAL_osPriorityNormal"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6f32dbade90ba4bf593f475f51fb6535a3c2b8a244cae70bbf23a5a4d033df2ce"><param name="Name" value="PAL_osPriorityRealtime"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ab8ab0f31bbf4258b7684d22e7725a9f8"><param name="Name" value="pal_osReboot"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aaa7aee442a5c8cc274d3e52206984037"><param name="Name" value="pal_osSemaphoreCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a45f071482f8669821b90264e0470b33d"><param name="Name" value="pal_osSemaphoreDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a009d0c063119265f9c5c0c9bff379c14"><param name="Name" value="pal_osSemaphoreRelease"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa2d998744dbc9504bfe0358f85457fc4"><param name="Name" value="pal_osSemaphoreWait"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2dae64d917f644982b893037adf562b4"><param name="Name" value="pal_osThreadCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2993b8f6b5e8d7ccd6121dc18330e4be"><param name="Name" value="pal_osThreadGetId"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac94f4efc4bad73969e57c8255c136a0d"><param name="Name" value="pal_osThreadGetLocalStore"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#abcfa47b411929b33d5d9cfaaff28ce18"><param name="Name" value="pal_osThreadTerminate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa4da36fbbba744a14d1bdfe2a26d1a18"><param name="Name" value="pal_osTimerCreate"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac7ca6e7c3c229f4092c9df4b69e7dd59"><param name="Name" value="pal_osTimerDelete"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a6c60c9e433bc6005bac6b02d5aba7363"><param name="Name" value="pal_osTimerStart"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a94f4df594102e582cbd2114f6eebb57d"><param name="Name" value="pal_osTimerStop"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a2e5b95b90c72b6bdf62897efd58f98fb"><param name="Name" value="PAL_PRINTF"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ad19aa2a408e848a5f86d897ab50500ec"><param name="Name" value="PAL_RTOS_WAIT_FOREVER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb"><param name="Name" value="palMemoryPoolID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910"><param name="Name" value="palMessageQID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901"><param name="Name" value="palMutexID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30"><param name="Name" value="palOsTimerOnce"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9"><param name="Name" value="palOsTimerPeriodic"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481"><param name="Name" value="palSemaphoreID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853"><param name="Name" value="palThreadFuncPtr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5"><param name="Name" value="palThreadID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c"><param name="Name" value="palThreadLocalStore_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be"><param name="Name" value="palThreadPriority_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b"><param name="Name" value="palTimerFuncPtr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985"><param name="Name" value="palTimerID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a"><param name="Name" value="palTimerType_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a2c7f7687d719d388a67c1f18f200962d"><param name="Name" value="PAL_RTOS_64BIT_TICK_SUPPORTED"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a31d6d9a16b9891d7eb84e2b974c2c92b"><param name="Name" value="PAL_RTOS_MEMORY_POOL_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa1b17e5a20a5db09a3a3267f9a4191e0"><param name="Name" value="PAL_RTOS_MESSAGE_Q_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8f9b1f133f82ce955405d453f0c506d6"><param name="Name" value="g_threadsArg"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a9beaf51023e475986b8b182c80ccc023"><param name="Name" value="g_threadStorage"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1a09db2f0cd5dd2d0929b34afad51ba1"><param name="Name" value="g_timerArgs"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#adb164ebbfd2189f434f5e550e2d93bb4"><param name="Name" value="mutex1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8706c6b975e957968f23af2812bbc0cb"><param name="Name" value="mutex2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a393f7a6e534c05e534cfdaf46473db45"><param name="Name" value="palRunThreads"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a2f8d675e43058c8f8b853b52366abf38"><param name="Name" value="semaphore1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1e33659cb747282e1869e9f86fe2d33f"><param name="Name" value="TEST"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ab19fea07339238925c3b105637ce92c1"><param name="Name" value="TEST_GROUP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8a7c6f6a71607f9dce69207f1f7ed3c1"><param name="Name" value="TEST_SETUP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ac5fc4009112ba6cadc74ad8cd14c427b"><param name="Name" value="TEST_TEAR_DOWN"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb"><param name="Name" value="button_pressed"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a"><param name="Name" value="button_thread"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7"><param name="Name" value="led1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26"><param name="Name" value="led_thread"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="Name" value="main"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8"><param name="Name" value="sw2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde"><param name="Name" value="sw2_press"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc"><param name="Name" value="TEST_pal_rtos_GROUP_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487"><param name="Name" value="thread2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="Name" value="UnityMain"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/df6/pal__rtos__test__runner_8c.html"><param name="Name" value="pal_rtos_test_runner.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a393f7a6e534c05e534cfdaf46473db45"><param name="Name" value="palRunThreads"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a0a153da028aee8f220377b516ff065c8"><param name="Name" value="palThreadFunc1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a29dc69cbcc48b55d48a5fd668da7fe15"><param name="Name" value="palThreadFunc2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#acf68b041960be3c58f516986504fcd0f"><param name="Name" value="palThreadFunc3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a844c7469189866b502ef85df5063e79c"><param name="Name" value="palThreadFunc4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a5be7a07498de9cc847215e6aa8f77914"><param name="Name" value="palThreadFunc5"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a52dc025f6020b0d456bbbcacc3aa4e3e"><param name="Name" value="palThreadFunc6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a7c8c7a38fca8b62acc6094ba1f072ec7"><param name="Name" value="palThreadFuncCustom1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a663a9130dc598399ec3bd9ab9e6680fa"><param name="Name" value="palThreadFuncCustom2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a300d95346a90a5f17aa6140647243b64"><param name="Name" value="palThreadFuncCustom3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#aa5b1f9c927c18d821a46d99dfe533cb0"><param name="Name" value="palThreadFuncCustom4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#abac822ed4b356b85117101aa0d8701d6"><param name="Name" value="palTimerFunc1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a8581bcb8f9f435a87c3dd651d65e32c8"><param name="Name" value="palTimerFunc2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#aecb21b545f5a0c542dc82a8ef0b89b3f"><param name="Name" value="threadsArg"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#ad4897778c444c8e8fbcb65c84901ac78"><param name="Name" value="timerArgs"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8f9b1f133f82ce955405d453f0c506d6"><param name="Name" value="g_threadsArg"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a9beaf51023e475986b8b182c80ccc023"><param name="Name" value="g_threadStorage"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a1a09db2f0cd5dd2d0929b34afad51ba1"><param name="Name" value="g_timerArgs"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a3c0ce22bdba74fe398c6adefbc7fbbdf"><param name="Name" value="MEMORY_POOL1_BLOCK_COUNT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#ae3c2c737bcf6b45c3bf394dfe8349c4d"><param name="Name" value="MEMORY_POOL1_BLOCK_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a593d40fc26d9d1664c57988a846a888e"><param name="Name" value="MEMORY_POOL2_BLOCK_COUNT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a3c85d7e7f47d26444477603d8e2fd5d5"><param name="Name" value="MEMORY_POOL2_BLOCK_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#adb164ebbfd2189f434f5e550e2d93bb4"><param name="Name" value="mutex1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8706c6b975e957968f23af2812bbc0cb"><param name="Name" value="mutex2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8"><param name="Name" value="palThreadFunc1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15"><param name="Name" value="palThreadFunc2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f"><param name="Name" value="palThreadFunc3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c"><param name="Name" value="palThreadFunc4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914"><param name="Name" value="palThreadFunc5"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e"><param name="Name" value="palThreadFunc6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7"><param name="Name" value="palThreadFuncCustom1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa"><param name="Name" value="palThreadFuncCustom2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64"><param name="Name" value="palThreadFuncCustom3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0"><param name="Name" value="palThreadFuncCustom4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6"><param name="Name" value="palTimerFunc1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8"><param name="Name" value="palTimerFunc2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38"><param name="Name" value="semaphore1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a90b7a8cb7bc3fdbd98014a3e15ee6e9a"><param name="Name" value="THREAD_STACK_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0"><param name="Name" value="threadsArgument_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76"><param name="Name" value="timerArgument_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aa25bb23dc9f40c91f9872c585e649723"><param name="Name" value="PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ad19aa2a408e848a5f86d897ab50500ec"><param name="Name" value="PAL_RTOS_WAIT_FOREVER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a66dcd5bd7ca661597fecabb1795fa393"><param name="Name" value="PAL_SEMAPHORE_DATA_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#acce808f708e653b6bed317072888ca23"><param name="Name" value="pal_sendTo"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#acce808f708e653b6bed317072888ca23"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#acce808f708e653b6bed317072888ca23"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aed02a6f53b88e1d5e81607b1221a3efa"><param name="Name" value="pal_setSockAddrIPV4Addr"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aed02a6f53b88e1d5e81607b1221a3efa"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aed02a6f53b88e1d5e81607b1221a3efa"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a0cc13f7ef9ceb4a75884a8bebf0d831c"><param name="Name" value="pal_setSockAddrIPV6Addr"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a0cc13f7ef9ceb4a75884a8bebf0d831c"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a0cc13f7ef9ceb4a75884a8bebf0d831c"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#abbeb1395896eb79ab564568b9ab8a628"><param name="Name" value="pal_setSockAddrPort"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#abbeb1395896eb79ab564568b9ab8a628"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#abbeb1395896eb79ab564568b9ab8a628"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a2e1bbe81a35a1cb54c351912bb97736f"><param name="Name" value="pal_setSocketOptions"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a2e1bbe81a35a1cb54c351912bb97736f"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2e1bbe81a35a1cb54c351912bb97736f"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a9e1ad5d4670e06bb2a8b110c0ba3e5ca"><param name="Name" value="PAL_SO_RCVTIMEO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51a352587a3fea85695be1ce478aa3da001"><param name="Name" value="PAL_SO_REUSEADDR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a2694f5de0fb810ddd7ff249ea1478f51aa744f783051825333c23177008d140de"><param name="Name" value="PAL_SO_SNDTIMEO"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ab5d2c3c0d3b2f0e08afcd0d53ff4c418a14e907287d0ede1306aa35f5687e0941"><param name="Name" value="PAL_SOCK_DGRAM"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aa852fb6e271fb91efd65e2a1ead93b9a"><param name="Name" value="pal_socket"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aa852fb6e271fb91efd65e2a1ead93b9a"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#aa852fb6e271fb91efd65e2a1ead93b9a"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a8c607fcbfa526e4485fcdb55b79b39d6"><param name="Name" value="PAL_SOCKET_OPTION_ERROR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html"><param name="Name" value="pal_socket_test.c"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a702871d3d9057fa4fc99031298fb425c"><param name="Name" value="g_networkInterface"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abc23815d68dafc619e2c2ba210d65bd0"><param name="Name" value="PAL_NET_SUPPORT_LWIP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ab1873f5ba58eb802dd808f05a1101670"><param name="Name" value="PAL_NET_TEST_INCOMING_PORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a7c3cef32674c412f87617e87a194e0e3"><param name="Name" value="PAL_NET_TEST_SERVER_HTTP_PORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a0570e783c7412d25d0c33817da54c02f"><param name="Name" value="PAL_NET_TEST_SERVER_IP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a7175d943793d9a92ebe83d12f2a65063"><param name="Name" value="PAL_NET_TEST_SERVER_IP_STRING"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abbe7571a0fc631eb43561606f4d5bb0e"><param name="Name" value="PAL_NET_TEST_SERVER_NAME"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#abc63439a9af70c80b125accdc2afbb12"><param name="Name" value="PAL_NET_TEST_SERVER_UDP_PORT"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a0010ea5741ae7db441ef09f96eef47be"><param name="Name" value="PAL_TEST_BUFFER_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ad62b547b432124475c3f5a94d9befe6d"><param name="Name" value="socketCallback"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a89cecd4b07ef1acbb0b40c00189a0f36"><param name="Name" value="TEST"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ad324fc284dd938317109a9fc47dd1732"><param name="Name" value="TEST_GROUP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a26217052dc55731aa82231669a8cf0df"><param name="Name" value="TEST_SETUP"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ac307640c84843ab78607af150bcbe143"><param name="Name" value="TEST_TEAR_DOWN"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ae8697e1a75bad4a53dd6d6ec81e486cb"><param name="Name" value="button_pressed"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#afe6a59684384290b7f8710db5203944a"><param name="Name" value="button_thread"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a6b71ffd718e2af00cebeb05560b44be7"><param name="Name" value="led1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a602cc5fb415f60615dbfa0643b3b3e26"><param name="Name" value="led_thread"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#ac0f2228420376f4db7e1274f2b41667c"><param name="Name" value="main"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8"><param name="Name" value="sw2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde"><param name="Name" value="sw2_press"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab"><param name="Name" value="TEST_pal_socket_GROUP_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487"><param name="Name" value="thread2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="Name" value="UnityMain"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/da5/pal__socket__test__runner_8c.html"><param name="Name" value="pal_socket_test_runner.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html"><param name="Name" value="pal_socket_test_utils.cpp"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#a5e4a39a385159acfd150a2e6098351cf"><param name="Name" value="palTestGetNetWorkInterfaceContext"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#ac641d6ab2d8d2f23e89e7c36694d85dd"><param name="Name" value="TEST_PRINTF"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d2a/pal__socket__test__utils_8h.html"><param name="Name" value="pal_socket_test_utils.h"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#aaf4e46664d7b7f8902c69cb72a65c943"><param name="Name" value="pal_socketAddressInternal6_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#abc2b368e206e7353e31a520fa573cd8a"><param name="Name" value="pal_socketAddressInternal_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a5cab4ea55a3d28cfd8d4dca8376a111c"><param name="Name" value="pal_socketMiniSelect"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dc4/pal__network_8c.html#a5cab4ea55a3d28cfd8d4dca8376a111c"><param name="Name" value="pal_network.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a5cab4ea55a3d28cfd8d4dca8376a111c"><param name="Name" value="pal_network.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"><param name="Name" value="PAL_SUCCESS"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/dcf/pal__macros_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"><param name="Name" value="pal_macros.h"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"><param name="Name" value="pal_types.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a0010ea5741ae7db441ef09f96eef47be"><param name="Name" value="PAL_TEST_BUFFER_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d0/d51/pal__test__utils_8h.html"><param name="Name" value="pal_test_utils.h"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d48/structpal__thread_local_store.html"><param name="Name" value="pal_threadLocalStore"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc"><param name="Name" value="storeData"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a78b1f63823e34bc82e272358701cbe67"><param name="Name" value="PAL_TICK_TO_MILLI_FACTOR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aba1d833ce13b78f5648ec26cdd25f639"><param name="Name" value="PAL_TIMER_DATA_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/dfc/structpal__time_val.html"><param name="Name" value="pal_timeVal"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf"><param name="Name" value="pal_tv_sec"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c"><param name="Name" value="pal_tv_usec"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ab8ff1c2207a2f7c219088008fbc99ff4"><param name="Name" value="pal_timeVal_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/dfc/structpal__time_val.html#a8c0bfa9026d4b23b598f0652aa975fcf"><param name="Name" value="pal_tv_sec"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="de/dfc/structpal__time_val.html#acf8b8c0480064a16325f94f155db4e1c"><param name="Name" value="pal_tv_usec"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html"><param name="Name" value="pal_types.h"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a3ef7eab8cd0e570b6586628cc9d5ccab"><param name="Name" value="NULLPTR"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a92e2ad3a6b8c71818b6a08720fa84ba5"><param name="Name" value="PAL_SUCCESS"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4"><param name="Name" value="palBuffer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81"><param name="Name" value="palConstBuffer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d"><param name="Name" value="palStatus_t"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d2/d87/pal__configuration_8h.html#a4d2f5187ecd7e90c094e2f103e5b6839"><param name="Name" value="PAL_UNIQUE_THREAD_PRIORITY"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a8c90171089db400b392bf0d3b68de0e4"><param name="Name" value="palBuffer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a1fc5fbdbd83764292a7b4252e44e3b81"><param name="Name" value="palConstBuffer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a03e2ae5a01f21cf32933bf4bdca5e5b1"><param name="Name" value="palIpV4Addr_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ad47edc267b97d7b32e30b45ad4674192"><param name="Name" value="palIpV6Addr_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#afa12596f9e3d06ce0b6fde07eb52d07a"><param name="Name" value="palMemoryPool_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a73ab99198ebc6e6af72064739b05bdcb"><param name="Name" value="palMemoryPoolID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a550ebbfa0932f76e30a372710bff8f60"><param name="Name" value="palMessageQ_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#acb4162ac097039734d15916d29880910"><param name="Name" value="palMessageQID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a366960ed96b6cf998870481300a739d4"><param name="Name" value="palMutex_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#ac6b402eec0e5f2ab64c43abffd4d9901"><param name="Name" value="palMutexID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/structpal_net_interface_info.html"><param name="Name" value="palNetInterfaceInfo"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/structpal_net_interface_info.html#affc930af87e8696f63b30b911cf8b03d"><param name="Name" value="address"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/structpal_net_interface_info.html#a9b816dd947f25d303e32fca36d04080e"><param name="Name" value="addressSize"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d16/structpal_net_interface_info.html#ad028021cafddc5355dfccfac1345f4f6"><param name="Name" value="interfaceName"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ab74987f80f6b9b025ed9f067a2c654da"><param name="Name" value="palNetInterfaceInfo_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2a0f237f01e8978b2dc987ff3b5cde0f30"><param name="Name" value="palOsTimerOnce"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a7ee094f262d03cbc97380f3fcd34c7d2aadcc58d31964426d67650ca958fb80f9"><param name="Name" value="palOsTimerPeriodic"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a393f7a6e534c05e534cfdaf46473db45"><param name="Name" value="palRunThreads"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a393f7a6e534c05e534cfdaf46473db45"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a393f7a6e534c05e534cfdaf46473db45"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a056dbb70ade63a6ebc47f1f11733b8da"><param name="Name" value="palSelectCallback0"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a4dcff46004af6c4d300d542de9c7d38e"><param name="Name" value="palSelectCallback1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#abe369a2a4de2c8e25ed47166f068918f"><param name="Name" value="palSelectCallback2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#aeabad2d66db156a97447f6e22614e78c"><param name="Name" value="palSelectCallback3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a521d96ff90d0b417e6749df8ae90bf8b"><param name="Name" value="palSelectCallback4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#ae937bf3f397b1642a29a44c6cf9bc075"><param name="Name" value="palSelectCallback5"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6b99c0251a9efb7224658c8da6e3ad27"><param name="Name" value="palSelectCallback6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a6e102ddea1bd5315a4224c2a1fdddd58"><param name="Name" value="palSelectCallback7"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#abb42afef799c3d7409ba0c29d645cbaf"><param name="Name" value="palSelectCallbackFunction_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#aaab2b2c34911a85e67be94866be7e515"><param name="Name" value="palSemaphore_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a0a8206fc36c3dca549aed450f7777481"><param name="Name" value="palSemaphoreID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac0bd9e160ca4973db4d846a4369ea996"><param name="Name" value="palSocket_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/d42/structpal_socket_address.html"><param name="Name" value="palSocketAddress"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/d42/structpal_socket_address.html#a0a5471b518ef60cfa0f28c47a323ec4c"><param name="Name" value="addressData"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="db/d42/structpal_socket_address.html#a8bdecffc9afacbdf84fc78d26090c221"><param name="Name" value="addressType"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#a9e444742ff895f63c34f727b4fcfba10"><param name="Name" value="palSocketAddress_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d17/pal__network_8h.html#ac844634680241bad287771f1ab8b0901"><param name="Name" value="palSocketLength_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d6/dc2/pal__types_8h.html#a160277354e86b9aea01d7689ec26d88d"><param name="Name" value="palStatus_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#a5e4a39a385159acfd150a2e6098351cf"><param name="Name" value="palTestGetNetWorkInterfaceContext"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#a5e4a39a385159acfd150a2e6098351cf"><param name="Name" value="pal_socket_test_utils.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d2a/pal__socket__test__utils_8h.html#a5e4a39a385159acfd150a2e6098351cf"><param name="Name" value="pal_socket_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a06ecfc14d166863199ebfc4372d61127"><param name="Name" value="palThread_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a0a153da028aee8f220377b516ff065c8"><param name="Name" value="palThreadFunc1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a0a153da028aee8f220377b516ff065c8"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a0a153da028aee8f220377b516ff065c8"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a29dc69cbcc48b55d48a5fd668da7fe15"><param name="Name" value="palThreadFunc2"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a29dc69cbcc48b55d48a5fd668da7fe15"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a29dc69cbcc48b55d48a5fd668da7fe15"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#acf68b041960be3c58f516986504fcd0f"><param name="Name" value="palThreadFunc3"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#acf68b041960be3c58f516986504fcd0f"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#acf68b041960be3c58f516986504fcd0f"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a844c7469189866b502ef85df5063e79c"><param name="Name" value="palThreadFunc4"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a844c7469189866b502ef85df5063e79c"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a844c7469189866b502ef85df5063e79c"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a5be7a07498de9cc847215e6aa8f77914"><param name="Name" value="palThreadFunc5"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a5be7a07498de9cc847215e6aa8f77914"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a5be7a07498de9cc847215e6aa8f77914"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a52dc025f6020b0d456bbbcacc3aa4e3e"><param name="Name" value="palThreadFunc6"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a52dc025f6020b0d456bbbcacc3aa4e3e"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a52dc025f6020b0d456bbbcacc3aa4e3e"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a7c8c7a38fca8b62acc6094ba1f072ec7"><param name="Name" value="palThreadFuncCustom1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a7c8c7a38fca8b62acc6094ba1f072ec7"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a7c8c7a38fca8b62acc6094ba1f072ec7"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a663a9130dc598399ec3bd9ab9e6680fa"><param name="Name" value="palThreadFuncCustom2"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a663a9130dc598399ec3bd9ab9e6680fa"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a663a9130dc598399ec3bd9ab9e6680fa"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a300d95346a90a5f17aa6140647243b64"><param name="Name" value="palThreadFuncCustom3"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a300d95346a90a5f17aa6140647243b64"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a300d95346a90a5f17aa6140647243b64"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#aa5b1f9c927c18d821a46d99dfe533cb0"><param name="Name" value="palThreadFuncCustom4"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#aa5b1f9c927c18d821a46d99dfe533cb0"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#aa5b1f9c927c18d821a46d99dfe533cb0"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a54696b00a498a3c4a1346030acd18853"><param name="Name" value="palThreadFuncPtr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a3b3cdd4235f3b1a26e63840b91c98e18"><param name="Name" value="palThreadFuncWrapper_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#aa61aba50e0f2dba5c8571417c2bdd9a5"><param name="Name" value="palThreadID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a381fb3b26136f4983dcce371652fb20c"><param name="Name" value="palThreadLocalStore_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a278568ee407204e02cbd783f612e55be"><param name="Name" value="palThreadPriority_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/dc5/pal__plat__rtos_8c.html#a2976c77ab047a577ddac4d82bfd40f10"><param name="Name" value="palTimer_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#abac822ed4b356b85117101aa0d8701d6"><param name="Name" value="palTimerFunc1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#abac822ed4b356b85117101aa0d8701d6"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#abac822ed4b356b85117101aa0d8701d6"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a8581bcb8f9f435a87c3dd651d65e32c8"><param name="Name" value="palTimerFunc2"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#a8581bcb8f9f435a87c3dd651d65e32c8"><param name="Name" value="pal_rtos_test_utils.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8581bcb8f9f435a87c3dd651d65e32c8"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a21fd378211ce09c12c15c39ff579627b"><param name="Name" value="palTimerFuncPtr"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a4b627efa48e79a6fbcafae87ae397985"><param name="Name" value="palTimerID_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d4/d01/pal__rtos_8h.html#a9858103df451aaf98a8af08c2583b94a"><param name="Name" value="palTimerType_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a4f6fdfaea202b7b50e57e7253705d96e"><param name="Name" value="s_palSelectPalCallbackFunctions"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/dfb/pal__plat__network_8cpp.html#a77af6aede7e9f4d41f8c87ebc381b517"><param name="Name" value="s_select_event_happened"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a2f8d675e43058c8f8b853b52366abf38"><param name="Name" value="semaphore1"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a2f8d675e43058c8f8b853b52366abf38"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a2f8d675e43058c8f8b853b52366abf38"><param name="Name" value="pal_rtos_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ad62b547b432124475c3f5a94d9befe6d"><param name="Name" value="socketCallback"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d48/structpal__thread_local_store.html#abe68dca8335fc1c9e6da5359117625bc"><param name="Name" value="storeData"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8"><param name="Name" value="sw2"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#af5543796fae8f0c3d5bfbd33f2389cb8"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde"><param name="Name" value="sw2_press"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a21e1e181f00d9dc8dbb912650459bfde"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1e33659cb747282e1869e9f86fe2d33f"><param name="Name" value="TEST"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a1e33659cb747282e1869e9f86fe2d33f"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a89cecd4b07ef1acbb0b40c00189a0f36"><param name="Name" value="pal_socket_test.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ab19fea07339238925c3b105637ce92c1"><param name="Name" value="TEST_GROUP"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ab19fea07339238925c3b105637ce92c1"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ad324fc284dd938317109a9fc47dd1732"><param name="Name" value="pal_socket_test.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/df6/pal__rtos__test__runner_8c.html#ace47ba1b1706d7b654cdf18e7008b174"><param name="Name" value="TEST_GROUP_RUNNER"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/df6/pal__rtos__test__runner_8c.html#ace47ba1b1706d7b654cdf18e7008b174"><param name="Name" value="pal_rtos_test_runner.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/da5/pal__socket__test__runner_8c.html#a7d7471d47d062a2bf20410044b712192"><param name="Name" value="pal_socket_test_runner.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#adc9a94aa19f52027390d7b0256a6693c"><param name="Name" value="TEST_pal_all_GROUPS_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc"><param name="Name" value="TEST_pal_rtos_GROUP_RUNNER"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc"><param name="Name" value="pal_all_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a9e9aa39842df82b3f5086f3215cc74fc"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab"><param name="Name" value="TEST_pal_socket_GROUP_RUNNER"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab"><param name="Name" value="pal_all_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a2393bacb0eb76d2dd1b0c200a8769cab"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a59390bc31498889208cfda7dea51bffa"><param name="Name" value="TEST_pal_update_GROUP_RUNNER"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#ac641d6ab2d8d2f23e89e7c36694d85dd"><param name="Name" value="TEST_PRINTF"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d8/d5f/pal__socket__test__utils_8cpp.html#ac641d6ab2d8d2f23e89e7c36694d85dd"><param name="Name" value="pal_socket_test_utils.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d0/d51/pal__test__utils_8h.html#a7f0c3a0f2f1c4062d776a7bc64bed815"><param name="Name" value="pal_test_utils.h"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8a7c6f6a71607f9dce69207f1f7ed3c1"><param name="Name" value="TEST_SETUP"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#a8a7c6f6a71607f9dce69207f1f7ed3c1"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#a26217052dc55731aa82231669a8cf0df"><param name="Name" value="pal_socket_test.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ac5fc4009112ba6cadc74ad8cd14c427b"><param name="Name" value="TEST_TEAR_DOWN"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="da/d2d/pal__rtos__test_8c.html#ac5fc4009112ba6cadc74ad8cd14c427b"><param name="Name" value="pal_rtos_test.c"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d5/d2a/pal__socket__test_8c.html#ac307640c84843ab78607af150bcbe143"><param name="Name" value="pal_socket_test.c"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487"><param name="Name" value="thread2"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a7d37e93ff0246ad7bf396650eaf84487"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a90b7a8cb7bc3fdbd98014a3e15ee6e9a"><param name="Name" value="THREAD_STACK_SIZE"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#aecb21b545f5a0c542dc82a8ef0b89b3f"><param name="Name" value="threadsArg"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html"><param name="Name" value="threadsArgument"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a9532cb931dee4c326444e7c366019639"><param name="Name" value="arg1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#acecc240150225e2786524a2e4b3adf78"><param name="Name" value="arg2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#abcba9882b15e3845a7794220a5c9e4f4"><param name="Name" value="arg3"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a6fad7cea38d81eb88f9ff01d4baec32a"><param name="Name" value="arg4"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a2720a7d49d96277778f83a2488859fe9"><param name="Name" value="arg5"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a460c4a55dba6130f386f648138184074"><param name="Name" value="arg6"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d3/d30/structthreads_argument.html#a200c590896768ffb09f8d90c774f6b74"><param name="Name" value="arg7"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a33d89580fea8198de226a62220e20bd0"><param name="Name" value="threadsArgument_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1"><param name="Name" value="ticksBeforeTimer"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08"><param name="Name" value="ticksInFunc1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34"><param name="Name" value="ticksInFunc2"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d1/dee/pal__rtos__test__utils_8c.html#ad4897778c444c8e8fbcb65c84901ac78"><param name="Name" value="timerArgs"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/d2c/structtimer_argument.html"><param name="Name" value="timerArgument"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/d2c/structtimer_argument.html#a18bf51a6db87346257b34c24fefbd1b1"><param name="Name" value="ticksBeforeTimer"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/d2c/structtimer_argument.html#afe9607363a4b6ae7b835ef129743ec08"><param name="Name" value="ticksInFunc1"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dc/d2c/structtimer_argument.html#af9f23b828a589dfac13cad4cb6e7da34"><param name="Name" value="ticksInFunc2"></OBJECT> + </UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/d28/pal__rtos__test__utils_8h.html#a8c22b8a190b07232b36b748fbf706e76"><param name="Name" value="timerArgument_t"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="Name" value="UnityMain"></OBJECT> + <UL> + <LI><OBJECT type="text/sitemap"><param name="Local" value="dd/d30/pal__all__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="Name" value="pal_all_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="Name" value="pal_rtos_test_main_mbedOS.cpp"></OBJECT> + <LI><OBJECT type="text/sitemap"><param name="Local" value="d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html#a58ec279183697abbd5d3efea3442d4e5"><param name="Name" value="pal_socket_test_main_mbedOS.cpp"></OBJECT> + </UL> +</UL> +</BODY> +</HTML>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/index.hhp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,122 @@ +[OPTIONS] +Compiled file=PAL.chm +Compatibility=1.1 +Full-text search=Yes +Contents file=index.hhc +Default Window=main +Default topic=index.html +Index file=index.hhk +Language=0x409 English (United States) +Binary TOC=YES +Title=PAL + +[WINDOWS] +main="PAL","index.hhc","index.hhk","index.html","index.html",,,,,0x23520,,0x70387e,,,,,,,,0 + +[FILES] +d9/d16/pal_8h_source.html +d2/d87/pal__configuration_8h_source.html +da/dfe/pal__errors_8h_source.html +db/dcf/pal__macros_8h_source.html +d9/d17/pal__network_8h_source.html +d4/d01/pal__rtos_8h_source.html +d6/dc2/pal__types_8h_source.html +d9/d2c/pal__plat__network_8h_source.html +d5/d59/pal__plat__rtos_8h_source.html +d9/d28/pal__rtos__test__utils_8h_source.html +df/d2a/pal__socket__test__utils_8h_source.html +d0/d51/pal__test__utils_8h_source.html +d1/dc4/pal__network_8c.html +de/d33/pal__rtos_8c.html +d7/d66/pal__init_8c.html +d9/d16/pal_8h.html +d2/d87/pal__configuration_8h.html +da/dfe/pal__errors_8h.html +db/dcf/pal__macros_8h.html +d9/d17/pal__network_8h.html +d4/d01/pal__rtos_8h.html +d6/dc2/pal__types_8h.html +d9/d2c/pal__plat__network_8h.html +d5/d59/pal__plat__rtos_8h.html +d3/dfb/pal__plat__network_8cpp.html +d4/dc5/pal__plat__rtos_8c.html +d1/dee/pal__rtos__test__utils_8c.html +d9/d28/pal__rtos__test__utils_8h.html +d8/d5f/pal__socket__test__utils_8cpp.html +df/d2a/pal__socket__test__utils_8h.html +d0/d51/pal__test__utils_8h.html +d5/de2/pal__all__test_8c.html +dd/d30/pal__all__test__main__mbed_o_s_8cpp.html +d3/dab/pal__all__test__runner_8c.html +da/d2d/pal__rtos__test_8c.html +df/d12/pal__rtos__test__main__mbed_o_s_8cpp.html +dd/df6/pal__rtos__test__runner_8c.html +d5/d2a/pal__socket__test_8c.html +d9/dc0/pal__socket__test__main__mbed_o_s_8cpp.html +dc/da5/pal__socket__test__runner_8c.html +d8/d19/struct__pal_buffer__t.html +d2/dab/struct__pal_const_buffer__t.html +df/d48/structpal__thread_local_store.html +de/dfc/structpal__time_val.html +d9/d16/structpal_net_interface_info.html +db/d42/structpal_socket_address.html +d3/d30/structthreads_argument.html +dc/d2c/structtimer_argument.html +dir_f8e9a069a0807d5f7341f9bc5892e16f.html +dir_7b7fa73f1a1b36d6dab78f50bb89ca7b.html +dir_5097254b22164c5ad71a4eec719a72ee.html +dir_ddf5611ee10e8b15ebe1664d2c043f4e.html +dir_59e3d70b06141856a554dd7aab1293ae.html +dir_8a9a67948239eaee56ff05ba80ad2d3c.html +dir_21bbc5adf7d2637a4cb8a3cee979c96f.html +dir_0bf78cffa0901bd3b5cb7be7888aabc9.html +dir_c08386f3c1aee312ced83a5951d11ed6.html +dir_1460475e8e667d8c97e1be97dbcd2231.html +dir_0a6b9d10733e8fa4306fa781def1f127.html +dir_18cc01a76aedd55acdee1b7ef37dd546.html +dir_74389ed8173ad57b461b9d623a1f3867.html +dir_37618a71d99bdfed5979e976980d5eec.html +dir_b922272f3c09a4cbb928a2f2eda5adf8.html +index.html +annotated.html +classes.html +functions.html +functions_vars.html +files.html +globals.html +globals_d.html +globals_g.html +globals_l.html +globals_m.html +globals_n.html +globals_p.html +globals_s.html +globals_t.html +globals_u.html +globals_func.html +globals_func_d.html +globals_func_l.html +globals_func_m.html +globals_func_n.html +globals_func_p.html +globals_func_s.html +globals_func_t.html +globals_func_u.html +globals_vars.html +globals_type.html +globals_enum.html +globals_eval.html +globals_defs.html +tab_a.png +tab_b.png +tab_h.png +tab_s.png +nav_h.png +nav_f.png +bc_s.png +doxygen.png +closed.png +open.png +bdwn.png +sync_on.png +sync_off.png
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/index.html Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,51 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.8.11"/> +<title>PAL: Main Page</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">PAL + </div> + <div id="projectbrief">A Platform Abstraction Layer connects the mbed-client with the underlying platform.</div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.11 --> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li class="current"><a href="index.html"><span>Main Page</span></a></li> + <li><a href="annotated.html"><span>Data Structures</span></a></li> + <li><a href="files.html"><span>Files</span></a></li> + </ul> + </div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">PAL Documentation</div> </div> +</div><!--header--> +<div class="contents"> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by  <a href="http://www.doxygen.org/index.html"> +<img class="footer" src="doxygen.png" alt="doxygen"/> +</a> 1.8.11 +</small></address> +</body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/jquery.js Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,68 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery);/*! + PowerTip - v1.2.0 - 2013-04-03 + http://stevenbenner.github.com/jquery-powertip/ + Copyright (c) 2013 Steven Benner (http://stevenbenner.com/). + Released under MIT license. + https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt +*/ +(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}})); \ No newline at end of file
Binary file pal/Docs/html/nav_f.png has changed
Binary file pal/Docs/html/nav_g.png has changed
Binary file pal/Docs/html/nav_h.png has changed
Binary file pal/Docs/html/open.png has changed
Binary file pal/Docs/html/splitbar.png has changed
Binary file pal/Docs/html/sync_off.png has changed
Binary file pal/Docs/html/sync_on.png has changed
Binary file pal/Docs/html/tab_a.png has changed
Binary file pal/Docs/html/tab_b.png has changed
Binary file pal/Docs/html/tab_h.png has changed
Binary file pal/Docs/html/tab_s.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Docs/html/tabs.css Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Examples/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Jenkinsfile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,45 @@ + +try { + // Reserve an executor from node with label arm-none-eabi-gcc + node ("arm-none-eabi-gcc") { + // Ensure a clean build by deleting any previous Jenkins workarea + deleteDir() + // Add timestamps to Jenkins console log + timestamps { + env.MBEDOS_ROOT = pwd() + // Define a Jenkins stage for logging purposes + stage ("prepare environment") { + // Create a directory and execute steps there + dir ("mbed-client-pal") { + // clone the sw under test, either branch or PR depending on trigger + checkout scm + } + + dir ("mbed-os") { + git "git@github.com:ARMmbed/mbed-os" + execute ("git checkout tags/mbed-os-5.2") + } + + + // Add mbed components + execute ("mbed new .") + + // Execute shell command, edit file with sed + + + writeFile file: 'mbed-os/features/frameworks/.mbedignore', text: '*' + + } + + stage ("build") { + dir ("mbed-client-pal/Test") { + execute ("make mbedOS_all") + } + } + } + } +} catch (error) { + currentBuild.result = 'FAILURE' + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/LICENSE Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +Unless specifically indicated otherwise in a file, files are licensed +under the Apache 2.0 license, as can be found in: apache-2.0.txt \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,84 @@ +# PAL +This is the main repository for the Platform Abstraction Layer (PAL) project. + +# Releases + +In order to get the latest stable and tested code, plesae goto [releases](https://github.com/ARMmbed/mbed-client-pal/releases) +and download the required release version - each release has a comment regarding which official mbedOS version was used for +development and testing. + + +# General Use Notes + +* `pal_init()` API MUST be called before using any other PAL API, calling PAL APIs without + initialization PAL can return with initialization error. +* `pal_destroy()` API MUST ba called to free any allocated resources by PAL Modules. + + +# How To Build PAL Tests +## MbedOS + +1. Define the environment variable: `MBEDOS_ROOT` to be the father folder of "mbed-os". +2. `cd $(PAL_FOLDER)/Test/` +3. make mbedOS_all - This will build the tests for mbedOS5.2 (mbed-os-5.2)over Freescale-K64F board. +4. In order to build and run the tests over the platform please run: + + $ make mbedOS_check + +5. In order to see debug prints please send the following flag `DEBUG=1` in compilation command: + + $ make mbedOS_check DEBUG=1 + +6. In order to build single module tests please edit `$(PAL_FOLDER)/Test/makefile` + under mbedOS5.1 platform, please change the value of the `TARGET_CONFIGURATION_DEFINES` to the + desired module: (default value is for all exist modules) + + HAS_RTOS --> RTOS module APIs + HAS_SOCKET --> Networking module APIs + + + +# PAL Repository Directory structure +``` +â +âââ Build //Auto generated during build folder +â  âââ mbedOS //inncludes .a files +â  âââ obj //includes obj files +â +âââ Docs +â +âââ Examples +â +âââ Source +â  âââ PAL-Impl +â  â  âââ Modules +â  â  â  âââ Networking +â  â  â  âââ RTOS +â  â  â  âââ Update +â  â  âââ Services-API //High level Services API for mbed-client to call +â  â  âââ pal_init.c //this file contains the global PAL initialization function +â â +â  âââ Port +â  | âââ Platform-API //Low level platform oriented API for cutomer to implement +â  | âââ Reference-Impl +â  | | âââ mbedOS +â  | | | âââ Networking +â  | | | âââ RTOS +â  | | | âââ Update +â +âââ Test +â  âââ Common //contains common headers for tests +â  âââ Scripts +â  âââ Unitest //contains the Unitests source code for each module (RTOS, Update, etc) +â  âââ Unity //contains the Unity framework source code +â +âââ Utils +â âââ Scripts +â +âââ PAL MakeFile +âââ Project editor proj file +âââ PAL Master Build Script +âââ Main index Readme file + +``` +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Modules/Networking/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Modules/Networking/pal_network.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,396 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#include "pal.h" +#include "pal_network.h" +#include "pal_plat_network.h" + +typedef struct pal_in_addr { + uint32_t s_addr; // that's a 32-bit int (4 bytes) +} pal_in_addr_t; + +typedef struct pal_socketAddressInternal { + short int pal_sin_family; // address family + unsigned short int pal_sin_port; // port + pal_in_addr_t pal_sin_addr; // ipv4 address + unsigned char pal_sin_zero[8]; // +} pal_socketAddressInternal_t; + +typedef struct pal_socketAddressInternal6{ + uint16_t pal_sin6_family; // address family, + uint16_t pal_sin6_port; // port number, Network Byte Order + uint32_t pal_sin6_flowinfo; // IPv6 flow information + palIpV6Addr_t pal_sin6_addr; // IPv6 address + uint32_t pal_sin6_scope_id; // Scope ID +} pal_socketAddressInternal6_t; + + + +palStatus_t pal_registerNetworkInterface(void* networkInterfaceContext, uint32_t* interfaceIndex) +{ + palStatus_t result = PAL_SUCCESS; + result = pal_plat_RegisterNetworkInterface(networkInterfaceContext, interfaceIndex); + return result; +} + + +palStatus_t pal_setSockAddrPort(palSocketAddress_t* address, uint16_t port) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == address) + { + return PAL_ERR_RTOS_PARAMETER; + } + + if (address->addressType == PAL_AF_INET) + { + pal_socketAddressInternal_t* innerAddr = (pal_socketAddressInternal_t*)address; + innerAddr->pal_sin_port = port; + } + else if (address->addressType == PAL_AF_INET6) + { + pal_socketAddressInternal6_t * innerAddr = (pal_socketAddressInternal6_t*)address; + innerAddr->pal_sin6_port = port; + } + else + { + result = PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY; + } + + return result; +} + + +palStatus_t pal_setSockAddrIPV4Addr(palSocketAddress_t* address, palIpV4Addr_t ipV4Addr) +{ + if ((NULL == address) || (NULL == ipV4Addr)) + { + return PAL_ERR_RTOS_PARAMETER; + } + pal_socketAddressInternal_t* innerAddr = (pal_socketAddressInternal_t*)address; + innerAddr->pal_sin_family = PAL_AF_INET; + innerAddr->pal_sin_addr.s_addr = (ipV4Addr[0]) | (ipV4Addr[1] << 8) | (ipV4Addr[2] << 16) | (ipV4Addr[3] << 24); + return PAL_SUCCESS; +} + + +palStatus_t pal_setSockAddrIPV6Addr(palSocketAddress_t* address, palIpV6Addr_t ipV6Addr) +{ + int index; + + if ((NULL == address) || (NULL == ipV6Addr)) + { + return PAL_ERR_RTOS_PARAMETER; + } + pal_socketAddressInternal6_t* innerAddr = (pal_socketAddressInternal6_t*)address; + innerAddr->pal_sin6_family = PAL_AF_INET6; + for (index = 0; index < PAL_IPV6_ADDRESS_SIZE; index++) // TODO: use mem copy? + { + innerAddr->pal_sin6_addr[index] = ipV6Addr[index]; + } + return PAL_SUCCESS; +} + + +palStatus_t pal_getSockAddrIPV4Addr(const palSocketAddress_t* address, palIpV4Addr_t ipV4Addr) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == address) + { + return PAL_ERR_RTOS_PARAMETER; + } + if (address->addressType == PAL_AF_INET) + { + pal_socketAddressInternal_t* innerAddr = (pal_socketAddressInternal_t*)address; + ipV4Addr[0] = (innerAddr->pal_sin_addr.s_addr) & 0xFF; + ipV4Addr[1] = (innerAddr->pal_sin_addr.s_addr >> 8) & 0xFF; + ipV4Addr[2] = (innerAddr->pal_sin_addr.s_addr >> 16) & 0xFF; + ipV4Addr[3] = (innerAddr->pal_sin_addr.s_addr >> 24) & 0xFF; + + } + else + { + result = PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY; + } + return result; +} + + +palStatus_t pal_getSockAddrIPV6Addr(const palSocketAddress_t* address, palIpV6Addr_t ipV6Addr) +{ + palStatus_t result = PAL_SUCCESS; + int index = 0; + if (address->addressType == PAL_AF_INET6) + { + pal_socketAddressInternal6_t * innerAddr = (pal_socketAddressInternal6_t*)address; + for (index = 0; index < PAL_IPV6_ADDRESS_SIZE; index++) // TODO: use mem copy? + { + ipV6Addr[index] = innerAddr->pal_sin6_addr[index]; + } + } + else + { + result = PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY; + } + return result; +} + + +palStatus_t pal_getSockAddrPort(const palSocketAddress_t* address, uint16_t* port) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == address) || (NULL == port)) + { + return PAL_ERR_RTOS_PARAMETER; + } + + if (address->addressType == PAL_AF_INET) + { + pal_socketAddressInternal_t* innerAddr = (pal_socketAddressInternal_t*)address; + *port = innerAddr->pal_sin_port; + } + else if (address->addressType == PAL_AF_INET6) + { + pal_socketAddressInternal6_t * innerAddr = (pal_socketAddressInternal6_t*)address; + *port = innerAddr->pal_sin6_port; + } + else + { + result = PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY; + } + + return result; +} + + +palStatus_t pal_socket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palSocket_t* socket) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == socket) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_socket(domain, type, nonBlockingSocket, interfaceNum, socket); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_getSocketOptions(palSocket_t socket, palSocketOptionName_t optionName, void* optionValue, palSocketLength_t* optionLength) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == optionValue) || (NULL == optionLength)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_getSocketOptions(socket, optionName, optionValue, optionLength); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_setSocketOptions(palSocket_t socket, int optionName, const void* optionValue, palSocketLength_t optionLength) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == optionValue) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_setSocketOptions( socket, optionName, optionValue, optionLength); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_bind(palSocket_t socket, palSocketAddress_t* myAddress, palSocketLength_t addressLength) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == myAddress) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_bind(socket, myAddress, addressLength); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_receiveFrom(palSocket_t socket, void* buffer, size_t length, palSocketAddress_t* from, palSocketLength_t* fromLength, size_t* bytesReceived) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == buffer) || (NULL == bytesReceived)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_receiveFrom(socket, buffer, length, from, fromLength, bytesReceived); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_sendTo(palSocket_t socket, const void* buffer, size_t length, const palSocketAddress_t* to, palSocketLength_t toLength, size_t* bytesSent) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == buffer) || (NULL == bytesSent) || (NULL == to)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_sendTo(socket, buffer, length, to, toLength, bytesSent); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_close(palSocket_t* socket) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == socket ) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_close(socket); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_getNumberOfNetInterfaces( uint32_t* numInterfaces) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == numInterfaces) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_getNumberOfNetInterfaces(numInterfaces); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_getNetInterfaceInfo(uint32_t interfaceNum, palNetInterfaceInfo_t * interfaceInfo) +{ + palStatus_t result = PAL_SUCCESS; + + if (NULL == interfaceInfo) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_getNetInterfaceInfo(interfaceNum, interfaceInfo); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_socketMiniSelect(const palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t numberOfSockets, + pal_timeVal_t* timeout, uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t * numberOfSocketsSet) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == socketsToCheck) || (NULL == numberOfSocketsSet) || (PAL_NET_SOCKET_SELECT_MAX_SOCKETS < numberOfSockets)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_socketMiniSelect(socketsToCheck, numberOfSockets, timeout, palSocketStatus, numberOfSocketsSet); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +#if PAL_NET_TCP_AND_TLS_SUPPORT // functionality below supported only in case TCP is supported. + +palStatus_t pal_listen(palSocket_t socket, int backlog) +{ + palStatus_t result = PAL_SUCCESS; + result = pal_plat_listen(socket, backlog); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_accept(palSocket_t socket, palSocketAddress_t* address, palSocketLength_t* addressLen, palSocket_t* acceptedSocket) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == acceptedSocket) || (NULL == address)|| (NULL == addressLen)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_accept(socket, address, addressLen, acceptedSocket); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_connect(palSocket_t socket, const palSocketAddress_t* address, palSocketLength_t addressLen) +{ + palStatus_t result = PAL_SUCCESS; + if (NULL == address) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_connect( socket, address, addressLen); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_recv(palSocket_t socket, void* buf, size_t len, size_t* recievedDataSize) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == recievedDataSize) || (NULL == recievedDataSize)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_recv(socket, buf, len, recievedDataSize); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_send(palSocket_t socket, const void* buf, size_t len, size_t* sentDataSize) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == buf) || (NULL == sentDataSize)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_send( socket, buf, len, sentDataSize); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + + +#if PAL_NET_ASYNCHRONOUS_SOCKET_API + +palStatus_t pal_asynchronousSocket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palAsyncSocketCallback_t callback, palSocket_t* socket) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == socket) || (NULL == callback)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_asynchronousSocket(domain, type, nonBlockingSocket, interfaceNum, callback, socket); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + +#endif + +#if PAL_NET_DNS_SUPPORT + +palStatus_t pal_getAddressInfo(const char *url, palSocketAddress_t *address, palSocketLength_t* addressLength) +{ + palStatus_t result = PAL_SUCCESS; + if ((NULL == url) || (NULL == address) || (NULL == addressLength)) + { + return PAL_ERR_RTOS_PARAMETER; + } + result = pal_plat_getAddressInfo(url, address, addressLength); + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + +#endif + + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Modules/RTOS/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Modules/RTOS/pal_rtos.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,319 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#include "pal_rtos.h" +#include "pal_plat_rtos.h" + +#if PAL_UNIQUE_THREAD_PRIORITY +//! Threads priorities array. +uint8_t g_palThreadPriorities[PAL_MAX_NUMBER_OF_THREADS] = {0}; +#endif //PAL_UNIQUE_THREAD_PRIORITY + +void pal_osReboot(void) +{ + pal_plat_osReboot(); +} + +uint32_t pal_osKernelSysTick(void) +{ + uint32_t result; + result = pal_plat_osKernelSysTick(); + return result; +} + + +uint64_t pal_osKernelSysTick64(void) +{ + +#if PAL_RTOS_64BIT_TICK_SUPPORTED + uint64_t result; + result = pal_plat_osKernelSysTick64(); + return result; +#else + static uint64_t lastValue = 0; + static uint64_t wraparoundsDetected = 0; + const uint64_t one = 1; + uint64_t tmp = pal_plat_osKernelSysTick() + (wraparoundsDetected << 32); + if (tmp < lastValue) //erez's "wraparound algorithm" if we detect a wrap around add 1 to the higher 32 bits + { + tmp = tmp + (one << 32); + wraparoundsDetected++; + } + lastValue = tmp; + return (uint64_t)tmp; +#endif +} + +uint64_t pal_osKernelSysTickMicroSec(uint64_t microseconds) +{ + uint64_t result; + result = pal_plat_osKernelSysTickMicroSec(microseconds); + return result; +} + +uint64_t pal_osKernelSysMilliSecTick(uint64_t sysTicks) +{ + uint64_t result; + result = pal_plat_osKernelSysMilliSecTick(sysTicks); + return result; +} + +uint64_t pal_osKernelSysTickFrequency(void) +{ + uint64_t result; + result = pal_plat_osKernelSysTickFrequency(); + return result; +} + +palStatus_t pal_osThreadCreate(palThreadFuncPtr function, void* funcArgument, palThreadPriority_t priority, uint32_t stackSize, uint32_t* stackPtr, palThreadLocalStore_t* store, palThreadID_t* threadID) +{ + palStatus_t status = PAL_SUCCESS; + +#if PAL_UNIQUE_THREAD_PRIORITY + //! check if the priority have been used by other thread before + if(PAL_osPriorityError == priority) + { + status = PAL_ERR_INVALID_ARGUMENT; + } + + if ((PAL_SUCCESS == status) && (g_palThreadPriorities[priority+PRIORYT_INDEX_OFFSET])) + { + *threadID = NULLPTR; + status = PAL_ERR_RTOS_PRIORITY; + } +#endif //PAL_IGNORE_UNIQUE_THREAD_PRIORITY + + if (PAL_SUCCESS == status) + { + status = pal_plat_osThreadCreate(function, funcArgument, priority, stackSize, stackPtr, store, threadID); + } + return status; +} + +palStatus_t pal_osThreadTerminate(palThreadID_t* threadID) +{ + palStatus_t status; + status = pal_plat_osThreadTerminate(threadID); + return status; +} + +palThreadID_t pal_osThreadGetId(void) +{ + palThreadID_t result; + result = pal_plat_osThreadGetId(); + return result; +} + +void* pal_osThreadGetLocalStore(void) +{ + void* result; + result = pal_plat_osThreadGetLocalStore(); + return result; +} + +palStatus_t pal_osDelay(uint32_t milliseconds) +{ + palStatus_t status; + status = pal_plat_osDelay(milliseconds); + return status; +} + + +palStatus_t pal_osTimerCreate(palTimerFuncPtr function, void* funcArgument, palTimerType_t timerType, palTimerID_t* timerID) +{ + palStatus_t status; + status = pal_plat_osTimerCreate(function, funcArgument, timerType, timerID); + return status; +} + +palStatus_t pal_osTimerStart(palTimerID_t timerID, uint32_t millisec) +{ + palStatus_t status; + status = pal_plat_osTimerStart(timerID, millisec); + return status; +} + +palStatus_t pal_osTimerStop(palTimerID_t timerID) +{ + palStatus_t status; + status = pal_plat_osTimerStop(timerID); + return status; +} + +palStatus_t pal_osTimerDelete(palTimerID_t* timerID) +{ + palStatus_t status; + status = pal_plat_osTimerDelete(timerID); + return status; +} + +palStatus_t pal_osMutexCreate(palMutexID_t* mutexID) +{ + palStatus_t status; + status = pal_plat_osMutexCreate(mutexID); + return status; +} + +palStatus_t pal_osMutexWait(palMutexID_t mutexID, uint32_t millisec) +{ + palStatus_t status; + status = pal_plat_osMutexWait(mutexID, millisec); + return status; +} + +palStatus_t pal_osMutexRelease(palMutexID_t mutexID) +{ + palStatus_t status; + status = pal_plat_osMutexRelease(mutexID); + return status; +} + +palStatus_t pal_osMutexDelete(palMutexID_t* mutexID) +{ + palStatus_t status; + status = pal_plat_osMutexDelete(mutexID); + return status; +} +palStatus_t pal_osSemaphoreCreate(uint32_t count, palSemaphoreID_t* semaphoreID) +{ + palStatus_t status; + status = pal_plat_osSemaphoreCreate(count, semaphoreID); + return status; +} + +palStatus_t pal_osSemaphoreWait(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t* countersAvailable) +{ + palStatus_t status; + status = pal_plat_osSemaphoreWait(semaphoreID, millisec, countersAvailable); + return status; +} + +palStatus_t pal_osSemaphoreRelease(palSemaphoreID_t semaphoreID) +{ + palStatus_t status; + status = pal_plat_osSemaphoreRelease(semaphoreID); + return status; +} + +palStatus_t pal_osSemaphoreDelete(palSemaphoreID_t* semaphoreID) +{ + palStatus_t status; + status = pal_plat_osSemaphoreDelete(semaphoreID); + return status; +} + +palStatus_t pal_osPoolCreate(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t* memoryPoolID) +{ + palStatus_t status; + status = pal_plat_osPoolCreate(blockSize, blockCount, memoryPoolID); + return status; +} + +void* pal_osPoolAlloc(palMemoryPoolID_t memoryPoolID) +{ + void* result; + result = pal_plat_osPoolAlloc(memoryPoolID); + return result; +} + +void* pal_osPoolCAlloc(palMemoryPoolID_t memoryPoolID) +{ + void* result; + //TODO(nirson01): debug print in case of failed alloc? + result = pal_plat_osPoolCAlloc(memoryPoolID); + return result; +} + +palStatus_t pal_osPoolFree(palMemoryPoolID_t memoryPoolID, void* block) +{ + palStatus_t status; + //TODO(nirson01): debug print in case of failed alloc? + status = pal_plat_osPoolFree(memoryPoolID, block); + return status; +} + +palStatus_t pal_osPoolDestroy(palMemoryPoolID_t* memoryPoolID) +{ + palStatus_t status; + status = pal_plat_osPoolDestroy(memoryPoolID); + return status; +} + +palStatus_t pal_osMessageQueueCreate(uint32_t messageQSize, palMessageQID_t* messageQID) +{ + palStatus_t status; + status = pal_plat_osMessageQueueCreate(messageQSize, messageQID); + return status; +} + +palStatus_t pal_osMessagePut(palMessageQID_t messageQID, uint32_t info, uint32_t timeout) +{ + palStatus_t status; + status = pal_plat_osMessagePut(messageQID, info, timeout); + return status; +} + +palStatus_t pal_osMessageGet(palMessageQID_t messageQID, uint32_t timeout, uint32_t* messageValue) +{ + palStatus_t status; + status = pal_plat_osMessageGet(messageQID, timeout, messageValue); + return status; +} + +palStatus_t pal_osMessageQueueDestroy(palMessageQID_t* messageQID) +{ + palStatus_t status; + status = pal_plat_osMessageQueueDestroy(messageQID); + return status; +} + +int32_t pal_osAtomicIncrement(int32_t* valuePtr, int32_t increment) +{ + int32_t result; + result = pal_plat_osAtomicIncrement(valuePtr, increment); + return result; +} + + + +#ifdef DEBUG +#include "stdarg.h" +#endif + +void dbgPrintf( const char* function, uint32_t line, const char * format, ... ) +{ +#ifdef DEBUG + static palMutexID_t printfMutex = NULLPTR; + + va_list args; + if (!printfMutex) + { + pal_osMutexCreate(&printfMutex); + } + pal_osMutexWait(printfMutex, PAL_MAX_UINT32); +#ifdef VERBOSE + pal_plat_printf("%s:%ld\t",function,line); +#endif + va_start (args, format); + pal_plat_vprintf (format, args); + va_end (args); + pal_osMutexRelease(printfMutex); +#endif +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Modules/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Modules/Update/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/pal.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_H +#define _PAL_H + +#ifdef __cplusplus +extern "C" { +#endif + + +//includes for common headers in PAL +#include "pal_macros.h" +#include "pal_configuration.h" +#include "pal_errors.h" +#include "pal_types.h" + +//includes for modules headers. +#include "pal_rtos.h" +//#include "pal_socket.h" + + + +//declarations for global init and destroy of PAL + +/*! PAL initialization +* This function will call each module's initialization function (if exist) +* to allocate required resources and initiate them. +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success +* and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_init(); + +/*! PAL destruction +* This function will call each module's destroy function (if exist) +* to free resources. +*/ +void pal_destroy(); + + +#ifdef __cplusplus +} +#endif +#endif //_PAL_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/pal_configuration.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_COFIGURATION_H +#define _PAL_COFIGURATION_H + +#ifdef __cplusplus +extern "C" { +#endif + +//! pal configuration options +#define PAL_NET_TCP_AND_TLS_SUPPORT true/* add pal support for TCP */ +#define PAL_NET_ASYNCHRONOUS_SOCKET_API true/* add pal support for asynchronous sockets */ +#define PAL_NET_DNS_SUPPORT true/* add pal support for DNS lookup */ + +#define PAL_RTOS_64BIT_TICK_SUPPORTED false /* add pal support for asynchronous sockets */ +#define PAL_UNIQUE_THREAD_PRIORITY (!defined(PAL_IGNORE_UNIQUE_THREAD_PRIORITY))/* if defined code skips the uniqueness priority check */ + +//! number of valid priorities limits the number of threads- if priorities are added this value should be increased +#define PAL_MAX_NUMBER_OF_THREADS 7 + +//! the maximal number of interfaces that can be supported at once. +#define PAL_MAX_SUPORTED_NET_INTEFACES 5 + +#ifdef __GNUC__ // we are compiling using GCC/G++ + #define PAL_TARGET_POINTER_SIZE __SIZEOF_POINTER__ + #ifdef __BYTE_ORDER + #if __BYTE_ORDER == __BIG_ENDIAN //if both are not defined it is TRUE! + #define PAL_COMPILATION_ENDIANITY 1 //define pal compilation endianity (0 is little endian, 1 is big endian) + #elif __BYTE_ORDER == __LITTLE_ENDIAN + #define PAL_COMPILATION_ENDIANITY 0//define pal compilation endianity (0 is little endian, 1 is big endian) + #else + #error missing endiantiy defintion for GCC + #endif + + #endif +#else + #ifdef __arm__ // we are compiling using the ARM compiler + #define PAL_TARGET_POINTER_SIZE __sizeof_ptr + #ifdef __BIG_ENDIAN + #define PAL_COMPILATION_ENDIANITY 1 //define pal compilation endianity (0 is little endian, 1 is big endian) + #else + #define PAL_COMPILATION_ENDIANITY 0 //define pal compilation endianity (0 is little endian, 1 is big endian) + #endif + #else + //#error neither ARMCC nor GCC used for compilation - not supported + #endif + + +#endif + +#ifdef __cplusplus +} +#endif +#endif //_PAL_COFIGURATION_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/pal_errors.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_ERRORS_H +#define _PAL_ERRORS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "pal_types.h" + + +typedef enum { + PAL_ERR_MODULE_GENERAL = 0x4, + PAL_ERR_MODULE_PAL = 0x6, + PAL_ERR_MODULE_C = 0x8, + PAL_ERR_MODULE_RTOS = 0xC, + PAL_ERR_MODULE_NET = 0x10, + PAL_ERR_MODULE_TLS = 0x14, + PAL_ERR_MODULE_CRYPTO = 0x18, + PAL_ERR_MODULE_UPDATE = 0x1C, +} palErrorModules_t; + + +typedef enum { + // generic errors + PAL_ERR_GENERAL_BASE = (-1 << PAL_ERR_MODULE_GENERAL), + PAL_ERR_GENERIC_FAILURE = PAL_ERR_GENERAL_BASE, /*! generic failure*/ // try to use a more specific error message whenever possible + PAL_ERR_INVALID_ARGUMENT = PAL_ERR_GENERAL_BASE + 1, /*! one or more of the functions arguments is invalid */ + PAL_ERR_NO_MEMORY = PAL_ERR_GENERAL_BASE + 2, /*! failure due to a failed attempt to allocate memory */ + PAL_ERR_BUFFER_TOO_SMALL = PAL_ERR_GENERAL_BASE + 3, /*! buffer given is too small*/ + PAL_ERR_NOT_SUPPORTED = PAL_ERR_GENERAL_BASE + 4, /*! operation not supported by PAL for the current configuration*/ + PAL_ERR_TIMEOUT_EXPIRED = PAL_ERR_GENERAL_BASE + 5, /*! timeout for the operation has expired */ + PAL_ERR_NOT_INITIALIZED = PAL_ERR_GENERAL_BASE + 6, /*! timeout for the operation has expired */ + PAL_ERR_NULL_POINTER = PAL_ERR_GENERAL_BASE + 7, /*! received a null pointer when it should be initialized */ + PAL_ERR_CREATION_FAILED = PAL_ERR_GENERAL_BASE + 8, /*! failure in creation of given type, like: mutex, thread , etc */ + // pal errors + PAL_ERR_NOT_IMPLEMENTED = (-1 << PAL_ERR_MODULE_PAL), /*!Currently not implemented will be in the future*/ + // c errors + // RTOS errors + PAL_ERR_RTOS_ERROR_BASE = (-1 << PAL_ERR_MODULE_RTOS), /*! generic failure in RTOS module*/ // try to use a more specific error message whenever possible + PAL_ERR_RTOS_PARAMETER = PAL_ERR_RTOS_ERROR_BASE + 0x80,/*! PAL mapping of CMSIS error osErrorParameter : parameter error: a mandatory parameter was missing or specified an incorrect object.*/ + PAL_ERR_RTOS_RESOURCE = PAL_ERR_RTOS_ERROR_BASE + 0x81,/*! PAL mapping of CMSIS error osErrorResource : resource not available: a specified resource was not available.*/ + PAL_ERR_RTOS_TIMEOUT = PAL_ERR_RTOS_ERROR_BASE + 0xC1,/*! PAL mapping of CMSIS error osErrorTimeoutResource : resource not available within given time: a specified resource was not available within the timeout period*/ + PAL_ERR_RTOS_ISR = PAL_ERR_RTOS_ERROR_BASE + 0x82,/*! PAL mapping of CMSIS error osErrorISR : not allowed in ISR context: the function cannot be called from interrupt service routines.*/ + PAL_ERR_RTOS_ISR_RECURSIVE = PAL_ERR_RTOS_ERROR_BASE + 0x83,/*! PAL mapping of CMSIS error osErrorISRRecursive : function called multiple times from ISR with same object.c*/ + PAL_ERR_RTOS_PRIORITY = PAL_ERR_RTOS_ERROR_BASE + 0x84,/*! PAL mapping of CMSIS error osErrorPriority : system cannot determine priority or thread has illegal priority.*/ + PAL_ERR_RTOS_NO_MEMORY = PAL_ERR_RTOS_ERROR_BASE + 0x85,/*! PAL mapping of CMSIS error osErrorNoMemory : system is out of memory: it was impossible to allocate or reserve memory for the operation.*/ + PAL_ERR_RTOS_VALUE = PAL_ERR_RTOS_ERROR_BASE + 0x86,/*! PAL mapping of CMSIS error osErrorValue : value of a parameter is out of range.*/ + PAL_ERR_RTOS_OS = PAL_ERR_RTOS_ERROR_BASE + 0xFF,/*! PAL mapping of CMSIS error osErrorOS : unspecified RTOS error: run-time error but no other error message fits.*/ + // network errors + PAL_ERR_SOCKET_ERROR_BASE = (-1 << PAL_ERR_MODULE_NET), /*! generic socket error */ + PAL_ERR_SOCKET_GENERIC = PAL_ERR_SOCKET_ERROR_BASE, /*! generic socket error */ + PAL_ERR_SOCKET_NO_BUFFERS = PAL_ERR_SOCKET_ERROR_BASE + 1, /*! no buffers - PAL mapping of posix error ENOBUFS*/ + PAL_ERR_SOCKET_HOST_UNREACHABLE = PAL_ERR_SOCKET_ERROR_BASE + 2, /*! host unreachable (routing error)- PAL mapping of posix error EHOSTUNREACH*/ + PAL_ERR_SOCKET_IN_PROGRES = PAL_ERR_SOCKET_ERROR_BASE + 3, /*! in progress- PAL mapping of posix error EINPROGRESS*/ + PAL_ERR_SOCKET_INVALID_VALUE = PAL_ERR_SOCKET_ERROR_BASE + 4, /*!invalid value - PAL mapping of posix error EINVAL*/ + PAL_ERR_SOCKET_WOULD_BLOCK = PAL_ERR_SOCKET_ERROR_BASE + 5, /*! would block - PAL mapping of posix error EWOULDBLOCK*/ + PAL_ERR_SOCKET_ADDRESS_IN_USE = PAL_ERR_SOCKET_ERROR_BASE + 6, /*! Address in use - PAL mapping of posix error EADDRINUSE*/ + PAL_ERR_SOCKET_ALREADY_CONNECTED = PAL_ERR_SOCKET_ERROR_BASE + 7, /*! Already connected - PAL mapping of posix error EALREADY*/ + PAL_ERR_SOCKET_CONNECTION_ABORTED = PAL_ERR_SOCKET_ERROR_BASE + 8, /*! Connection aborted - PAL mapping of posix error ECONNABORTED*/ + PAL_ERR_SOCKET_CONNECTION_RESET = PAL_ERR_SOCKET_ERROR_BASE + 9, /*! Connection reset - PAL mapping of posix error ECONNRESET*/ + PAL_ERR_SOCKET_NOT_CONNECTED = PAL_ERR_SOCKET_ERROR_BASE + 10, /*! Not connected - PAL mapping of posix error ENOTCONN*/ + PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR = PAL_ERR_SOCKET_ERROR_BASE + 11, /*! I/O error PAL mapping of posix error EIO*/ + PAL_ERR_SOCKET_CONNECTION_CLOSED = PAL_ERR_SOCKET_ERROR_BASE + 12, /*! connection closed */ + PAL_ERR_SOCKET_FAILED_TO_SET_SOCKET_TO_NON_BLOCKING = PAL_ERR_SOCKET_ERROR_BASE + 13, /*! failed to set socket to non-blocking */ + PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY = PAL_ERR_SOCKET_ERROR_BASE + 14, /*! failed to set socket to non-blocking */ + PAL_ERR_SOCKET_INVALID_ADDRESS = PAL_ERR_SOCKET_ERROR_BASE + 15, /*! address given was not valid/found*/ + PAL_ERR_SOCKET_DNS_ERROR = PAL_ERR_SOCKET_ERROR_BASE + 16, /*! DNS lookup error*/ + PAL_ERR_SOCKET_HDCP_ERROR = PAL_ERR_SOCKET_ERROR_BASE + 17, /*! HDCP error*/ + PAL_ERR_SOCKET_AUTH_ERROR = PAL_ERR_SOCKET_ERROR_BASE + 18, /*! authentication error*/ + PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED = PAL_ERR_SOCKET_ERROR_BASE + 19, /*! socket option not supported*/ + //update Error + PAL_ERR_UPDATE_ERROR_BASE = (-1 << PAL_ERR_MODULE_UPDATE), /*! generic error */ + PAL_ERR_UPDATE_ERROR = PAL_ERR_UPDATE_ERROR_BASE, /*! unknown error */ + PAL_ERR_UPDATE_BUSY = PAL_ERR_UPDATE_ERROR_BASE + 1, /*! unknown error */ + PAL_ERR_UPDATE_TIMEOUT = PAL_ERR_UPDATE_ERROR_BASE + 2, /*! unknown error */ + PAL_ERR_UPDATE_OUT_OF_BOUNDS = PAL_ERR_UPDATE_ERROR_BASE + 3, /*! unknown error */ + PAL_ERR_UPDATE_PALFROM_API = PAL_ERR_UPDATE_ERROR_BASE + 4, /*! unknown error */ + PAL_ERR_UPDATE_PALFROM_IO = PAL_ERR_UPDATE_ERROR_BASE + 5, /*! unknown error */ + PAL_ERR_UPDATE_END_OF_IMAGE = PAL_ERR_UPDATE_ERROR_BASE + 6, /*! unknown error */ + PAL_ERR_UPDATE_CHUNK_TO_SMALL = PAL_ERR_UPDATE_ERROR_BASE + 7, /*! unknown error */ + +} palError_t; /*! errors returned by the pal service API */ + + +#ifdef __cplusplus +} +#endif +#endif //_PAL_ERRORS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/pal_macros.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_MACROS_H +#define _PAL_MACROS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "pal_errors.h" +// PAL success value +#define PAL_SUCCESS 0 + +// maximum integer types +#define PAL_MAX_UINT8 0xFFU +#define PAL_MAX_UINT16 0xFFFFU +#define PAL_MAX_UINT32 0xFFFFFFFFUL +#define PAL_MAX_INT32 0x7FFFFFFFL +#define PAL_MIN_INT32 0x80000000L +#define PAL_MAX_UINT64 0xFFFFFFFFFFFFFFFFULL +#define PAL_MAX_INT64 0x7FFFFFFFFFFFFFFFLL + +// useful macros + +#define PAL_MAX(a,b) ((a) > (b) ? (a) : (b)) + +#define PAL_MIN(a,b) ((a) < (b) ? (a) : (b)) + +#define PAL_DIVIDE_ROUND_UP(num, divider) (((num) + (divider) - 1) / (divider)) + +#if PAL_COMPILATION_ENDIANITY == 1 +#define BIG__ENDIAN 1 +#elif PAL_COMPILATION_ENDIANITY == 0 +#define LITTLE__ENDIAN 1 +#else +#error neither BIG__ENDIAN nor LITTLE__ENDIAN defined, cannot compile +#endif + +// endianity macros +#ifdef LITTLE__ENDIAN + +#define PAL_HTONS(x) (((((unsigned short)(x)) >> 8) & 0xff) | \ + ((((unsigned short)(x)) & 0xff) << 8)) +#define PAL_NTOHS(x) (((((unsigned short)(x)) >> 8) & 0xff) | \ + ((((unsigned short)(x)) & 0xff) << 8) ) +#define PAL_HTONL(x) ((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \ + (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L)) +#define PAL_NTOHL(x) ((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \ + (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L)) + +#elif defined(BIG__ENDIAN) + +#define PAL_HTONS(x) (x) +#define PAL_NTOHS(x) (x) +#define PAL_HTONL(x) (x) +#define PAL_NTOHL(x) (x) +#else +#error neither BIG__ENDIAN nor LITTLE__ENDIAN defined, cannot compile +#endif + + + +#define PAL_INVERSE_UINT16_BYTES( val ) \ + ( ((val) << 8) | (((val) & 0x0000FF00) >> 8)) + +#define PAL_INVERSE_UINT32_BYTES( val ) \ + ( ((val) >> 24) | (((val) & 0x00FF0000) >> 8) | (((val) & 0x0000FF00) << 8) | (((val) & 0x000000FF) << 24) ) + +#define PAL_INVERSE_UINT64_BYTES( val ) \ + ((PAL_INVERSE_UINT32_BYTES( ((val >> 16) >> 16)) &0xffffffff) | ((((uint64_t)PAL_INVERSE_UINT32_BYTES(val & 0xffffffff))<<16)<<16)) + +/* Set of Macros similar to the HTONS/L, NTOHS/L ones but converting to/from little endian instead of big endian*/ +#ifdef LITTLE__ENDIAN +#define PAL_LITTLE_ENDIAN_TO_HOST_16BIT(x) (x) +#define PAL_LITTLE_ENDIAN_TO_HOST_32BIT(x) (x) +#define PAL_LITTLE_ENDIAN_TO_HOST_64BIT(x) (x) +#define PAL_HOST_TO_LITTLE_ENDIAN_16BIT(x) (x) +#define PAL_HOST_TO_LITTLE_ENDIAN_32BIT(x) (x) +#define PAL_HOST_TO_LITTLE_ENDIAN_64BIT(x) (x) + + +#elif defined(BIG__ENDIAN) +#define PAL_LITTLE_ENDIAN_TO_HOST_16BIT(x) (PAL_INVERSE_UINT16_BYTES(((uint16_t)x))) +#define PAL_LITTLE_ENDIAN_TO_HOST_32BIT(x) (PAL_INVERSE_UINT32_BYTES(((uint32_t)x))) +#define PAL_LITTLE_ENDIAN_TO_HOST_64BIT(x) (PAL_INVERSE_UINT64_BYTES(((uint64_t)x))) +#define PAL_HOST_TO_LITTLE_ENDIAN_16BIT(x) (PAL_INVERSE_UINT16_BYTES(((uint16_t)x))) +#define PAL_HOST_TO_LITTLE_ENDIAN_32BIT(x) (PAL_INVERSE_UINT32_BYTES(((uint32_t)x))) +#define PAL_HOST_TO_LITTLE_ENDIAN_64BIT(x) (PAL_INVERSE_UINT64_BYTES(((uint64_t)x))) + +#else +#error neither BIG__ENDIAN nor LITTLE__ENDIAN defined, cannot compile +#endif + + +#define PAL_MODULE_INIT(INIT) INIT= 1 +#define PAL_MODULE_DEINIT(INIT) INIT= 0 + +#ifdef DEBUG +#include "pal.h" +#define DEBUG_PRINT(ARGS...) PAL_PRINTF(ARGS) + +#define DEBUG_PRINT(ARGS...) PAL_PRINTF(ARGS) +#define PAL_MODULE_IS_INIT(INIT) if(!INIT) return PAL_ERR_NOT_INITIALIZED; + + +#else +#define PAL_MODULE_IS_INIT(INIT) + +#define DEBUG_PRINT(ARGS...) + +#endif //DEBUG + +#ifdef __cplusplus +} +#endif +#endif //_PAL_MACROS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/pal_network.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,323 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_SOCKET_H +#define _PAL_SOCKET_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "pal.h" +//! PAL network socket API +//! pal network sockets configurations options: +//! set PAL_NET_TCP_AND_TLS_SUPPORT to true TCP is supported by the platform and is required +//! set PAL_NET_ASYNCHRONOUS_SOCKET_API to true if asynchronous socket API supported by the platform and is required : CURRENTLY MANDATORY +//! set PAL_NET_DNS_SUPPORT to true if you DNS url lookup API is supported. + +typedef uint32_t palSocketLength_t; /*! length of data */ +typedef void* palSocket_t; /*! PAL socket handle type */ + +#define PAL_NET_MAX_ADDR_SIZE 32 // check if we can make this more efficient + +typedef struct palSocketAddress { + unsigned short addressType; /*! address family for the socket*/ + char addressData[PAL_NET_MAX_ADDR_SIZE]; /*! address (based on protocol)*/ +} palSocketAddress_t; /*! address data structure with enough room to support IPV4 and IPV6*/ + +typedef struct palNetInterfaceInfo{ + char interfaceName[16]; //15 + \0 + palSocketAddress_t address; + uint32_t addressSize; +} palNetInterfaceInfo_t; + +typedef enum { + PAL_AF_UNSPEC = 0, + PAL_AF_INET = 2, /*! Internet IP Protocol */ + PAL_AF_INET6 = 10, /*! IP version 6 */ +} palSocketDomain_t;/*! network domains supported by PAL*/ + +typedef enum { +#if PAL_NET_TCP_AND_TLS_SUPPORT + PAL_SOCK_STREAM = 1, /*! stream socket */ + PAL_SOCK_STREAM_SERVER = 99, /*! stream socket */ +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + PAL_SOCK_DGRAM = 2 /*! datagram socket */ +} palSocketType_t;/*! socket types supported by PAL */ + + +typedef enum { + PAL_SO_REUSEADDR = 0x0004, /*! allow local address reuse */ +#if PAL_NET_TCP_AND_TLS_SUPPORT // socket options below supported only if TCP is supported. + PAL_SO_KEEPALIVE = 0x0008, /*! keep TCP connection open even if idle using periodic messages*/ +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + PAL_SO_SNDTIMEO = 0x1005, /*! send timeout */ + PAL_SO_RCVTIMEO = 0x1006, /*! receive timeout */ +} palSocketOptionName_t;/*! socket options supported by PAL */ + +#define PAL_NET_DEFAULT_INTERFACE 0xFFFFFFFF + +#define PAL_IPV4_ADDRESS_SIZE 4 +#define PAL_IPV6_ADDRESS_SIZE 16 + +typedef uint8_t palIpV4Addr_t[PAL_IPV4_ADDRESS_SIZE]; +typedef uint8_t palIpV6Addr_t[PAL_IPV6_ADDRESS_SIZE]; + +typedef struct pal_timeVal{ + int32_t pal_tv_sec; /*! seconds */ + int32_t pal_tv_usec; /*! microseconds */ +} pal_timeVal_t; + + +/*! Register a network interface for use with PAL sockets - must be called before other socket functions - most APIs will not work before a single interface is added. +* @param[in] networkInterfaceContext of the network interface to be added (OS specific , e.g. in MbedOS this is the NetworkInterface object pointer for the network adapter [note: we assume connect has already been called on this]) - if not available use NULL . +* @param[out] InterfaceIndex will contain the index assigned to the interface in case it has been assigned successfully. this index can be used when creating a socket to bind the socket to the interface. +\return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_registerNetworkInterface(void* networkInterfaceContext, uint32_t* interfaceIndex); + +/*! set a port to a palSocketAddress_t +* setting it can be done either directly or via the palSetSockAddrIPV4Addr or palSetSockAddrIPV6Addr functions +* @param[in,out] address the address to set +* @param[in] port the port number to set +\return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +\note for the socket to be set correctly the addressType field of the address must be set correctly. +*/ +palStatus_t pal_setSockAddrPort(palSocketAddress_t* address, uint16_t port); + +/*! set an ipV4 address to a palSocketAddress_t and also set the addressType to ipv4 +* @param[in,out] address the address to set +* @param[in] ipV4Addr the address value to set +\return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_setSockAddrIPV4Addr(palSocketAddress_t* address, palIpV4Addr_t ipV4Addr); + +/*! set an ipV6 address to a palSocketAddress_t and also set the addressType to ipv6 +* @param[in,out] address the address to set +* @param[in] ipV6Addr the address value to set +\return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_setSockAddrIPV6Addr(palSocketAddress_t* address, palIpV6Addr_t ipV6Addr); + +/*! get an ipV4 address from a palSocketAddress_t +* @param[in] address the address to set +* @param[out] ipV4Addr the address that is set in the address +\return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_getSockAddrIPV4Addr(const palSocketAddress_t* address, palIpV4Addr_t ipV4Addr); + +/*! get an ipV6 address from a palSocketAddress_t +* @param[in] address the address to set +* @param[out] ipV6Addr the address that is set in the address +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_getSockAddrIPV6Addr(const palSocketAddress_t* address, palIpV6Addr_t ipV6Addr); + +/*! get a port from a palSocketAddress_t +* @param[in] address the address to set +* @param[out] port the port that is set in the address +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_getSockAddrPort(const palSocketAddress_t* address, uint16_t* port); + +/*! get a network socket +* @param[in] domain the domain for the created socket (see palSocketDomain_t for supported types) +* @param[in] type the type for the created socket (see palSocketType_t for supported types) +* @param[in] nonBlockingSocket if true the socket created is created as non-blocking (i.e. with O_NONBLOCK set) +* @param[in] interfaceNum the number of the network interface used for this socket (info in interfaces supported via pal_getNumberOfNetInterfaces and pal_getNetInterfaceInfo ), choose PAL_NET_DEFAULT_INTERFACE for default interface. +* @param[out] socket socket is returned through this output parameter +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_socket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palSocket_t* socket); + +/*! get options for a given network socket +* @param[in] socket the socket for which to get options +* @param[in] optionName for which we are setting the option (see enum PAL_NET_SOCKET_OPTION for supported types) +* @param[out] optionValue the buffer holding the option value returned by the function +* @param[in, out] optionLength the size of the buffer provided for optionValue when calling the function after the call it will contain the length of data actually written to the optionValue buffer. +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_getSocketOptions(palSocket_t socket, palSocketOptionName_t optionName, void* optionValue, palSocketLength_t* optionLength); + +/*! set options for a given network socket +* @param[in] socket the socket for which to get options +* @param[in] optionName for which we are setting the option (see enum PAL_NET_SOCKET_OPTION for supported types) +* @param[in] optionValue the buffer holding the option value to set for the given option +* @param[in] optionLength the size of the buffer provided for optionValue +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_setSocketOptions(palSocket_t socket, int optionName, const void* optionValue, palSocketLength_t optionLength); + +/*! bind a given socket to a local address +* @param[in] socket the socket to bind +* @param[in] myAddress the address to which to bind +* @param[in] addressLength the length of the address passed in myAddress +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_bind(palSocket_t socket, palSocketAddress_t* myAddress, palSocketLength_t addressLength); + +/*! receive a payload from the given socket +* @param[in] socket the socket to receive from [we expect sockets passed to this function to be of type PAL_SOCK_DGRAM ( the implementation may support other types as well) ] +* @param[out] buffer the buffer for the payload data +* @param[in] length of the buffer for the payload data +* @param[out] from the address which sent the payload +* @param[in, out] fromLength the length of the 'from' address, after completion will contain the amount of data actually written to the from address +* @param[out] bytesReceived after the call will contain the actual amount of payload data received to the buffer +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_receiveFrom(palSocket_t socket, void* buffer, size_t length, palSocketAddress_t* from, palSocketLength_t* fromLength, size_t* bytesReceived); + +/*! send a payload to the given address using the given socket +* @param[in] socket the socket to use for sending the payload [we expect sockets passed to this function to be of type PAL_SOCK_DGRAM ( the implementation may support other types as well) ] +* @param[in] buffer the buffer for the payload data +* @param[in] length of the buffer for the payload data +* @param[in] to the address to which to payload should be sent +* @param[in] toLength the length of the 'to' address +* @param[out] bytesSent after the call will contain the actual amount of payload data sent +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_sendTo(palSocket_t socket, const void* buffer, size_t length, const palSocketAddress_t* to, palSocketLength_t toLength, size_t* bytesSent); + +/*! close a network socket +* @param[in,out] socket release and zero socket pointed to by given pointer. +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +\note recieves palSocket_t* and not palSocket_t so that it can zero the socket to avoid re-use. +*/ +palStatus_t pal_close(palSocket_t* socket); + +/*! get the number of current network interfaces +* @param[out] numInterfaces will hold the number of interfaces after a successful call +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_getNumberOfNetInterfaces(uint32_t* numInterfaces); + +/*! get information regarding the socket at the index/interface number given (this number is returned when registering the socket) +* @param[in] interfaceNum the number of the interface to get information for. +* @param[out] interfaceInfo will be set to the information for the given interface number. +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_getNetInterfaceInfo(uint32_t interfaceNum, palNetInterfaceInfo_t* interfaceInfo); + + +#define PAL_NET_SOCKET_SELECT_MAX_SOCKETS 8 +#define PAL_NET_SOCKET_SELECT_RX_BIT (1) +#define PAL_NET_SOCKET_SELECT_TX_BIT (2) +#define PAL_NET_SOCKET_SELECT_ERR_BIT (4) + +#define PAL_NET_SELECT_IS_RX(socketStatus, index) ((socketStatus[index] | PAL_NET_SOCKET_SELECT_RX_BIT) != 0) /*! check if RX bit is set in select result for a given socket index*/ +#define PAL_NET_SELECT_IS_TX(socketStatus, index) ((socketStatus[index] | PAL_NET_SOCKET_SELECT_TX_BIT) != 0) /*! check if TX bit is set in select result for a given socket index*/ +#define PAL_NET_SELECT_IS_ERR(socketStatus, index) ((socketStatus[index] | PAL_NET_SOCKET_SELECT_ERR_BIT) != 0) /*! check if ERR bit is set in select result for a given socket index*/ + +/*! check if one or more (up to PAL_NET_SOCKET_SELECT_MAX_SOCKETS) sockets given has data available for reading/writing/error, the function will block until data is available for one of the given sockets or the timeout expires. +To use the function: set the sockets you want to check in the socketsToCheck array and set a timeout, when it returns the socketStatus output will indicate the status of each socket passed in. +* @param[in] socketsToCheck on input: the array of up to 8 sockets handles to check. +* @param[in] numberOfSockets the number of sockets set in the input socketsToCheck array. +* @param[in] timeout the amount of time till timeout if no socket activity is detected +* @param[out] socketStatus will provide information on each socket in the input array indicating which event was set (none, rx, tx, err) check for desired event using macros. +* @param[out] numberOfSocketsSet is the total number of sockets set in all three data sets (tx, rx, err)after the function completes +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +\note the entry in index x in the socketStatus array corresponds to the socket at index x in the sockets to check array. +*/ +palStatus_t pal_socketMiniSelect(const palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t numberOfSockets, pal_timeVal_t* timeout, + uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t* numberOfSocketsSet); + + +#if PAL_NET_TCP_AND_TLS_SUPPORT // functionality below supported only in case TCP is supported. + + +/*! use given socket to listed for incoming connections, may also limit queue of incoming connections. +* @param[in] socket the socket to listen on [we expect sockets passed to this function to be of type PAL_SOCK_STREAM_SERVER ( the implementation may support other types as well) ] +* @param[in] backlog the amount connections of pending connections which can be saved for the socket +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_listen(palSocket_t socket, int backlog); + +/*! accept a connection on the given socket +* @param[in] socket the socket on which to accept the connection (prerequisite: socket already created and bind and listen have been called on it ) [we expect sockets passed to this function to be of type PAL_SOCK_STREAM_SERVER ( the implementation may support other types as well) ] +* @param[out] address the source address of the incoming connection +* @param[in, out] addressLen the length of the address field on input, the length of the data returned on output. +* @param[out] acceptedSocket the socket of the accepted connection will be returned here if connection accepted successfully. + +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_accept(palSocket_t socket, palSocketAddress_t* address, palSocketLength_t* addressLen, palSocket_t* acceptedSocket); + +/*! open a connection from the given socket to the given address +* @param[in] socket the socket to use for connection to the given address [we expect sockets passed to this function to be of type PAL_SOCK_STREAM ( the implementation may support other types as well) ] +* @param[in] address the destination address of the connection +* @param[in] addressLen the length of the address field +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_connect(palSocket_t socket, const palSocketAddress_t* address, palSocketLength_t addressLen); + +/*! receive data from the given connected socket +* @param[in] socket the connected socket on which to receive data [we expect sockets passed to this function to be of type PAL_SOCK_STREAM ( the implementation may support other types as well) ] +* @param[out] buf the output buffer for the message data +* @param[in] len the length of the input data buffer +* @param[out] recievedDataSize the length of the data actually received +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_recv(palSocket_t socket, void* buf, size_t len, size_t* recievedDataSize); + +/*! send a given buffer via the given connected socket +* @param[in] socket the connected socket on which to send data [we expect sockets passed to this function to be of type PAL_SOCK_STREAM ( the implementation may support other types as well) ] +* @param[in] buf the output buffer for the message data +* @param[in] len the length of the input data buffer +* @param[out] sentDataSize the length of the data sent +\return the function returns the status as in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_send(palSocket_t socket, const void* buf, size_t len, size_t* sentDataSize); + + +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + + +#if PAL_NET_ASYNCHRONOUS_SOCKET_API + +/*! callback function called when an even happens an asynchronous socket for which it was set using the pal_asynchronousSocket. +*/ +typedef void(*palAsyncSocketCallback_t)(); + +/*! get an asynchronous network socket +* @param[in] domain the domain for the created socket (see enum palSocketDomain_t for supported types) +* @param[in] type the type for the created socket (see enum palSocketType_t for supported types) +* @param[in] nonBlockingSocket if true the socket created is created as non-blocking (i.e. with O_NONBLOCK set) +* @param[in] interfaceNum the number of the network interface used for this socket (info in interfaces supported via pal_getNumberOfNetInterfaces and pal_getNetInterfaceInfo ), choose PAL_NET_DEFAULT_INTERFACE for default interface. +* @param[in] callback a callback function that will be called when any supported event happens to the given asynchronous socket (see palAsyncSocketCallbackType enum for the types of events supported) +* @param[out] socket socket is returned through this output parameter +\return the function returns the status in the form of PalStatus_t which will be PAL_SUCCESS (0) in case of success or a specific negative error code in case of failure +*/ +palStatus_t pal_asynchronousSocket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palAsyncSocketCallback_t callback, palSocket_t* socket); + +#endif + +#if PAL_NET_DNS_SUPPORT + +/*! this function will translate from a URL to a palSocketAddress_t which can be used with pal sockets. It supports both IP address as strings and URLs (using DNS lookup). +* @param[in] url the URL (or IP address sting) to be translated into a palSocketAddress_t. +* @param[out] address the address for the output of the translation. +*/ +palStatus_t pal_getAddressInfo(const char* url, palSocketAddress_t* address, palSocketLength_t* addressLength); + +#endif + +#ifdef __cplusplus +} +#endif +#endif //_PAL_SOCKET_H + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/pal_rtos.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,397 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_RTOS_H +#define _PAL_RTOS_H + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#include "pal_macros.h" +#include "pal_types.h" + +//! Wait forever define. used for Semaphores and Mutexes +#define PAL_RTOS_WAIT_FOREVER PAL_MAX_UINT32 + +//! Primitives IDs types declarations +typedef uintptr_t palThreadID_t; +typedef uintptr_t palTimerID_t; +typedef uintptr_t palMutexID_t; +typedef uintptr_t palSemaphoreID_t; +typedef uintptr_t palMemoryPoolID_t; +typedef uintptr_t palMessageQID_t; + +//! Timers types supported in PAL +typedef enum palTimerType { + palOsTimerOnce = 0, /*! One shot timer*/ + palOsTimerPeriodic = 1 /*! Periodic (repeating) timer*/ +} palTimerType_t; + +//! PAL timer function prototype +typedef void(*palTimerFuncPtr)(void const *funcArgument); + +//! PAL thread function prototype +typedef void(*palThreadFuncPtr)(void const *funcArgument); + +//! Available priorities in PAL implementation, each priority can appear only once. +typedef enum pal_osPriority { + PAL_osPriorityIdle = -3, + PAL_osPriorityLow = -2, + PAL_osPriorityBelowNormal = -1, + PAL_osPriorityNormal = 0, + PAL_osPriorityAboveNormal = +1, + PAL_osPriorityHigh = +2, + PAL_osPriorityRealtime = +3, + PAL_osPriorityError = 0x84 +} palThreadPriority_t; /*! Thread priority levels for PAL threads - each thread must have a different priority*/ + +//! Thread Local Store struct. +//! Can be used to hold: State, configurations and etc inside the thread. +typedef struct pal_threadLocalStore{ + void* storeData; +} palThreadLocalStore_t; + +//------- system general functions +/*! Initiates a system reboot +*/ +void pal_osReboot(void); + +//------- system tick functions +/*! Get the RTOS kernel system timer counter. +* \note this counter will wrap around very often (e.g. once every 42 sec for 100Mhz) +* \return the RTOS kernel system timer counter +*/ +uint32_t pal_osKernelSysTick(void); + +/*! Get the RTOS kernel system timer counter. +* \return the RTOS kernel system timer counter +*/ +uint64_t pal_osKernelSysTick64(void); + +/*! Converts value from microseconds to kernel sys tick +* +* @param[in] microseconds the amount of microseconds to convert into system ticks +* +* \return converted value in system ticks +*/ +uint64_t pal_osKernelSysTickMicroSec(uint64_t microseconds); + +/*! Converts value from kernel system ticks to milliseconds. +* +* @param[in] sysTicks the amount of kernel system ticks to convert into millieseconds +* +* \return converted value in system ticks +*/ +uint64_t pal_osKernelSysMilliSecTick(uint64_t sysTicks); + +/*! Get the system tick frequency +* \return the system tick frequency +*/ +uint64_t pal_osKernelSysTickFrequency(void); + +/*! Creates and starts thread function. +* +* @param[in] function: function pointer to the thread callback function. +* @param[in] funcArgument: argument for the thread function. +* @param[in] priority: priotity of the thread. +* @param[in] stackSize: the stack size of the thread can NOT be 0. +* @param[in] stackPtr: pointer to the thread's stack can NOT be NULL. +* @param[in] store: pointer to thread's local sotre, can be NULL. +* @param[out] threadID: holds the created thread ID handle - zero value indecates an error. +* +* \return PAL_SUCCESS when thread created successfully. +* PAL_ERR_RTOS_PRIORITY : the given priority already used before in the system. +* +* \note Each thread MUST be with unique priority. +* \note When the priority of the created thread function is higher than the current running thread, the +* created thread function starts instantly and becomes the new running thread. +*/ +palStatus_t pal_osThreadCreate(palThreadFuncPtr function, void* funcArgument, palThreadPriority_t priority, uint32_t stackSize, uint32_t* stackPtr, palThreadLocalStore_t* store, palThreadID_t* threadID); + + +/*! Terminates and free allocated data for the thread. +* +* @param[in] threadID: thread ID to stop and terminate. +* +* \return palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +* PAL_ERR_RTOS_RESOURCE: if the thread ID is not correct. +*/ +palStatus_t pal_osThreadTerminate(palThreadID_t* threadID); + +/*! Get ID of the current thread +* \return the ID of the current thread - in case of error return PAL_MAX_UINT32 +* \note for thread with Real Time priority the function will always return PAL_MAX_UINT32 +*/ +palThreadID_t pal_osThreadGetId(void); + +/*! Get the storage of current thread +* \return the storage of the current thread */ +void* pal_osThreadGetLocalStore(void); + +/*! Wait for a specified time period in milliseconds. +* +* @param[in] milliseconds the amount of milliseconds to wait before proceeding. +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osDelay(uint32_t milliseconds); + +/*! Creates a Timer. +* +* @param[in] function: function pointer to the timer callback function. +* @param[in] funcArgument: funcArgument for the timer callback function. +* @param[in] timerType: timer type to be created - (periodic or oneShot). +* @param[out] timerID: holds the created timer ID handle - zero value indecates an error. +* +* \return PAL_SUCCESS when timer created successfully. +* PAL_ERR_NO_MEMORY: no memory resource available to create timer object. +* +* \note the timer function runs according to the platform resources of stack-size and priority. +*/ +palStatus_t pal_osTimerCreate(palTimerFuncPtr function, void* funcArgument, palTimerType_t timerType, palTimerID_t* timerID); + +/*! Start or restart a timer. +* +* @param[in] timerID the handle for the timer to start +* @param[in] millisec the amount of time in milliseconds to set the timer to. +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osTimerStart(palTimerID_t timerID, uint32_t millisec); + +/*! Stop a timer. +* @param[in] timerID the handle for the timer to stop +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osTimerStop(palTimerID_t timerID); + +/*! Delete the timer object +* +* @param[inout] timerID: the handle for the timer to delete, in success:(*timerID = NULL). +* +* \return PAL_SUCCESS when timer deleted successfully. +* PAL_ERR_RTOS_PARAMETER when timerID is incorrect. +*/ +palStatus_t pal_osTimerDelete(palTimerID_t* timerID); + +/*! Create and initialize Mutex object +* +* @param[out] mutexID: holds the created mutex ID handle - zero value indecates an error. +* +* \return PAL_SUCCESS when mutex created successfully. +* PAL_ERR_NO_MEMORY: no memory resource available to create mutex object. +*/ +palStatus_t pal_osMutexCreate(palMutexID_t* mutexID); + +/*! Wait until a Mutex becomes available. +* +* @param[in] mutexID the handle for the mutex +* @param[in] millisec the timeout for the waiting operation if the + timeout expires before the semaphore is released and + error will be returned from the function, PAL_RTOS_WAIT_FOREVER can be used. +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and one of the following error codes in case of failure: +* PAL_ERR_RTOS_RESOURCE - mutex not avaialbe but no time out set. +* PAL_ERR_RTOS_TIMEOUT - mutex was not available until timeout expired. +* PAL_ERR_RTOS_PARAMETER - mutex id is invalid +* PAL_ERR_RTOS_ISR - cannot be called from interrupt service routines +*/ +palStatus_t pal_osMutexWait(palMutexID_t mutexID, uint32_t millisec); + +/*! Release a Mutex that was obtained by osMutexWait. +* +* @param[in] mutexID the handle for the mutex +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osMutexRelease(palMutexID_t mutexID); + +/*!Delete a Mutex object. +* +* @param[inout] mutexID: Mutex handle to delete, in success:(*mutexID = NULL). +* +* \return PAL_SUCCESS when mutex deleted successfully. +* PAL_ERR_RTOS_RESOURCE - mutex already released. +* PAL_ERR_RTOS_PARAMETER - mutex id is invalid. +* PAL_ERR_RTOS_ISR - cannot be called from interrupt service routines. +* \note After this call the mutex_id is no longer valid and cannot be used. +*/ +palStatus_t pal_osMutexDelete(palMutexID_t* mutexID); + +/*! Create and initialize a Semaphore object +* +* @param[in] count: number of available resources +* @param[out] semaphoreID: holds the created semaphore ID handle - zero value indecates an error. +* +* \return PAL_SUCCESS when semaphore created successfully. +* PAL_ERR_NO_MEMORY: no memory resource available to create semaphore object. +*/ +palStatus_t pal_osSemaphoreCreate(uint32_t count, palSemaphoreID_t* semaphoreID); + +/*! Wait until a Semaphore token becomes available. +* +* @param[in] semaphoreID the handle for the semaphore +* @param[in] millisec the timeout for the waiting operation if the timeout + expires before the semaphore is released and error will be + returned from the function, PAL_RTOS_WAIT_FOREVER can be used. +* @param[out] counteresAvailable the number of semaphore available at the call if semaphore is available, if semaphore was not available (timeout/error) zero is returned. +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and one of the following error codes in case of failure: +* PAL_ERR_RTOS_TIMEOUT - semaphore was not available until timeout expired. +* PAL_ERR_RTOS_PARAMETER - semaphore id is invalid. +*/ +palStatus_t pal_osSemaphoreWait(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t* countersAvailable); + +/*! Release a Semaphore token. +* +* @param[in] semaphoreID the handle for the semaphore +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osSemaphoreRelease(palSemaphoreID_t semaphoreID); + +/*! Delete a Semaphore object +* +* @param[inout] semaphoreID: Semaphore handle to delete, in success:(*semaphoreID = NULL). +* +* \return PAL_SUCCESS when semaphore deleted successfully. +* PAL_ERR_RTOS_RESOURCE - semaphore already released. +* PAL_ERR_RTOS_PARAMETER - semaphore id is invalid. +* \note After this call the semaphore_id is no longer valid and cannot be used. +*/ +palStatus_t pal_osSemaphoreDelete(palSemaphoreID_t* semaphoreID); + +/*! Create and initialize a memory pool. +* +* @param[in] blockSize: size of single block in bytes. +* @param[in] blockCount: maximum number of blocks in memory pool. +* @param[out] memoryPoolID: holds the created memory pool ID handle - zero value indecates an error. +* +* \return PAL_SUCCESS when memory pool created successfully. +* PAL_ERR_NO_MEMORY: no memory resource available to create memory pool object. +*/ +palStatus_t pal_osPoolCreate(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t* memoryPoolID); + +/*! Allocate a single memory block from a memory pool. +* +* @param[in] memoryPoolID the handle for the memory pool +* +* \return the function returns a pointer to a single allocated memory from the pool or NULL in case of failure. +*/ +void* pal_osPoolAlloc(palMemoryPoolID_t memoryPoolID); + +/*! Allocate a single memory block from a memory pool and set memory block to zero. +* +* @param[in] memoryPoolID the handle for the memory pool +* +* \return the function returns a pointer to a single allocated memory from the pool or NULL in case of failure. +*/ +void* pal_osPoolCAlloc(palMemoryPoolID_t memoryPoolID); + +/*! Return an memoryPoolID memory block back to a specific memory pool. +* +* @param[in] memoryPoolHandle the handle for the memory pool +* @param[in] block the block to free +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osPoolFree(palMemoryPoolID_t memoryPoolID, void* block); + +/*! Delete a memory pool object. +* +* @param[inout] memoryPoolID the handle for the memory pool, in success:(*memoryPoolID = NULL). +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osPoolDestroy(palMemoryPoolID_t* memoryPoolID); + + +/*! Create and initialize a message queue. +* +* @param[in] messageQSize: size of the message queue. +* @param[out] memoryPoolID: holds the created memory pool ID handle - zero value indecates an error. +* +* \return PAL_SUCCESS when message queue created successfully. +* PAL_ERR_NO_MEMORY: no memory resource available to create message queue object. +*/ +palStatus_t pal_osMessageQueueCreate(uint32_t messageQSize, palMessageQID_t* messageQID); + +/*! Put a Message to a Queue. +* +* @param[in] messageQID the handle for the memory pool +* @param[in] info the data to send +* @param[in] timeout timeout in milliseconds +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osMessagePut(palMessageQID_t messageQID, uint32_t info, uint32_t timeout); + +/*! Get a Message or Wait for a Message from a Queue. +* +* @param[in] messageQID the handle for the memory pool +* @param[in] timeout timeout in milliseconds +* @param[out] event the data to send +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and one of the following error codes in case of failure: +* PAL_ERR_RTOS_RESOURCE - in case semaphore was not available but not due to time out. +* PAL_ERR_RTOS_TIMEOUT - no message arrived during the timeout period. +* PAL_ERR_RTOS_RESOURCE - no message received and there was no timeout +*/ +palStatus_t pal_osMessageGet(palMessageQID_t messageQID, uint32_t timeout, uint32_t* messageValue); + +/*! Delete a message queue object. +* +* @param[inout] messageQID the handle for the message queue, in success:(*messageQID = NULL). +* +* \return the function returns the status in the form of palStatus_t which will be PAL_SUCCESS(0) in case of success and another negative value indicating a specific error code in case of failure +*/ +palStatus_t pal_osMessageQueueDestroy(palMessageQID_t* messageQID); + +/*! Perform an atomic increment for a signed32 bit value +* +* @param[in,out] valuePtr the address of the value to increment +* @param[int] increment the amount by which to increment +* +* \returns the function returns the value of the valuePtr after the increment operation. +*/ +int32_t pal_osAtomicIncrement(int32_t* valuePtr, int32_t increment); + + + + +/*! Printf like function with prefix of function and line. +* +* @param[in] function name of the current function +* @param[in] line line number to be printed +* @param[in] format print format (just like printf) +* +* \returns the function returns the value of the valuePtr after the increment operation. +*/ +void dbgPrintf( const char* function, uint32_t line, const char * format, ... ); + +#define PAL_PRINTF( ARGS...) \ + dbgPrintf(__FUNCTION__,__LINE__, ARGS); + + + + + +#ifdef __cplusplus +} +#endif +#endif //_PAL_RTOS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/Services-API/pal_types.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_TYPES_H +#define _PAL_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif +#include <stdint.h> +#include <stdbool.h> +#include <stddef.h> + +#define PAL_SUCCESS 0 +#define NULLPTR 0 + +typedef int32_t palStatus_t; + + +typedef struct _palBuffer_t +{ + uint32_t maxBufferLength; + uint32_t bufferLength; + uint8_t *buffer; +} palBuffer_t; + +typedef struct _palConstBuffer_t +{ + const uint32_t maxBufferLength; + const uint32_t bufferLength; + const uint8_t *buffer; +} palConstBuffer_t; + +#ifdef __cplusplus +} +#endif +#endif //_PAL_TYPES_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/PAL-Impl/pal_init.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#include "pal.h" +#include "pal_plat_rtos.h" +#include "pal_plat_network.h" +#include "pal_macros.h" + +//this variable must be a int32_t for using atomic increment +static int32_t g_palIntialized = 0; + + +palStatus_t pal_init() +{ + + palStatus_t status = PAL_SUCCESS; + int32_t currentInitValue; + // get the return value of g_palIntialized+1 to save it locally + currentInitValue = pal_osAtomicIncrement(&g_palIntialized,1); + // if increased for the 1st time + if (1 == currentInitValue) + { + DEBUG_PRINT("Init for the 1st time, initializing the modules\r\n"); + status = pal_plat_RTOSInitialize(NULL); + if (PAL_SUCCESS == status) + { + + status = pal_plat_socketsInit(NULL); + if (PAL_SUCCESS != status) + { + DEBUG_PRINT("init of network module has failed with status %d\r\n",status); + } + } + else + { + DEBUG_PRINT("init of RTOS module has failed with status %d\r\n",status); + } + } + // if failed decrees the value of g_palIntialized + if (PAL_SUCCESS != status) + { + pal_plat_socketsTerminate(NULL); + pal_plat_RTOSDestroy(); + pal_osAtomicIncrement(&g_palIntialized, -1); + } + return status; +} + + +void pal_destroy() +{ + int32_t currentInitValue; + // get the current value of g_palIntialized locally + currentInitValue = pal_osAtomicIncrement(&g_palIntialized, -1); + if (0 == currentInitValue) + { + DEBUG_PRINT("Destroying modules\r\n"); + pal_plat_RTOSDestroy(); + pal_plat_socketsTerminate(NULL); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Platform-API/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Platform-API/pal_plat_network.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_PLAT_SOCKET_H +#define _PAL_PLAT_SOCKET_H + +#include "pal.h" +#include "pal_network.h" + +#ifdef __cplusplus +extern "C" { +#endif + +//! PAL network socket API +//! PAL network sockets configurations options: +//! define PAL_NET_TCP_AND_TLS_SUPPORT if TCP is supported by the platform and is required. +//! define PAL_NET_ASYNCHRONOUS_SOCKET_API if asynchronous socket API is supported by the platform. Currently MANDATORY. +//! define PAL_NET_DNS_SUPPORT if DNS name resolution is supported. + +/*! Initialize sockets - must be called before other socket functions (is called from PAL init). +* @param[in] context Optional context - if not available/applicable use NULL. +\return The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_socketsInit(void* context); + +/*! Register a network interface for use with PAL sockets - must be called before other socket functions - most APIs will not work before a single interface is added. +* @param[in] networkInterfaceContext The context of the network interface to be added (OS specific. In mbed OS, this is the NetworkInterface object pointer for the network adapter [note: we assume connect has already been called on this]). - if not available use NULL (may not be required on some OSs). +* @param[out] interfaceIndex Contains the index assigned to the interface in case it has been assigned successfully. This index can be used when creating a socket to bind the socket to the interface. +\return The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_RegisterNetworkInterface(void* networkInterfaceContext, uint32_t* interfaceIndex); + +/*! Initialize terminate - can be called when sockets are no longer needed to free socket resources allocated by init. +* @param[in] context Optional context - if not available use NULL. +\return The status in the form of palStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_socketsTerminate(void* context); + +/*! Get a network socket. +* @param[in] domain The domain of the created socket (see palSocketDomain_t for supported types). +* @param[in] type The type of the created socket (see palSocketType_t for supported types). +* @param[in] nonBlockingSocket If true, the socket is non-blocking (with O_NONBLOCK set). +* @param[in] interfaceNum The number of the network interface used for this socket (info in interfaces supported via pal_getNumberOfNetInterfaces and pal_getNetInterfaceInfo ), choose PAL_NET_DEFAULT_INTERFACE for default interface. +* @param[out] socket The socket is returned through this output parameter. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_socket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palSocket_t* socket); + +/*! Get options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). +* @param[in] socket The socket for which to get options. +* @param[in] optionName The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). +* @param[out] optionValue The buffer holding the option value returned by the function. +* @param[in, out] optionLength The size of the buffer provided for optionValue when calling the function. After the call, it contains the length of data actually written to the optionValue buffer. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_getSocketOptions(palSocket_t socket, palSocketOptionName_t optionName, void* optionValue, palSocketLength_t* optionLength); + +/*! Set options for a given network socket. Only a few options are supported (see palSocketOptionName_t for supported options). +* @param[in] socket The socket for which to get options. +* @param[in] optionName The name for which to set the option (see enum PAL_NET_SOCKET_OPTION for supported types). +* @param[in] optionValue The buffer holding the option value to set for the given option. +* @param[in] optionLength The size of the buffer provided for optionValue. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_setSocketOptions(palSocket_t socket, int optionName, const void* optionValue, palSocketLength_t optionLength); + +/*! Bind a given socket to a local address. +* @param[in] socket The socket to bind. +* @param[in] myAddress The address to bind to. +* @param[in] addressLength The length of the address passed in myAddress. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_bind(palSocket_t socket, palSocketAddress_t* myAddress, palSocketLength_t addressLength); + +/*! Receive a payload from the given socket. +* @param[in] socket The socket to receive from [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. +* @param[out] buffer The buffer for the payload data. +* @param[in] length The length of the buffer for the payload data. +* @param[out] from The address that sent the payload [optional - if not required pass NULL]. +* @param[in, out] fromLength The length of the 'from' address. When completed, this contains the amount of data actually written to the from address [optional - if not required pass NULL]. +* @param[out] bytesReceived The actual amount of payload data received to the buffer. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_receiveFrom(palSocket_t socket, void* buffer, size_t length, palSocketAddress_t* from, palSocketLength_t* fromLength, size_t* bytesReceived); + +/*! Send a payload to the given address using the given socket. +* @param[in] socket The socket to use for sending the payload [sockets passed to this function should be of type PAL_SOCK_DGRAM (the implementation may support other types as well)]. +* @param[in] buffer The buffer for the payload data. +* @param[in] length The length of the buffer for the payload data. +* @param[in] to The address to which the payload should be sent. +* @param[in] toLength The length of the 'to' address. +* @param[out] bytesSent The actual amount of payload data sent. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_sendTo(palSocket_t socket, const void* buffer, size_t length, const palSocketAddress_t* to, palSocketLength_t toLength, size_t* bytesSent); + +/*! Close a network socket. +* NOTE: recieves palSocket_t* and not palSocket_t so that it can zero the socket to avoid re-use. +* @param[in,out] socket Release and zero socket pointed to by given pointer. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_close(palSocket_t* socket); + +/*! Get the number of current network interfaces (interfaces that have been registered through). +* @param[out] numInterfaces The number of interfaces after a successful call. +\return The status as in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_getNumberOfNetInterfaces(uint32_t* numInterfaces); + +/*! Get information regarding the socket at the index/interface number given (this number is returned when registering the socket). +* @param[in] interfaceNum The number of the interface to get information for. +* @param[out] interfaceInfo The information for the given interface number. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_getNetInterfaceInfo(uint32_t interfaceNum, palNetInterfaceInfo_t* interfaceInfo); + + +/*! Check if one or more (up to PAL_NET_SOCKET_SELECT_MAX_SOCKETS) sockets has data available for reading/writing/error. The function blocks until data is available for one of the given sockets or the timeout expires. +To use the function, set the sockets you want to check in the socketsToCheck array and set a timeout. When it returns the socketStatus output inidcates the status of each socket passed in. +Note: The entry in index x in the socketStatus array corresponds to the socket at index x in the sockets to check array. +* @param[in] socketsToCheck The array of up to 8 socket handles to check. +* @param[in] numberOfSockets The number of sockets set in the input socketsToCheck array. +* @param[in] timeout The time until timeout if no socket activity is detected. +* @param[out] palSocketStatus Information on each socket in the input array indicating which event was set (none, rx, tx, err). Check for a desired event using macros. +* @param[out] numberOfSocketsSet The total number of sockets set in all three data sets (tx, rx, err) after a completed function. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_socketMiniSelect(const palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t numberOfSockets, pal_timeVal_t* timeout, + uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t * numberOfSocketsSet); + + +#if PAL_NET_TCP_AND_TLS_SUPPORT // functionality below supported only in case TCP is supported. + + +/*! Use a socket to listen to incoming connections. You may also limit the queue of incoming connections. +* @param[in] socket The socket to listen to [sockets passed to this function should be of type PAL_SOCK_STREAM_SERVER (the implementation may support other types as well)]. +* @param[in] backlog The number of pending connections that can be saved for the socket. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_listen(palSocket_t socket, int backlog); + +/*! Accept a connection on the given socket. +* @param[in] socket The socket on which to accept the connection. The socket needs to be created and bound and listen must have been called on it. [sockets passed to this function should be of type PAL_SOCK_STREAM_SERVER (the implementation may support other types as well)]. +* @param[out] address The source address of the incoming connection. +* @param[in, out] addressLen The length of the address field on input, the length of the data returned on output. +* @param[out] acceptedSocket The socket of the accepted connection is returned if the connection is accepted successfully. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_accept(palSocket_t socket, palSocketAddress_t* address, palSocketLength_t* addressLen, palSocket_t* acceptedSocket); + +/*! Open a connection from the given socket to the given address. +* @param[in] socket The socket to use for the connection to the given address [sockets passed to this function should be of type PAL_SOCK_STREAM (the implementation may support other types as well)]. +* @param[in] address The destination address of the connection. +* @param[in] addressLen The length of the address field. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_connect(palSocket_t socket, const palSocketAddress_t* address, palSocketLength_t addressLen); + +/*! Receive data from the given connected socket. +* @param[in] socket The connected socket on which to receive data [sockets passed to this function should be of type PAL_SOCK_STREAM (the implementation may support other types as well)]. +* @param[out] buf The output buffer for the message data. +* @param[in] len The length of the input data buffer. +* @param[out] recievedDataSize The length of the data actually received. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_recv(palSocket_t socket, void* buf, size_t len, size_t* recievedDataSize); + +/*! Send a given buffer via the given connected socket. +* @param[in] socket The connected socket on which to send data [sockets passed to this function should be of type PAL_SOCK_STREAM (the implementation may support other types as well)]. +* @param[in] buf The output buffer for the message data. +* @param[in] len The length of the input data buffer. +* @param[out] sentDataSize The length of the data sent. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_send(palSocket_t socket, const void* buf, size_t len, size_t* sentDataSize); + + +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + + +#if PAL_NET_ASYNCHRONOUS_SOCKET_API + +/*! Get an asynchronous network socket. +* @param[in] domain The domain of the created socket (see enum palSocketDomain_t for supported types). +* @param[in] type The type of the created socket (see enum palSocketType_t for supported types). +* @param[in] callback A callback function that is called when any supported event takes place in the given asynchronous socket (see palAsyncSocketCallbackType enum for the supported event types). +* @param[out] socket This output parameter returns the socket. +\return The status in the form of PalStatus_t; PAL_SUCCESS (0) in case of success, a specific negative error code in case of failure. +*/ +palStatus_t pal_plat_asynchronousSocket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palAsyncSocketCallback_t callback, palSocket_t* socket); + +#endif + +#if PAL_NET_DNS_SUPPORT + +/*! This function translates the URL to a palSocketAddress_t that can be used with PAL sockets. +* @param[in] url The URL to be translated to a palSocketAddress_t. +* @param[out] address The address for the output of the translation. +*/ +palStatus_t pal_plat_getAddressInfo(const char* url, palSocketAddress_t* address, palSocketLength_t* addressLength); + +#endif + + +#ifdef __cplusplus +} +#endif +#endif //_PAL_PLAT_SOCKET_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Platform-API/pal_plat_rtos.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,374 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#ifndef _PAL_PLAT_RTOS_H +#define _PAL_PLAT_RTOS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "pal_rtos.h" +#include "pal_configuration.h" +#include "pal_types.h" + +#if PAL_UNIQUE_THREAD_PRIORITY +//! This array holds a counter for each thread priority. +//! If the counter is more than 1, it means that more than +//! one thread has the same priority and this is a forbidden +//! situation. The mapping between the priorities and the index +//! in the array is as follow: +//! +//! PAL_osPriorityIdle --> g_palThreadPriorities[0] +//! PAL_osPriorityLow --> g_palThreadPriorities[1] +//! PAL_osPriorityBelowNormal --> g_palThreadPriorities[2] +//! PAL_osPriorityNormal --> g_palThreadPriorities[3] +//! PAL_osPriorityAboveNormal --> g_palThreadPriorities[4] +//! PAL_osPriorityHigh --> g_palThreadPriorities[5] +//! PAL_osPriorityRealtime --> g_palThreadPriorities[6] + +//! An array of PAL thread priorities. The size of the array is defined in the Service API (pal_rtos.h) by "PAL_MAX_NUMBER_OF_THREADS" +extern uint8_t g_palThreadPriorities[PAL_MAX_NUMBER_OF_THREADS]; + +#define PRIORYT_INDEX_OFFSET 3 +#endif //PAL_UNIQUE_THREAD_PRIORITY + +/*! Initiate a system reboot. +*/ +void pal_plat_osReboot(void); + +/*! Initialize all data structures (semaphores, mutexes, memory pools, message queues) at system initialization. +* In case of a failure in any of the initializations, the function returns with an error and stops the rest of the initializations. +* @param[in] opaqueContext The context passed to the initialization (not required for generic CMSIS, pass NULL in this case). +* \return PAL_SUCCESS(0) in case of success, PAL_ERR_CREATION_FAILED in case of failure. +*/ +palStatus_t pal_plat_RTOSInitialize(void* opaqueContext); + +/*! De-Initialize thread objects. +*/ +void pal_plat_RTOSDestroy(void); + +/*! Get the RTOS kernel system timer counter. +* +* \return The RTOS kernel system timer counter. +* +* \note The required tick counter is the OS (platform) kernel system tick counter. +* \note This counter wraps around very often (for example, once every 42 sec for 100Mhz). +*/ +uint32_t pal_plat_osKernelSysTick(); + +/*! Get the RTOS kernel system timer counter. +* +* \return The RTOS kernel system timer counter. +* +* \note The required tick counter is the OS (platform) kernel system tick counter. +*/ +uint64_t pal_plat_osKernelSysTick64(void); // optional API - not part of original CMSIS API. + +/*! Convert the value from microseconds to kernel sys ticks. +* This is the same as CMSIS macro osKernelSysTickMicroSec. +*/ +uint64_t pal_plat_osKernelSysTickMicroSec(uint64_t microseconds); + +/*! Convert the value from kernel system ticks to milliseconds. +* +* @param[in] sysTicks The number of kernel system ticks to convert into millieseconds. +* +* \return The converted value in system ticks. +*/ +uint64_t pal_plat_osKernelSysMilliSecTick(uint64_t sysTicks); + +/*! Get the system tick frequency. +* \return The system tick frequency. +*/ +uint64_t pal_plat_osKernelSysTickFrequency(void); + +/*! Create and start a thread function. +* +* @param[in] function A function pointer to the thread callback function. +* @param[in] funcArgument An argument for the thread function. +* @param[in] priority The priority of the thread. +* @param[in] stackSize The stack size of the thread. +* @param[in] stackPtr A pointer to the thread's stack. +* @param[in] store A pointer to thread's local store, can be NULL. +* @param[out] threadID The created thread ID handle, zero indicates an error. +* +* \return The ID of the created thread, in case of error return zero. +* \note Each thread MUST have a unique priority. +* \note When the priority of the created thread function is higher than the current running thread, the +* created thread function starts instantly and becomes the new running thread. +* \note the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. +*/ +palStatus_t pal_plat_osThreadCreate(palThreadFuncPtr function, void* funcArgument, palThreadPriority_t priority, uint32_t stackSize, uint32_t* stackPtr, palThreadLocalStore_t* store, palThreadID_t* threadID); + +/*! Terminate and free allocated data for the thread. +* +* @param[in] threadID The ID of the thread to stop and terminate. +* +* \return palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osThreadTerminate(palThreadID_t* threadID); + +/*! Get the ID of the current thread. +* \return The ID of the current thread, in case of error return PAL_MAX_UINT32. +* \note For a thread with real time priority, the function always returns PAL_MAX_UINT32. +*/ +palThreadID_t pal_plat_osThreadGetId(); + +/*! Get the storage of the current thread. +* \return The storage of the current thread. +*/ +void* pal_plat_osThreadGetLocalStore(); + +/*! Wait for a specified period of time in milliseconds. +* +* @param[in] milliseconds The number of milliseconds to wait before proceeding. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osDelay(uint32_t milliseconds); + +/*! Create a timer. +* +* @param[in] function A function pointer to the timer callback function. +* @param[in] funcArgument An argument for the timer callback function. +* @param[in] timerType The timer type to be created, periodic or oneShot. +* @param[out] timerID The ID of the created timer, zero value indicates an error. +* +* \return PAL_SUCCESS when the timer was created successfully. A specific error in case of failure. +* PAL_ERR_NO_MEMORY: no memory resource available to create timer object. +* +* \note the timer callback function runs according to the platform resources of stack-size and priority. +* \note the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. +*/ +palStatus_t pal_plat_osTimerCreate(palTimerFuncPtr function, void* funcArgument, palTimerType_t timerType, palTimerID_t* timerID); + +/*! Start or restart a timer. +* +* @param[in] timerID The handle for the timer to start. +* @param[in] millisec The time in milliseconds to set the timer to. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osTimerStart(palTimerID_t timerID, uint32_t millisec); + +/*! Stop a timer. +* +* @param[in] timerID The handle for the timer to stop. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osTimerStop(palTimerID_t timerID); + +/*! Delete the timer object +* +* @param[inout] timerID The handle for the timer to delete. In success, *timerID = NULL. +* +* \return PAL_SUCCESS when the timer was deleted successfully, PAL_ERR_RTOS_PARAMETER when the timerID is incorrect. +*/ +palStatus_t pal_plat_osTimerDelete(palTimerID_t* timerID); + +/*! Create and initialize a mutex object. +* +* @param[out] mutexID The created mutex ID handle, zero value indicates an error. +* +* \return PAL_SUCCESS when the mutex was created successfully, a specific error in case of failure. +* PAL_ERR_NO_MEMORY: no memory resource available to create mutex object. +* \note the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. +*/ +palStatus_t pal_plat_osMutexCreate(palMutexID_t* mutexID); + +/*! Wait until a mutex becomes available. +* +* @param[in] mutexID The handle for the mutex. +* @param[in] millisec The timeout for the waiting operation if the timeout expires before the semaphore is released and an error is returned from the function. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, one of the following error codes in case of failure: +* PAL_ERR_RTOS_RESOURCE - Mutex not available but no timeout set. +* PAL_ERR_RTOS_TIMEOUT - Mutex was not available until timeout expired. +* PAL_ERR_RTOS_PARAMETER - Mutex ID is invalid. +* PAL_ERR_RTOS_ISR - Cannot be called from interrupt service routines. +*/ +palStatus_t pal_plat_osMutexWait(palMutexID_t mutexID, uint32_t millisec); + +/*! Release a mutex that was obtained by osMutexWait. +* +* @param[in] mutexID The handle for the mutex. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osMutexRelease(palMutexID_t mutexID); + +/*!Delete a mutex object. +* +* @param[inout] mutexID The ID of the mutex to delete. In success, *mutexID = NULL. +* +* \return PAL_SUCCESS when the mutex was deleted successfully, one of the following error codes in case of failure: +* PAL_ERR_RTOS_RESOURCE - Mutex already released. +* PAL_ERR_RTOS_PARAMETER - Mutex ID is invalid. +* PAL_ERR_RTOS_ISR - Cannot be called from interrupt service routines. +* \note After this call, mutex_id is no longer valid and cannot be used. +*/ +palStatus_t pal_plat_osMutexDelete(palMutexID_t* mutexID); + +/*! Create and initialize a semaphore object. +* +* @param[in] count The number of available resources. +* @param[out] semaphoreID The ID of the created semaphore, zero value indicates an error. +* +* \return PAL_SUCCESS when the semaphore was created successfully, a specific error in case of failure. +* PAL_ERR_NO_MEMORY: no memory resource available to create semaphore object. +* \note the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. +*/ +palStatus_t pal_plat_osSemaphoreCreate(uint32_t count, palSemaphoreID_t* semaphoreID); + +/*! Wait until a semaphore token becomes available. +* +* @param[in] semaphoreID The handle for the semaphore. +* @param[in] millisec The timeout for the waiting operation if the timeout expires before the semaphore is released and an error is returned from the function. +* @param[out] countersAvailable The number of semaphores available, if semaphores are not available (timeout/error) zero is returned. +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, one of the following error codes in case of failure: +* PAL_ERR_RTOS_TIMEOUT - Semaphore was not available until timeout expired. +* PAL_ERR_RTOS_PARAMETER - Semaphore ID is invalid. +*/ +palStatus_t pal_plat_osSemaphoreWait(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t* countersAvailable); + +/*! Release a semaphore token. +* +* @param[in] semaphoreID The handle for the semaphore. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osSemaphoreRelease(palSemaphoreID_t semaphoreID); + +/*! Delete a semaphore object. +* +* @param[inout] semaphoreID: The ID of the semaphore to delete. In success, *semaphoreID = NULL. +* +* \return PAL_SUCCESS when the semaphore was deleted successfully, one of the following error codes in case of failure: +* PAL_ERR_RTOS_RESOURCE - Semaphore already released. +* PAL_ERR_RTOS_PARAMETER - Semaphore ID is invalid. +* \note After this call, the semaphore_id is no longer valid and cannot be used. +*/ +palStatus_t pal_plat_osSemaphoreDelete(palSemaphoreID_t* semaphoreID); + +/*! Create and initialize a memory pool. +* +* @param[in] blockSize The size of a single block in bytes. +* @param[in] blockCount The maximum number of blocks in the memory pool. +* @param[out] memoryPoolID The ID of the created memory pool, zero value indicates an error. +* +* \return PAL_SUCCESS when the memory pool was created successfully, a specific error in case of failure. +* PAL_ERR_NO_MEMORY: no memory resource available to create memory pool object. +* \note the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. +*/ +palStatus_t pal_plat_osPoolCreate(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t* memoryPoolID); + +/*! Allocate a single memory block from a memory pool. +* +* @param[in] memoryPoolID The handle for the memory pool. +* +* \return A pointer to a single allocated memory from the pool, NULL in case of failure. +*/ +void* pal_plat_osPoolAlloc(palMemoryPoolID_t memoryPoolID); + +/*! Allocate a single memory block from a memory pool and set memory block to zero. +* +* @param[in] memoryPoolID The handle for the memory pool. +* +* \return A pointer to a single allocated memory from the pool, NULL in case of failure. +*/ +void* pal_plat_osPoolCAlloc(palMemoryPoolID_t memoryPoolID); + +/*! Return the memoryPoolID of the memory block back to a specific memory pool. +* +* @param[in] memoryPoolID The handle for the memory pool. +* @param[in] block The block to be freed. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osPoolFree(palMemoryPoolID_t memoryPoolID, void* block); + +/*! Delete a memory pool object. +* +* @param[inout] memoryPoolID The handle for the memory pool. In success, *memoryPoolID = NULL. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osPoolDestroy(palMemoryPoolID_t* memoryPoolID); + +/*! Create and initialize a message queue. +* +* @param[in] messageQSize The size of the message queue. +* @param[out] messageQID The ID of the created message queue, zero value indicates an error. +* +* \return PAL_SUCCESS when the message queue was created successfully, a specific error in case of failure. +* PAL_ERR_NO_MEMORY: no memory resource available to create message queue object. +* \note the create function MUST not wait for platform resources and it should return "PAL_ERR_RTOS_RESOURCE", unless the platform API is blocking. +*/ +palStatus_t pal_plat_osMessageQueueCreate(uint32_t messageQSize, palMessageQID_t* messageQID); + +/*! Put a message to a queue. +* +* @param[in] messageQID The handle for the message queue. +* @param[in] info The data to send. +* @param[in] timeout The timeout in milliseconds. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osMessagePut(palMessageQID_t messageQID, uint32_t info, uint32_t timeout); + +/*! Get a message or wait for a message from a queue. +* +* @param[in] messageQID The handle for the message queue. +* @param[in] timeout The timeout in milliseconds. +* @param[out] messageValue The data to send. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, one of the following error codes in case of failure: +* PAL_ERR_RTOS_RESOURCE - Semaphore was not available but not due to timeout. +* PAL_ERR_RTOS_TIMEOUT - No message arrived during the timeout period. +* PAL_ERR_RTOS_RESOURCE - No message received and there was no timeout. +*/ +palStatus_t pal_plat_osMessageGet(palMessageQID_t messageQID, uint32_t timeout, uint32_t* messageValue); + +/*! Delete a message queue object. +* +* @param[inout] messageQID The handle for the message queue. In success, *messageQID = NULL. +* +* \return The status in the form of palStatus_t; PAL_SUCCESS(0) in case of success, a negative value indicating a specific error code in case of failure. +*/ +palStatus_t pal_plat_osMessageQueueDestroy(palMessageQID_t* messageQID); + +/*! Perform an atomic increment for a signed32 bit value. +* +* @param[in,out] valuePtr The address of the value to increment. +* @param[in] increment The number by which to increment. +* +* \returns The value of the valuePtr after the increment operation. +*/ +int32_t pal_plat_osAtomicIncrement(int32_t* valuePtr, int32_t increment); + +#ifdef DEBUG +#include "stdio.h" +#define pal_plat_printf(ARGS...) printf(ARGS) +#define pal_plat_vprintf(FORMAT,LIST) vprintf(FORMAT,LIST) + +#endif +#ifdef __cplusplus +} +#endif +#endif //_PAL_COMMON_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,42 @@ +## PAL porting guide + +This document describes the process of PAL porting to different operating systems. During the process, you need to work +with the [**Port**](https://github.com/ARMmbed/mbed-client-pal/tree/master/Source/Port) folder that contains two sub-folders: *[Platform-API](https://github.com/ARMmbed/pal/tree/master/Source/Port/Platform-API)* and *[Reference-Impl](https://github.com/ARMmbed/pal/tree/master/Source/Port/Reference-Impl)*. + +### Platform-API + +The *[Platform-API](https://github.com/ARMmbed/pal/tree/master/Source/Port/Platform-API)* folder contains the header files declaring the interfaces that MUST be implemented by the platform. The APIs are documented in the header files and the Doxygen documentation with the same content is also available. +The documentation declares the input/output parameters, return values and the eventual special return values. +The header file names are related to the PAL modules they are declaring. For example: + + ``` + pal_plat_rtos.h --> presents the RealTime OS APIs required by the + services and Must be implemented by platform. + ``` + +<span class="notes">The APIs are called directly from the *Service* implementation layer. Therefore, you MUST NOT change them.</span> + +### Reference-Impl + +The *[Reference-Impl](https://github.com/ARMmbed/pal/tree/master/Source/Port/Reference-Impl)* folder contains the reference platform implementations in their respective folders. +Each OS folder contains a list of folders of the required PAL modules to be implemented by the platform, for example: + + ``` + Networking --> contains networking related files. + ``` + +### Porting to a new platform + +1. Add a new platform folder to the *[Reference-Impl](https://github.com/ARMmbed/pal/tree/master/Source/Port/Reference-Impl)* folder. +2. Add the module folders into the new platform folder. +3. Read the relevent API/Module documentation. +4. Start coding. + +#### Essential header files + +Here is a list of tips that can help in porting: + +* Include the **[pal.h](https://github.com/ARMmbed/pal/blob/master/Source/PAL-Impl/Services-API/pal.h)** file; it includes all the required headers from PAL, such as `pal_errors.h` and `pal_macros.h`. +* Read the **[pal_errors.h](https://github.com/ARMmbed/pal/blob/master/Source/PAL-Impl/Services-API/pal_errors.h)** file to find out how to map the platform errors to the PAL errors. +* Read the **[pal_macros.h](https://github.com/ARMmbed/pal/blob/master/Source/PAL-Impl/Services-API/pal_macros.h)** to find helpful PAL macros. +* Include the **pal_(MODULE).h** file to get the relevant data structures.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Reference-Impl/.mbedignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ +Linux/* +mbedosClassic/* +FreeRTOS/* \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Reference-Impl/mbedOS/Networking/pal_plat_network.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,763 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + + +#include "pal.h" +#include "pal_plat_network.h" +#include "pal_rtos.h" + +#include "mbed.h" + + +#if defined (__CC_ARM) || defined(__IAR_SYSTEMS_ICC__) + + +void palSelectCallbackNull() +{ +} + +#define NULL_FUNCTION palSelectCallbackNull + + +#elif defined (__GNUC__) + +#define NULL_FUNCTION NULL + +#endif + + +#define PAL_SOCKET_OPTION_ERROR (-1) + +static NetworkInterface* s_pal_networkInterfacesSupported[PAL_MAX_SUPORTED_NET_INTEFACES] = { 0 }; + +static uint32_t s_pal_numberOFInterfaces = 0; + +static uint32_t s_pal_network_initialized = 0; + +static palStatus_t translateErrorToPALError(int errnoValue) +{ + palStatus_t status; + switch (errnoValue) + { + case NSAPI_ERROR_NO_MEMORY: + status = PAL_ERR_NO_MEMORY; + break; + case NSAPI_ERROR_PARAMETER: + status = PAL_ERR_SOCKET_INVALID_VALUE; + break; + case NSAPI_ERROR_WOULD_BLOCK: + status = PAL_ERR_SOCKET_WOULD_BLOCK; + break; + case NSAPI_ERROR_DNS_FAILURE: + status = PAL_ERR_SOCKET_DNS_ERROR; + break; + case NSAPI_ERROR_DHCP_FAILURE: + status = PAL_ERR_SOCKET_HDCP_ERROR; + break; + case NSAPI_ERROR_AUTH_FAILURE: + status = PAL_ERR_SOCKET_AUTH_ERROR; + break; + case NSAPI_ERROR_NO_ADDRESS: + status = PAL_ERR_SOCKET_INVALID_ADDRESS; + break; + case NSAPI_ERROR_NO_CONNECTION: + status = PAL_ERR_SOCKET_NOT_CONNECTED; + break; + case NSAPI_ERROR_DEVICE_ERROR: + status = PAL_ERR_SOCKET_INPUT_OUTPUT_ERROR; + break; + case NSAPI_ERROR_UNSUPPORTED: + status = PAL_ERR_NOT_SUPPORTED; + break; + + default: + status = PAL_ERR_SOCKET_GENERIC; + break; + } + return status; +} + +palStatus_t pal_plat_socketsInit(void* context) +{ + (void)context; // replace with macro + int result = PAL_SUCCESS; + if (s_pal_network_initialized == 1) + { + return PAL_SUCCESS; // already initialized. + } + + s_pal_network_initialized = 1; + + return result; +} + +palStatus_t pal_plat_RegisterNetworkInterface(void* context, uint32_t* interfaceIndex) +{ + palStatus_t result = PAL_SUCCESS; + uint32_t index = 0; + uint32_t found = 0; + if (NULL != context) // TODO: nirson01 : not thread safe - do we need to fix his? + { + for (index = 0; index < s_pal_numberOFInterfaces; index++) // if specific context already registered return exisitng index instead of registering again. + { + if (s_pal_networkInterfacesSupported[index] == context) + { + found = 1; + if (interfaceIndex != NULL) + { + *interfaceIndex = index; + } + } + } + if (0 == found) + { + s_pal_networkInterfacesSupported[s_pal_numberOFInterfaces] = (NetworkInterface*)context; + if (interfaceIndex != NULL) + { + *interfaceIndex = s_pal_numberOFInterfaces; + } + s_pal_numberOFInterfaces = s_pal_numberOFInterfaces + 1; + } + + + } + else + { + result = PAL_ERR_INVALID_ARGUMENT; + } + return result; +} + +palStatus_t pal_plat_socketsTerminate(void* context) +{ + (void)context; // replace with macro + return PAL_SUCCESS; +} + +static int translateNSAPItoPALSocketOption(int option) +{ + int optionVal = PAL_SOCKET_OPTION_ERROR; + switch (option) + { + case PAL_SO_REUSEADDR: + optionVal = NSAPI_REUSEADDR; + break; +#if PAL_NET_TCP_AND_TLS_SUPPORT // socket options below supported only if TCP is supported. + case PAL_SO_KEEPALIVE: + optionVal = NSAPI_KEEPALIVE; + break; +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + case PAL_SO_SNDTIMEO: + case PAL_SO_RCVTIMEO: + default: + optionVal = PAL_SOCKET_OPTION_ERROR; + } + return optionVal; +} + + +static palStatus_t palSockAddrToSocketAddress(const palSocketAddress_t* palAddr, int length, SocketAddress& output) +{ + palStatus_t result = PAL_SUCCESS; + uint16_t port = 0; + nsapi_version_t version = NSAPI_IPv4; + + result = pal_getSockAddrPort(palAddr, &port); + if (result != PAL_SUCCESS) + { + return result; + } + output.set_port(port); + + if (PAL_AF_INET == palAddr->addressType) + { + palIpV4Addr_t ipV4Addr; + version = NSAPI_IPv4; + result = pal_getSockAddrIPV4Addr(palAddr, ipV4Addr); + if (result == PAL_SUCCESS) + { + output.set_ip_bytes(&ipV4Addr, version); + } + } + else if (PAL_AF_INET6 == palAddr->addressType) + { + palIpV6Addr_t ipV6Addr; + version = NSAPI_IPv6; + result = pal_getSockAddrIPV6Addr(palAddr, ipV6Addr); + if (result == PAL_SUCCESS) + { + output.set_ip_bytes(&ipV6Addr, version); + } + } + + return result; +} + +static palStatus_t socketAddressToPalSockAddr(SocketAddress& input, palSocketAddress_t* out, palSocketLength_t* length) +{ + palStatus_t result = PAL_SUCCESS; + int index = 0; + if (input.get_ip_version() == NSAPI_IPv4) + { + palIpV4Addr_t addr; + const void* tmp = input.get_ip_bytes(); + for (index = 0; index < PAL_IPV4_ADDRESS_SIZE; index++) + { + addr[index] = ((const uint8_t*)tmp)[index]; + } + result = pal_setSockAddrIPV4Addr(out, addr); + *length = PAL_IPV4_ADDRESS_SIZE; // TODO: check + + } + else if (input.get_ip_version() == NSAPI_IPv6) + { + palIpV6Addr_t addr; + const void* tmp = input.get_ip_bytes(); + for (index = 0; index < PAL_IPV6_ADDRESS_SIZE; index++) + { + addr[index] = ((const uint8_t*)tmp)[index]; + } + result = pal_setSockAddrIPV6Addr(out, addr); + *length = PAL_IPV6_ADDRESS_SIZE; // TODO: check + } + else + { + result = PAL_ERR_SOCKET_INVALID_ADDRESS_FAMILY; + } + + if (result == PAL_SUCCESS) + { + result = pal_setSockAddrPort(out, input.get_port()); + } + return result; +} + + + + +palStatus_t pal_plat_socket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palSocket_t* socket) +{ + int result = PAL_SUCCESS; + Socket* socketObj = NULL; + + if (PAL_NET_DEFAULT_INTERFACE == interfaceNum) + { + interfaceNum = 0; + } + + if ((s_pal_numberOFInterfaces > interfaceNum) && (PAL_SOCK_DGRAM == type) && ((PAL_AF_INET == domain) || (PAL_AF_INET6 == domain) || (PAL_AF_UNSPEC == domain))) + { + socketObj = new UDPSocket(s_pal_networkInterfacesSupported[interfaceNum]); + } +#if PAL_NET_TCP_AND_TLS_SUPPORT // functionality below supported only in case TCP is supported. + else if ((s_pal_numberOFInterfaces > interfaceNum) && (PAL_SOCK_STREAM == type) && ((PAL_AF_INET == domain) || (PAL_AF_INET6 == domain) || (PAL_AF_UNSPEC == domain))) + { + socketObj = new TCPSocket(s_pal_networkInterfacesSupported[interfaceNum]); + } + else if ((s_pal_numberOFInterfaces > interfaceNum) && (PAL_SOCK_STREAM_SERVER == type) && ((PAL_AF_INET == domain) || (PAL_AF_INET6 == domain) || (PAL_AF_UNSPEC == domain))) + { + socketObj = new TCPServer(s_pal_networkInterfacesSupported[interfaceNum]); + } +#endif + else + { + result = PAL_ERR_INVALID_ARGUMENT; + } + + if ((PAL_SUCCESS == result ) && (NULL == socketObj)) + { + result = PAL_ERR_NO_MEMORY; + } + + if (PAL_SUCCESS == result) + { + if (true == nonBlockingSocket) + { + socketObj->set_blocking(false); + } + else + { + socketObj->set_blocking(true); + } + *socket = (palSocket_t)socketObj; + } + return result; // TODO(nirson01) ADD debug print for error propagation(once debug print infrastructure is finalized) +} + + +palStatus_t pal_plat_getSocketOptions(palSocket_t socket, palSocketOptionName_t optionName, void* optionValue, palSocketLength_t* optionLength) +{ + int result = PAL_SUCCESS; + unsigned int length = *optionLength; + Socket* socketObj = (Socket*)socket; + + int socketOption = translateNSAPItoPALSocketOption(optionName); + + if (PAL_SOCKET_OPTION_ERROR != socketOption) + { + result = socketObj->getsockopt(NSAPI_SOCKET, socketOption, optionValue, &length); + if (result < 0) + { + result = translateErrorToPALError(result); + } + else + { + *optionLength = length; + } + + } + else + { + // in MBED socket timeouts are write only via the API - not supported though socket options. + result = PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED; + } + + return result; +} + + +palStatus_t pal_plat_setSocketOptions(palSocket_t socket, int optionName, const void* optionValue, palSocketLength_t optionLength) +{ + int result = PAL_SUCCESS; + Socket* socketObj = (Socket*)socket; + int socketOption = PAL_SOCKET_OPTION_ERROR; + + socketOption = translateNSAPItoPALSocketOption(optionName); + if (PAL_SOCKET_OPTION_ERROR != socketOption) + { + result = socketObj->setsockopt(NSAPI_SOCKET, socketOption, optionValue, optionLength); + if (result < 0) + { + result = translateErrorToPALError(result); + } + } + else + { + if ((PAL_SO_SNDTIMEO == optionName) || (PAL_SO_RCVTIMEO == optionName)) // timeouts in MBED API are not managed though socket options, bun instead via a different funciton call + { + int timeout = *((int*)optionValue); + socketObj->set_timeout(timeout); + } + else + { + result = PAL_ERR_SOCKET_OPTION_NOT_SUPPORTED; + } + } + + + return result; +} + + + +palStatus_t pal_plat_bind(palSocket_t socket, palSocketAddress_t* myAddress, palSocketLength_t addressLength) +{ + int result = PAL_SUCCESS; + Socket* socketObj = (Socket*)socket; + SocketAddress internalAddr; + + result = palSockAddrToSocketAddress(myAddress, addressLength, internalAddr); + if (result == 0) + { + result = socketObj->bind(internalAddr); + if (result < 0) + { + result = translateErrorToPALError(result); + } + } + + return result; +} + + +palStatus_t pal_plat_receiveFrom(palSocket_t socket, void* buffer, size_t length, palSocketAddress_t* from, palSocketLength_t* fromLength, size_t* bytesReceived) +{ + int result = PAL_SUCCESS; + int status = 0; + *bytesReceived = 0; + SocketAddress sockAddr; + UDPSocket* socketObj; + + socketObj = (UDPSocket*)socket; + + status = socketObj->recvfrom(&sockAddr, buffer, length); + if (status < 0) + { + result = translateErrorToPALError(status); + } + else if (status == 0){ + result = PAL_ERR_SOCKET_CONNECTION_CLOSED; + } + else // only return address / bytesReceived in case of success + { + if ((NULL != from) && (NULL != fromLength)) + { + result = socketAddressToPalSockAddr(sockAddr, from, fromLength); + + } + *bytesReceived = status; + } + + return result; + +} + +palStatus_t pal_plat_sendTo(palSocket_t socket, const void* buffer, size_t length, const palSocketAddress_t* to, palSocketLength_t toLength, size_t* bytesSent) +{ + int result = PAL_SUCCESS; + int status = 0; + SocketAddress sockAddr; + + UDPSocket* socketObj = (UDPSocket*)socket; + + *bytesSent = 0; + result = palSockAddrToSocketAddress(to, toLength, sockAddr); + if (result == 0) + { + status = socketObj->sendto(sockAddr, buffer, length); + if (status < 0) + { + result = translateErrorToPALError(status); + } + else + { + *bytesSent = status; + } + } + + return result; +} + +palStatus_t pal_plat_close(palSocket_t* socket) +{ + int result = PAL_SUCCESS; + Socket* socketObj = (Socket*)*socket; + result = socketObj->close(); + if (result < 0) + { + result = translateErrorToPALError(result); + } + delete socketObj; + *socket = NULL; + return result; +} + +palStatus_t pal_plat_getNumberOfNetInterfaces( uint32_t* numInterfaces) +{ + *numInterfaces = s_pal_numberOFInterfaces; + return PAL_SUCCESS; +} + +palStatus_t pal_plat_getNetInterfaceInfo(uint32_t interfaceNum, palNetInterfaceInfo_t * interfaceInfo) +{ + palStatus_t result = PAL_SUCCESS; + const char* address = NULL; + SocketAddress addr; + if ((interfaceNum >= s_pal_numberOFInterfaces) || (NULL == interfaceInfo)) + { + return PAL_ERR_INVALID_ARGUMENT; + } + address = s_pal_networkInterfacesSupported[interfaceNum]->get_ip_address(); // ip address returned is a null terminated string + if (NULL != address) + { + addr.set_ip_address(address); + result = socketAddressToPalSockAddr(addr, &interfaceInfo->address, &interfaceInfo->addressSize); + } + + + return result; +} + +typedef void(*palSelectCallbackFunction_t)(); + +static palSemaphoreID_t s_palSelectSemaphore = 0; +static bool s_palSelectSemaphoreInited = false; +uint32_t s_select_event_happened[PAL_NET_SOCKET_SELECT_MAX_SOCKETS]; + +// select callbacks definition +// TODO: nirson01 change to define these using a macro. +void palSelectCallback0() +{ + s_select_event_happened[0]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} +void palSelectCallback1() +{ + s_select_event_happened[1]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} +void palSelectCallback2() +{ + s_select_event_happened[2]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} +void palSelectCallback3() +{ + s_select_event_happened[3]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} +void palSelectCallback4() +{ + s_select_event_happened[4]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} +void palSelectCallback5() +{ + s_select_event_happened[5]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} +void palSelectCallback6() +{ + s_select_event_happened[6]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} +void palSelectCallback7() +{ + s_select_event_happened[7]++; + pal_osSemaphoreRelease(s_palSelectSemaphore); +} + +palSelectCallbackFunction_t s_palSelectPalCallbackFunctions[PAL_NET_SOCKET_SELECT_MAX_SOCKETS] = { palSelectCallback0, palSelectCallback1, palSelectCallback2, palSelectCallback3, palSelectCallback4, palSelectCallback5, palSelectCallback6, palSelectCallback7 }; + + +palStatus_t pal_plat_socketMiniSelect(const palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t numberOfSockets, pal_timeVal_t* timeout, + uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS], uint32_t * numberOfSocketsSet) +{ + uint32_t index = 0; + int32_t counter = 0; + uint32_t timeoutInMiliseconds = 0; + palStatus_t result = PAL_SUCCESS; + + if ((NULL == socketsToCheck) || (NULL == numberOfSocketsSet) || (NULL == timeout)) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + timeoutInMiliseconds = (timeout->pal_tv_sec * 1000) + (timeout->pal_tv_usec /1000); + *numberOfSocketsSet = 0; + + if (0 == numberOfSockets) + { + return PAL_SUCCESS; + } + // create semaphore if not initialized before - if it exists ensure count is 0. + + if (false == s_palSelectSemaphoreInited) + { + result = pal_osSemaphoreCreate(0, &s_palSelectSemaphore); // create semaphore to wait until socket event happens (semaphore will be re-used and is only created once, and never freed - if terminate is added free this resoruce if allocaed) + if (PAL_SUCCESS != result) + { + return result; //single exit ?? + } + s_palSelectSemaphoreInited = true; + } + else { + int32_t counters = 0; + result = pal_osSemaphoreWait(s_palSelectSemaphore, 1, &counters); // deplete semaphore count until it is 0. + while (result != PAL_ERR_RTOS_TIMEOUT) + { + result = pal_osSemaphoreWait(s_palSelectSemaphore, 1, &counters); + } + if (PAL_ERR_RTOS_TIMEOUT != result ) // make sure count is actually 0 + { + return result; //single exit ?? + } + + } + for (uint32_t index = 0; index < numberOfSockets; index++) + { + s_select_event_happened[index] = 0; + palSocketStatus[index] = 0; + } + + for (index = 0; index < numberOfSockets; index++) + { + Socket* socketObj = (Socket*)socketsToCheck[index]; + socketObj->attach(s_palSelectPalCallbackFunctions[index]); + } + + result = pal_osSemaphoreWait(s_palSelectSemaphore, timeoutInMiliseconds, &counter); + if (result == PAL_SUCCESS) + { + for (index = 0; index < numberOfSockets; index++) + { + if (s_select_event_happened[index] > 0) + { + palSocketStatus[index] |= PAL_NET_SOCKET_SELECT_RX_BIT | PAL_NET_SOCKET_SELECT_TX_BIT | PAL_NET_SOCKET_SELECT_ERR_BIT; + *numberOfSocketsSet = *numberOfSocketsSet +1; + } + } + } + if (result == PAL_ERR_RTOS_TIMEOUT) // to socket callback has been called to free the semaphore -> no socket events happenet untill the timout. + { + *numberOfSocketsSet = 0; // TODO: add debug prints + result = PAL_SUCCESS; // timeout is not actually an error in this case + } + + for (index = 0; index < numberOfSockets; index++) + { + + Socket* socketObj = (Socket*)socketsToCheck[index]; + socketObj->attach(NULL_FUNCTION); + } + return result ; +} + +#if PAL_NET_TCP_AND_TLS_SUPPORT // functionality below supported only in case TCP is supported. + + +palStatus_t pal_plat_listen(palSocket_t socket, int backlog) +{ + int result = PAL_SUCCESS; + + TCPServer* socketObj = (TCPServer*)socket; + + + result = socketObj->listen(backlog); + if (result < 0) + { + return translateErrorToPALError(result); + } + return PAL_SUCCESS; +} + + +palStatus_t pal_plat_accept(palSocket_t socket, palSocketAddress_t * address, palSocketLength_t* addressLen, palSocket_t* acceptedSocket) +{ + int result = PAL_SUCCESS; + + SocketAddress incomingAddr; + + TCPServer* socketObj = (TCPServer*)socket; + result = socketObj->accept((TCPSocket*)(*acceptedSocket), &incomingAddr); + if (result < 0) + { + result = translateErrorToPALError(result); + } + else + { + result = socketAddressToPalSockAddr(incomingAddr, address, addressLen); + } + return result; +} + + +palStatus_t pal_plat_connect(palSocket_t socket, const palSocketAddress_t* address, palSocketLength_t addressLen) +{ + int result = PAL_SUCCESS; + SocketAddress internalAddr; + TCPSocket* socketObj = (TCPSocket*)socket; + + result = palSockAddrToSocketAddress(address, addressLen, internalAddr); + if (result == PAL_SUCCESS) + { + result = socketObj->connect(internalAddr); + if (result < 0) + { + result = translateErrorToPALError(result); + } + } + + return result; +} + +palStatus_t pal_plat_recv(palSocket_t socket, void *buf, size_t len, size_t* recievedDataSize) +{ + int result = PAL_SUCCESS; + int status = 0; + + TCPSocket* socketObj = (TCPSocket*)socket; + + + status = socketObj->recv(buf, len); + if (status < 0) + { + result = translateErrorToPALError(status); + } + else if (status == 0){ + return PAL_ERR_SOCKET_CONNECTION_CLOSED; + } + *recievedDataSize = status; + return result; +} + +palStatus_t pal_plat_send(palSocket_t socket, const void *buf, size_t len, size_t* sentDataSize) +{ + palStatus_t result = PAL_SUCCESS; + int status = 0; + + TCPSocket* socketObj = (TCPSocket*)socket; + + status = socketObj->send(buf, len); + if (status < 0) + { + result = translateErrorToPALError(status); + } + else + { + *sentDataSize = status; + } + return result; +} + +#endif //PAL_NET_TCP_AND_TLS_SUPPORT + + +#if PAL_NET_ASYNCHRONOUS_SOCKET_API + + +palStatus_t pal_plat_asynchronousSocket(palSocketDomain_t domain, palSocketType_t type, bool nonBlockingSocket, uint32_t interfaceNum, palAsyncSocketCallback_t callback, palSocket_t* socket) +{ + Socket* socketObj = NULL; + palStatus_t result = pal_plat_socket(domain, type, nonBlockingSocket, interfaceNum, socket); + if (result == PAL_SUCCESS) + { + socketObj = (Socket*)*socket; + socketObj->attach(callback); + } + + return result; + +} + +#endif + +#if PAL_NET_DNS_SUPPORT + +palStatus_t pal_plat_getAddressInfo(const char *url, palSocketAddress_t *address, palSocketLength_t* length) +{ + palStatus_t result = PAL_SUCCESS; + + SocketAddress translatedAddress; // by default use the fist supported net interface - TODO: do we need to select a different interface? + result = s_pal_networkInterfacesSupported[0]->gethostbyname(url, &translatedAddress); + if (result == 0) + { + result = socketAddressToPalSockAddr(translatedAddress, address, length); + } + else // error happened + { + result = translateErrorToPALError(result); + } + return result; +} + +#endif + + + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Reference-Impl/mbedOS/RTOS/pal_plat_rtos.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,975 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "pal_types.h" +#include "pal_rtos.h" +#include "pal_plat_rtos.h" +#include "pal_errors.h" +#include "stdlib.h" +#include "string.h" + +#include "cmsis_os.h" // Revision: V1.02 +// These includes try to find declaration of NVIC_SystemReset. +// Note: At least on A9 the cmsis_nvic.h can not be included without previous +// board specific includes, so it has to be included only when known to work. +#if defined (__CORTEX_M0) +#include "cmsis_nvic.h" +#include "core_cm0.h" +#elif defined (__CORTEX_M3) +#include "cmsis_nvic.h" +#include "core_cm3.h" +#elif defined (__CORTEX_M4) +#include "cmsis_nvic.h" +#include "core_cm4.h" +#elif defined (__CORTEX_M7) +#include "cmsis_nvic.h" +#include "core_cm7.h" +#else +// Declaration of NVIC_SystemReset is not present on core_ca9.h, but in the +// board specific files. +void NVIC_SystemReset(void); +#endif + +#include "critical.h" + +#define PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(cmsisCode)\ + ((int32_t)(cmsisCode + PAL_ERR_RTOS_ERROR_BASE)) + +//! the size of the memory to allocate was taken from CMSIS header (cmsis_os.h) +#define PAL_RTOS_MEMORY_POOL_SIZE(blockSize, blockCount)\ + (sizeof(uint32_t)*(3+((blockSize+3)/4)*(blockCount))) + +//! the size of the memory to allocate was taken from CMSIS header (cmsis_os.h) +#define PAL_RTOS_MESSAGE_Q_SIZE(messageQSize)\ + (sizeof(uint32_t)*(4 + messageQSize)) + + +#ifdef PAL_RTOS_WAIT_FOREVER +#undef PAL_RTOS_WAIT_FOREVER +#define PAL_RTOS_WAIT_FOREVER osWaitForever +#endif //PAL_RTOS_WAIT_FOREVER + +//! This definitions should be under #ifdef for different CORTEX-X processors. +//! The current vaules are for cortex-M these are the sizes of the internal data array in definitions arrays +#define PAL_TIMER_DATA_SIZE 6 +#define PAL_MUTEX_DATA_SIZE 4 +#define PAL_SEMAPHORE_DATA_SIZE 2 +#define PAL_NUM_OF_THREAD_INSTANCES 1 +#define PAL_TICK_TO_MILLI_FACTOR 1000 + +typedef struct palThreadFuncWrapper{ + palTimerFuncPtr realThreadFunc; + void* realThreadArgs; + uint32_t threadIndex; +}palThreadFuncWrapper_t; + +//! Thread structure +typedef struct palThread{ + palThreadID_t threadID; + bool initialized; + palThreadLocalStore_t* threadStore; //! please see pal_rtos.h for documentation + palThreadFuncWrapper_t threadFuncWrapper; + osThreadDef_t osThread; +} palThread_t; + +static palThread_t g_palThreads[PAL_MAX_NUMBER_OF_THREADS] = {0}; + +//! Timer structure +typedef struct palTimer{ + palTimerID_t timerID; + uint32_t internalTimerData[PAL_TIMER_DATA_SIZE]; ///< pointer to internal data + osTimerDef_t osTimer; +} palTimer_t; + +//! Mutex structure +typedef struct palMutex{ + palMutexID_t mutexID; + uint32_t internalMutexData[PAL_MUTEX_DATA_SIZE]; + osMutexDef_t osMutex; +}palMutex_t; + +//! Semaphore structure +typedef struct palSemaphore{ + palSemaphoreID_t semaphoreID; + uint32_t internalSemaphoreData[PAL_SEMAPHORE_DATA_SIZE]; + osSemaphoreDef_t osSemaphore; +}palSemaphore_t; + + +//! Memoey Pool structure +typedef struct palMemPool{ + palMemoryPoolID_t memoryPoolID; + osPoolDef_t osPool; +}palMemoryPool_t; + +//! Message Queue structure +typedef struct palMessageQ{ + palMessageQID_t messageQID; + osMessageQDef_t osMessageQ; +}palMessageQ_t; + + +inline static void setDefaultThreadValues(palThread_t* thread) +{ +#if PAL_UNIQUE_THREAD_PRIORITY + g_palThreadPriorities[thread->osThread.tpriority+PRIORYT_INDEX_OFFSET] = false; +#endif //PAL_UNIQUE_THREAD_PRIORITY + thread->threadStore = NULL; + thread->threadFuncWrapper.realThreadArgs = NULL; + thread->threadFuncWrapper.realThreadFunc = NULL; + thread->threadFuncWrapper.threadIndex = 0; + thread->osThread.pthread = NULL; + thread->osThread.tpriority = PAL_osPriorityError; + thread->osThread.instances = PAL_NUM_OF_THREAD_INSTANCES; + thread->osThread.stacksize = 0; + thread->osThread.stack_pointer = NULL; + //! This line should be last thing to be done in this function. + //! in order to prevent double accessing the same index between + //! this function and the threadCreate function. + thread->initialized = false; +} + +/*! Clean thread data from the global thread data base (g_palThreads). Thread Safe API +* +* @param[in] dbPointer: data base pointer. +* @param[in] index: the index in the data base to be cleaned. +*/ +static void threadCleanUp(void* dbPointer, uint32_t index) +{ + palThread_t* threadsDB = (palThread_t*)dbPointer; + + if (NULL == dbPointer || index >= PAL_MAX_NUMBER_OF_THREADS) + { + return; + } + + setDefaultThreadValues(&threadsDB[index]); + +} + +/*! Thread wrapper function, this function will be set as the thread function (for every thread) +* and it will get as an argument the real data about the thread and call the REAL thread function +* with the REAL argument. Once the REAL thread function finished, \ref pal_threadClean() will be called. +* +* @param[in] arg: data structure which contains the real data about the thread. +*/ +static void threadFunctionWrapper(void const* arg) +{ + palThreadFuncWrapper_t* threadWrapper = (palThreadFuncWrapper_t*)arg; + if (NULL != threadWrapper) + { + threadWrapper->realThreadFunc(threadWrapper->realThreadArgs); + //! real thread finished to run, now start the cleanup from the data base. + threadCleanUp(g_palThreads, threadWrapper->threadIndex); + } +} + + +void pal_plat_osReboot() +{ + NVIC_SystemReset(); +} + +palStatus_t pal_plat_RTOSInitialize(void* opaqueContext) +{ + palStatus_t status = PAL_SUCCESS; + static bool palRTOSInitialized = false; + if (palRTOSInitialized) + { + return PAL_SUCCESS; + } + for (int i = 0; i < PAL_MAX_NUMBER_OF_THREADS; ++i) + { + g_palThreads[i].initialized = false; + } + + if (PAL_SUCCESS == status) + { + palRTOSInitialized = true; + } + return status; +} + +void pal_plat_RTOSDestroy(void) +{ + for (int i = 0; i < PAL_MAX_NUMBER_OF_THREADS; ++i) + { + if (true == g_palThreads[i].initialized) + { + osThreadTerminate((osThreadId)g_palThreads[i].threadID); + threadCleanUp(g_palThreads, i); + } + } + return; +} +palStatus_t pal_plat_osDelay(uint32_t milliseconds) +{ + palStatus_t status; + osStatus platStatus = osDelay(milliseconds); + if (osEventTimeout == platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); //TODO(nirson01): error propagation MACRO?? + } + return status; +} + +uint32_t pal_plat_osKernelSysTick() +{ + uint32_t result; + result = osKernelSysTick(); + return result; +} + +uint64_t pal_plat_osKernelSysTickMicroSec(uint64_t microseconds) +{ + uint64_t result; + result = osKernelSysTickMicroSec(microseconds); + return result; +} + +uint64_t pal_plat_osKernelSysMilliSecTick(uint64_t sysTicks) +{ + uint64_t millisec = (PAL_TICK_TO_MILLI_FACTOR * sysTicks)/osKernelSysTickFrequency; + return millisec; +} + +uint64_t pal_plat_osKernelSysTickFrequency() +{ + return osKernelSysTickFrequency; +} + +palStatus_t pal_plat_osThreadCreate(palThreadFuncPtr function, void* funcArgument, palThreadPriority_t priority, uint32_t stackSize, uint32_t* stackPtr, palThreadLocalStore_t* store, palThreadID_t* threadID) +{ + palStatus_t status = PAL_SUCCESS; + uint32_t firstAvailableThreadIndex = PAL_MAX_NUMBER_OF_THREADS; + uint32_t i; + + if (NULL == threadID || NULL == function || NULL == stackPtr || 0 == stackSize || priority > PAL_osPriorityRealtime) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + for (i = 0; i < PAL_MAX_NUMBER_OF_THREADS; ++i) + { + if (!g_palThreads[i].initialized) + { + firstAvailableThreadIndex = i; + break; + } + } + + if (firstAvailableThreadIndex >= PAL_MAX_NUMBER_OF_THREADS) + { + status = PAL_ERR_RTOS_RESOURCE; + } + + if (PAL_SUCCESS == status) + { + g_palThreads[firstAvailableThreadIndex].threadStore = store; + g_palThreads[firstAvailableThreadIndex].threadFuncWrapper.realThreadArgs = funcArgument; + g_palThreads[firstAvailableThreadIndex].threadFuncWrapper.realThreadFunc = function; + g_palThreads[firstAvailableThreadIndex].threadFuncWrapper.threadIndex = firstAvailableThreadIndex; + g_palThreads[firstAvailableThreadIndex].osThread.pthread = threadFunctionWrapper; + g_palThreads[firstAvailableThreadIndex].osThread.tpriority = priority; + g_palThreads[firstAvailableThreadIndex].osThread.instances = PAL_NUM_OF_THREAD_INSTANCES; + g_palThreads[firstAvailableThreadIndex].osThread.stacksize = stackSize; + g_palThreads[firstAvailableThreadIndex].osThread.stack_pointer = stackPtr; + g_palThreads[firstAvailableThreadIndex].initialized = true; +#if PAL_UNIQUE_THREAD_PRIORITY + g_palThreadPriorities[priority+PRIORYT_INDEX_OFFSET] = true; +#endif //PAL_UNIQUE_THREAD_PRIORITY + + status = PAL_SUCCESS; + + g_palThreads[firstAvailableThreadIndex].threadID = (uintptr_t)osThreadCreate(&g_palThreads[firstAvailableThreadIndex].osThread, &g_palThreads[firstAvailableThreadIndex].threadFuncWrapper); + *threadID = g_palThreads[firstAvailableThreadIndex].threadID; + + if(NULLPTR == *threadID) + { + //! in case of error in the thread creation, reset the data of the given index in the threads array. + threadCleanUp(g_palThreads, firstAvailableThreadIndex); + + status = PAL_ERR_GENERIC_FAILURE; + } + } + return status; +} + +palThreadID_t pal_plat_osThreadGetId() +{ + palThreadID_t result; + result = (uintptr_t)osThreadGetId(); + return result; +} + +palStatus_t pal_plat_osThreadTerminate(palThreadID_t* threadID) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + + if (NULL == threadID || NULLPTR == *threadID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + for (int i = 0; i < PAL_MAX_NUMBER_OF_THREADS; ++i) + { + if (g_palThreads[i].initialized && (*threadID == g_palThreads[i].threadID)) + { + platStatus = osThreadTerminate((osThreadId)(*threadID)); + if (osOK == platStatus) + { + threadCleanUp(g_palThreads, i); + *threadID = NULLPTR; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + break; + + } + else if (!g_palThreads[i].initialized && (*threadID == g_palThreads[i].threadID)) + { + *threadID = NULLPTR; + } + } + return status; +} + +void* pal_plat_osThreadGetLocalStore() +{ + void* localStore = NULL; + palThreadID_t id = (uintptr_t)osThreadGetId(); + + for(int i = 0; i < PAL_MAX_NUMBER_OF_THREADS; ++i) + { + if(g_palThreads[i].initialized && (id == g_palThreads[i].threadID)) + { + localStore = g_palThreads[i].threadStore; + break; + } + } + return localStore; +} + + +palStatus_t pal_plat_osTimerCreate(palTimerFuncPtr function, void* funcArgument, palTimerType_t timerType, palTimerID_t* timerID) +{ + palStatus_t status = PAL_SUCCESS; + palTimer_t* timer = NULL; + + if(NULL == timerID || NULL == function) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + timer = (palTimer_t*)malloc(sizeof(palTimer_t)); + if (NULL == timer) + { + status = PAL_ERR_NO_MEMORY; + } + + if (PAL_SUCCESS == status) + { + timer->osTimer.ptimer = function; + timer->osTimer.timer = timer->internalTimerData; + memset(timer->osTimer.timer, 0, sizeof(uint32_t)*PAL_TIMER_DATA_SIZE); + + timer->timerID = (uintptr_t)osTimerCreate(&timer->osTimer, timerType, funcArgument); + if (NULLPTR == timer->timerID) + { + free(timer); + timer = NULL; + status = PAL_ERR_GENERIC_FAILURE; + } + else + { + *timerID = (palTimerID_t)timer; + } + } + return status; +} + +palStatus_t pal_plat_osTimerStart(palTimerID_t timerID, uint32_t millisec) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palTimer_t* timer = NULL; + + if (NULLPTR == timerID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + timer = (palTimer_t*)timerID; + platStatus = osTimerStart((osTimerId)timer->timerID, millisec); + if (osOK == (osStatus)platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osTimerStop(palTimerID_t timerID) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palTimer_t* timer = NULL; + + if(NULLPTR == timerID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + timer = (palTimer_t*)timerID; + platStatus = osTimerStop((osTimerId)timer->timerID); + if (osOK == platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osTimerDelete(palTimerID_t* timerID) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palTimer_t* timer = NULL; + + if(NULL == timerID || NULLPTR == *timerID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + timer = (palTimer_t*)*timerID; + platStatus = osTimerDelete((osTimerId)timer->timerID); + if (osOK == platStatus) + { + free(timer); + *timerID = NULLPTR; + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + + +palStatus_t pal_plat_osMutexCreate(palMutexID_t* mutexID) +{ + palStatus_t status = PAL_SUCCESS; + palMutex_t* mutex = NULL; + if(NULL == mutexID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + mutex = (palMutex_t*)malloc(sizeof(palMutex_t)); + if (NULL == mutex) + { + status = PAL_ERR_NO_MEMORY; + } + + if (PAL_SUCCESS == status) + { + mutex->osMutex.mutex = mutex->internalMutexData; + memset(mutex->osMutex.mutex, 0, sizeof(uint32_t)*PAL_MUTEX_DATA_SIZE); + + mutex->mutexID = (uintptr_t)osMutexCreate(&mutex->osMutex); + if (NULLPTR == mutex->mutexID) + { + free(mutex); + mutex = NULL; + status = PAL_ERR_GENERIC_FAILURE; + } + else + { + *mutexID = (palMutexID_t)mutex; + } + } + return status; +} + + +palStatus_t pal_plat_osMutexWait(palMutexID_t mutexID, uint32_t millisec) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palMutex_t* mutex = NULL; + + if(NULLPTR == mutexID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + mutex = (palMutex_t*)mutexID; + platStatus = osMutexWait((osMutexId)mutex->mutexID, millisec); + if (osOK == platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + + +palStatus_t pal_plat_osMutexRelease(palMutexID_t mutexID) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palMutex_t* mutex = NULL; + + if(NULLPTR == mutexID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + mutex = (palMutex_t*)mutexID; + platStatus = osMutexRelease((osMutexId)mutex->mutexID); + if (osOK == platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osMutexDelete(palMutexID_t* mutexID) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palMutex_t* mutex = NULL; + + if(NULL == mutexID || NULLPTR == *mutexID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + mutex = (palMutex_t*)*mutexID; + platStatus = osMutexDelete((osMutexId)mutex->mutexID); + if (osOK == platStatus) + { + free(mutex); + *mutexID = NULLPTR; + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osSemaphoreCreate(uint32_t count, palSemaphoreID_t* semaphoreID) +{ + palStatus_t status = PAL_SUCCESS; + palSemaphore_t* semaphore = NULL; + if(NULL == semaphoreID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + semaphore = (palSemaphore_t*)malloc(sizeof(palSemaphore_t)); + if (NULL == semaphore) + { + status = PAL_ERR_NO_MEMORY; + } + + if(PAL_SUCCESS == status) + { + semaphore->osSemaphore.semaphore = semaphore->internalSemaphoreData; + memset(semaphore->osSemaphore.semaphore, 0, sizeof(uint32_t)*PAL_SEMAPHORE_DATA_SIZE); + + semaphore->semaphoreID = (uintptr_t)osSemaphoreCreate(&semaphore->osSemaphore, count); + if (NULLPTR == semaphore->semaphoreID) + { + free(semaphore); + semaphore = NULL; + status = PAL_ERR_GENERIC_FAILURE; + } + else + { + *semaphoreID = (palSemaphoreID_t)semaphore; + } + } + return status; +} + +palStatus_t pal_plat_osSemaphoreWait(palSemaphoreID_t semaphoreID, uint32_t millisec, int32_t* countersAvailable) +{ + palStatus_t status = PAL_SUCCESS; + palSemaphore_t* semaphore = NULL; + if(NULLPTR == semaphoreID || NULL == countersAvailable) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + semaphore = (palSemaphore_t*)semaphoreID; + *countersAvailable = osSemaphoreWait((osSemaphoreId)semaphore->semaphoreID, millisec); + if (0 == *countersAvailable) + { + status = PAL_ERR_RTOS_TIMEOUT; + } + else if (*countersAvailable < 0) + { + *countersAvailable = 0; + status = PAL_ERR_RTOS_PARAMETER; + } + return status; +} + +palStatus_t pal_plat_osSemaphoreRelease(palSemaphoreID_t semaphoreID) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palSemaphore_t* semaphore = NULL; + + if(NULLPTR == semaphoreID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + semaphore = (palSemaphore_t*)semaphoreID; + platStatus = osSemaphoreRelease((osSemaphoreId)semaphore->semaphoreID); + if (osOK == platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osSemaphoreDelete(palSemaphoreID_t* semaphoreID) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palSemaphore_t* semaphore = NULL; + + if(NULL == semaphoreID || NULLPTR == *semaphoreID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + semaphore = (palSemaphore_t*)*semaphoreID; + platStatus = osSemaphoreDelete((osSemaphoreId)semaphore->semaphoreID); + if (osOK == platStatus) + { + free(semaphore); + *semaphoreID = NULLPTR; + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osPoolCreate(uint32_t blockSize, uint32_t blockCount, palMemoryPoolID_t* memoryPoolID) +{ + palStatus_t status = PAL_SUCCESS; + palMemoryPool_t* memoryPool = NULL; + if(NULL == memoryPoolID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + //! allocate the memory pool structure + memoryPool = (palMemoryPool_t*)malloc(sizeof(palMemoryPool_t)); + if (NULL == memoryPool) + { + status = PAL_ERR_NO_MEMORY; + } + + if(PAL_SUCCESS == status) + { + //! allocate the actual memory allocation for the memory pool blocks, the size of the memory + //! to allocate was taken from CMSIS header (cmsis_os.h) + memoryPool->osPool.pool = (uint32_t*)malloc(PAL_RTOS_MEMORY_POOL_SIZE(blockSize, blockCount)); + if (NULL == memoryPool->osPool.pool) + { + free(memoryPool); + *memoryPoolID = NULLPTR; + status = PAL_ERR_NO_MEMORY; + } + else + { + memset(memoryPool->osPool.pool, 0, PAL_RTOS_MEMORY_POOL_SIZE(blockSize, blockCount)); + memoryPool->osPool.pool_sz = blockCount; ///< number of items (elements) in the pool + memoryPool->osPool.item_sz = blockSize; ///< size of an item + + memoryPool->memoryPoolID = (uintptr_t)osPoolCreate(&memoryPool->osPool); + if (NULLPTR == memoryPool->memoryPoolID) + { + free(memoryPool->osPool.pool); + free(memoryPool); + memoryPool = NULL; + status = PAL_ERR_GENERIC_FAILURE; + } + else + { + *memoryPoolID = (palMemoryPoolID_t)memoryPool; + } + } + } + return status; +} + +void* pal_plat_osPoolAlloc(palMemoryPoolID_t memoryPoolID) +{ + void* result = NULL; + palMemoryPool_t* memoryPool = NULL; + + if(NULLPTR == memoryPoolID) + { + return NULL; + } + + memoryPool = (palMemoryPool_t*)memoryPoolID; + result = osPoolAlloc((osPoolId)memoryPool->memoryPoolID); + + return result; +} + +void* pal_plat_osPoolCAlloc(palMemoryPoolID_t memoryPoolID) +{ + void* result = NULL; + palMemoryPool_t* memoryPool = NULL; + + if(NULLPTR == memoryPoolID) + { + return NULL; + } + + memoryPool = (palMemoryPool_t*)memoryPoolID; + result = osPoolCAlloc((osPoolId)memoryPool->memoryPoolID); + + return result; +} + +palStatus_t pal_plat_osPoolFree(palMemoryPoolID_t memoryPoolID, void* block) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palMemoryPool_t* memoryPool = NULL; + + if(NULLPTR == memoryPoolID || NULL == block) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + memoryPool = (palMemoryPool_t*)memoryPoolID; + platStatus = osPoolFree((osPoolId)memoryPool->memoryPoolID, block); + if (osOK == platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osPoolDestroy(palMemoryPoolID_t* memoryPoolID) +{ + palStatus_t status = PAL_SUCCESS; + palMemoryPool_t* memoryPool = NULL; + + if(NULL == memoryPoolID || NULLPTR == *memoryPoolID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + memoryPool = (palMemoryPool_t*)*memoryPoolID; + free(memoryPool->osPool.pool); + free(memoryPool); + *memoryPoolID = NULLPTR; + return status; +} + +palStatus_t pal_plat_osMessageQueueCreate(uint32_t messageQSize, palMessageQID_t* messageQID) +{ + palStatus_t status = PAL_SUCCESS; + palMessageQ_t* messageQ = NULL; + if(NULL == messageQID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + //! allocate the message queue structure + messageQ = (palMessageQ_t*)malloc(sizeof(palMessageQ_t)); + if (NULL == messageQ) + { + status = PAL_ERR_NO_MEMORY; + } + + if (PAL_SUCCESS == status) + { + //! allocate the actual memory allocation for the message queue blocks, the size of the memory + //! to allocate was taken from CMSIS header (cmsis_os.h) + messageQ->osMessageQ.pool = (uint32_t*)malloc(PAL_RTOS_MESSAGE_Q_SIZE(messageQSize)); + if (NULL == messageQ->osMessageQ.pool) + { + free(messageQ); + messageQ = NULL; + status = PAL_ERR_NO_MEMORY; + } + else + { + memset(messageQ->osMessageQ.pool, 0, PAL_RTOS_MESSAGE_Q_SIZE(messageQSize)); + messageQ->osMessageQ.queue_sz = messageQSize; ///< number of items (elements) in the queue + + messageQ->messageQID = (uintptr_t)osMessageCreate(&(messageQ->osMessageQ), NULL); + if (NULLPTR == messageQ->messageQID) + { + free(messageQ->osMessageQ.pool); + free(messageQ); + messageQ = NULL; + status = PAL_ERR_GENERIC_FAILURE; + } + else + { + *messageQID = (palMessageQID_t)messageQ; + } + } + } + return status; +} + +palStatus_t pal_plat_osMessagePut(palMessageQID_t messageQID, uint32_t info, uint32_t timeout) +{ + palStatus_t status = PAL_SUCCESS; + osStatus platStatus = osOK; + palMessageQ_t* messageQ = NULL; + + if(NULLPTR == messageQID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + messageQ = (palMessageQ_t*)messageQID; + platStatus = osMessagePut((osMessageQId)messageQ->messageQID, info, timeout); + if (osOK == platStatus) + { + status = PAL_SUCCESS; + } + else + { + status = PAL_RTOS_TRANSLATE_CMSIS_ERROR_CODE(platStatus); + } + + return status; +} + +palStatus_t pal_plat_osMessageGet(palMessageQID_t messageQID, uint32_t timeout, uint32_t* messageValue) +{ + palStatus_t status = PAL_SUCCESS; + osEvent event; + palMessageQ_t* messageQ = NULL; + + if (NULLPTR == messageQID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + messageQ = (palMessageQ_t*)messageQID; + event = osMessageGet((osMessageQId)messageQ->messageQID, timeout); + + if ((messageValue != NULL) && (osEventMessage == event.status)) + { + *messageValue = event.value.v; + status = PAL_SUCCESS; + } + else if (osEventTimeout == event.status) + { + status = PAL_ERR_RTOS_TIMEOUT; + } + else if (osErrorParameter == event.status) + { + status = PAL_ERR_RTOS_PARAMETER; + } + else if (osOK == event.status) + { + status = PAL_ERR_GENERIC_FAILURE; + } + + return status; +} + + +palStatus_t pal_plat_osMessageQueueDestroy(palMessageQID_t* messageQID) +{ + palStatus_t status = PAL_SUCCESS; + palMessageQ_t* messageQ = NULL; + + if(NULL == messageQID || NULLPTR == *messageQID) + { + return PAL_ERR_INVALID_ARGUMENT; + } + + messageQ = (palMessageQ_t*)*messageQID; + free(messageQ->osMessageQ.pool); + free(messageQ); + *messageQID = NULLPTR; + return status; +} + + +int32_t pal_plat_osAtomicIncrement(int32_t* valuePtr, int32_t increment) +{ + if (increment >= 0) + { + return core_util_atomic_incr_u32((uint32_t*)valuePtr, increment); + } + else + { + return core_util_atomic_decr_u32((uint32_t*)valuePtr, 0 - increment); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Source/Port/Reference-Impl/mbedOS/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/BUILD_TEST_mbedOS.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,163 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + + +########################################################################### +# Define test targets based on PROJECT +# Make files that include this must define PROJECT and TARGET_PLATFORM +# Requirements +# - mbed-cli must be installed +# - MORPHEUS_ROOT must be defined ( e.g. $(PAL_ROOT)/mbed-os) +# +# To install mbed-os the following may help: +#pip uninstall mbed-cli +#cd mbed-client-pal +#mbed new +#mbed deploy +#mbed config root mbed-client-pal/mbed-os +#cd mbed-os +#sudo pip install -r core/requirements.txt +#sudo pip install -U colorama +#sudo pip install -U jinja2 +#mbed remove frameworks/unity +# +# The following targets may also be defined: +# $(PROJECT)_ADDITIONAL_SOURCES +# +# Clive Bluston +########################################################################### + +# Add targets for platform/project combination +.PHONY: $(TARGET_PLATFORM)_all $(TARGET_PLATFORM)_clean $(TARGET_PLATFORM)_check +$(TARGET_PLATFORM)_all: $(TARGET_PLATFORM)_$(PROJECT) +$(TARGET_PLATFORM)_clean: $(TARGET_PLATFORM)_clean_$(PROJECT) +$(TARGET_PLATFORM)_check: $(TARGET_PLATFORM)_check_$(PROJECT) + +# Process command line argument of the form INCLUDE=, in order to pass it to the compilation. +# One or more tests can be selected in this way. If the argument is not present then all tests are selected. +$(info PAL_TEST=$(PAL_TEST)) +ifeq ($(strip $(PAL_TEST)),) + CC_TESTS = PAL_INCLUDE=1 +else + CC_TESTS = PAL_INCLUDE=0 $(patsubst %,%=1, $(PAL_TEST)) +endif + +# Define variables to be used in the recipes of the targets in the context of the main target. +# We do this because the original variables will be overridden by other make files by the time the +# recipe is executed. Note that these variables are recursively inherited by all prerequisites. +$(TARGET_PLATFORM)_$(PROJECT) : MORPHEUS_CC_TESTS_D := $(patsubst %,-D%, $(CC_TESTS)) +################################################################################################################# +# Target platform dependant definitions. +# All os references relative to the root. +# Can define a MBEDOS_ROOT somewhere else + +ifeq ($(strip $(MBEDOS_ROOT)),) + MORPHEUS_ROOT := $(PAL_ROOT)/Test +else + MORPHEUS_ROOT := $(strip $(MBEDOS_ROOT)) +endif + + +ifeq ($(DEBUG), 1) + $(info "DEBUG") + $(TARGET_PLATFORM)_$(PROJECT) : DEBUG_FLAGS += -DDEBUG +endif + +ifeq ($(PAL_IGNORE_UNIQUE_THREAD_PRIORITY), 1) + $(info "PAL_IGNORE_UNIQUE_THREAD_PRIORITY") + $(TARGET_PLATFORM)_$(PROJECT) : DEBUG_FLAGS += -DPAL_IGNORE_UNIQUE_THREAD_PRIORITY +endif + +ifeq ($(VERBOSE), 1) + $(info "VERBOSE") + $(TARGET_PLATFORM)_$(PROJECT) : DEBUG_FLAGS += -DVERBOSE +endif + +################################################################################################################# + +### UNITY FILES ### +UNITY_ROOT=$(PAL_ROOT)/Test/Unity +UNITY_INCLUDE_PATHS=$(UNITY_ROOT)/src $(UNITY_ROOT)/extras/fixture/src +INCLUDE_PATHS = $(UNITY_INCLUDE_PATHS) $(PAL_ROOT)/Source/PAL-Impl/Services-API $(PAL_ROOT)/Source/Port/Platform-API $(PAL_ROOT)/Test/Common +# mbed compile command searches include folders for c files, so it will find unity c files +# If we were to specify them here, they would be muliply defined. +UNITY_OBJECTS = +#UNITY_OBJECTS = $(UNITY_ROOT)/src/unity.c $(UNITY_ROOT)/extras/fixture/src/unity_fixture.c +################### + +# Add this optional file to the dependencies only if it exists. +ifneq ("$(wildcard $(PAL_ROOT)/Test/Common/$(PROJECT)_test_utils.c)","") +# mbed compile command searches include folders for c files, so it will find /Test/Common c files +# If we were to specify them here, they would be muliply defined. +# $(PROJECT)_ADDITIONAL_SOURCES += $(PAL_ROOT)/Test/Common/$(PROJECT)_test_utils.c +endif + +# Fixed list of test files for each test executable. +TST_SOURCES:= $(INCLUDE_PATHS) \ + $(UNITY_OBJECTS) \ + $(MORPHEUS_ROOT)/mbed-os \ + $(PAL_ROOT)/Test/$(TYPE)/$(PROJECT)_test.c \ + $(PAL_ROOT)/Test/$(TYPE)/$(PROJECT)_test_runner.c \ + $(PAL_ROOT)/Test/$(TYPE)/$(PROJECT)_test_main_$(TARGET_PLATFORM).cpp \ + $($(PROJECT)_ADDITIONAL_SOURCES) +ifeq ($(findstring HAS_UPDATE,$(TARGET_CONFIGURATION_DEFINES)),HAS_UPDATE) +TST_SOURCES:= $(TST_SOURCES) \ + $(MORPHEUS_ROOT)/storage-volume-manager \ + $(MORPHEUS_ROOT)/storage-abstraction/ \ + $(MORPHEUS_ROOT)/mbed-client-libservice \ + $(MORPHEUS_ROOT)/mbed-trace/ + +endif + +# Build executables and listings. +.PHONY: $(TARGET_PLATFORM)_$(PROJECT) +$(TARGET_PLATFORM)_$(PROJECT): $(MORPHEUS_ROOT) $(OUTOBJ) $(OUT)/$(PROJECT).bin + +$(TARGET_PLATFORM)_$(PROJECT): MORPHEUS_ROOT:=$(MORPHEUS_ROOT) + + +$(OUT)/$(PROJECT).bin: $(TST_SOURCES) + # Always remove the test runner since PAL_TEST argument change requires that it is recompiled + $(RM) $(dir $@)obj/$(PROJECT)_test_runner.o + # Ignore some mbed libraries in the subsequent build. (The minus ignores the error if the library does not exist) + -$(ECHO) "*" > $(strip $(MORPHEUS_ROOT))/mbed-os/features/frameworks/unity/.mbedignore + # Morpheus build. + mbed compile -v -N ../$(notdir $(basename $@)) --build $(dir $@)obj -t GCC_ARM -m K64F $(addprefix --source=, $^) $(MORPHEUS_CC_TESTS_D) $(DEBUG_FLAGS) + +# Create a list of files to delete for each target on the first pass of the make +$(TARGET_PLATFORM)_clean_$(PROJECT) : OUTPUTS:= $(OUT) + + +# Remove files in the list $(PROJECT)_OUTPUTS. +# We dynamically create the list variable from the target +PHONY: $(TARGET_PLATFORM)_clean_$(PROJECT) +$(TARGET_PLATFORM)_clean_$(PROJECT): + $(RM) $(OUTPUTS) + +# Check that the script exists +$(PAL_ROOT)/Test/Scripts/perform_test_mbedos.py: + +# This makes sure anyone who is dependant on it always executes its recipe +.FORCE: + +# Always run the test. +$(OUT)/$(PROJECT)_result.txt: $(PAL_ROOT)/Test/Scripts/perform_test_mbedOS.py $(TARGET_PLATFORM)_$(PROJECT) $(OUT)/$(PROJECT).bin .FORCE + # Install and run the test. Pass script and binary file. + python $(word 1, $^) $(word 3, $^) + +# check. Install and run tests +.PHONY: $(TARGET_PLATFORM)check_$(PROJECT) +$(TARGET_PLATFORM)_check_$(PROJECT): $(OUT)/$(PROJECT)_result.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Common/pal_rtos_test_utils.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,279 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "pal_rtos_test_utils.h" +#include "pal_rtos.h" +#include "unity_fixture.h" + +#include "pal.h" + +threadsArgument_t threadsArg; +timerArgument_t timerArgs; + +void palThreadFunc1(void const *argument) +{ + palThreadID_t threadID = 10; + uint32_t* threadStorage = NULL; + threadsArgument_t *tmp = (threadsArgument_t*)argument; +#ifdef MUTEX_UNITY_TEST + palStatus_t status = PAL_SUCCESS; + TEST_PRINTF("palThreadFunc1::before mutex\n"); + status = pal_osMutexWait(mutex1, 100); + TEST_PRINTF("palThreadFunc1::after mutex: 0x%08x\n", status); + TEST_PRINTF("palThreadFunc1::after mutex (expected): 0x%08x\n", PAL_ERR_RTOS_TIMEOUT); + TEST_ASSERT_EQUAL(PAL_ERR_RTOS_TIMEOUT, status); + return; // for Mutex scenario, this should end here +#endif //MUTEX_UNITY_TEST + + tmp->arg1 = 10; + + threadID = pal_osThreadGetId(); + TEST_PRINTF("palThreadFunc1::Thread ID is %d\n", threadID); + + threadStorage = pal_osThreadGetLocalStore(); + if (threadStorage == g_threadStorage) + { + TEST_PRINTF("Thread storage updated as expected\n"); + } + TEST_ASSERT_EQUAL(threadStorage, g_threadStorage); +#ifdef MUTEX_UNITY_TEST + status = pal_osMutexRelease(mutex1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +#endif //MUTEX_UNITY_TEST + TEST_PRINTF("palThreadFunc1::STAAAAM\n"); + +} + +void palThreadFunc2(void const *argument) +{ + + palThreadID_t threadID = 10; + threadsArgument_t *tmp = (threadsArgument_t*)argument; +#ifdef MUTEX_UNITY_TEST + palStatus_t status = PAL_SUCCESS; + TEST_PRINTF("palThreadFunc2::before mutex\n"); + status = pal_osMutexWait(mutex2, 300); + TEST_PRINTF("palThreadFunc2::after mutex: 0x%08x\n", status); + TEST_PRINTF("palThreadFunc2::after mutex (expected): 0x%08x\n", PAL_SUCCESS); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +#endif //MUTEX_UNITY_TEST + + tmp->arg2 = 20; + + threadID = pal_osThreadGetId(); + TEST_PRINTF("palThreadFunc2::Thread ID is %d\n", threadID); +#ifdef MUTEX_UNITY_TEST + status = pal_osMutexRelease(mutex2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +#endif //MUTEX_UNITY_TEST + TEST_PRINTF("palThreadFunc2::STAAAAM\n"); +} + +void palThreadFunc3(void const *argument) +{ + + palThreadID_t threadID = 10; + threadsArgument_t *tmp = (threadsArgument_t*)argument; + +#ifdef SEMAPHORE_UNITY_TEST + palStatus_t status = PAL_SUCCESS; + uint32_t semaphoresAvailable = 10; + status = pal_osSemaphoreWait(semaphore1, 200, &semaphoresAvailable); + + if (PAL_SUCCESS == status) + { + TEST_PRINTF("palThreadFunc3::semaphoresAvailable: %d\n", semaphoresAvailable); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + } + else if(PAL_ERR_RTOS_TIMEOUT == status) + { + TEST_PRINTF("palThreadFunc3::semaphoresAvailable: %d\n", semaphoresAvailable); + TEST_PRINTF("palThreadFunc3::status: 0x%08x\n", status); + TEST_PRINTF("palThreadFunc3::failed to get Semaphore as expected\n", status); + TEST_ASSERT_EQUAL(PAL_ERR_RTOS_TIMEOUT, status); + return; + } + pal_osDelay(6000); +#endif //SEMAPHORE_UNITY_TEST + tmp->arg3 = 30; + threadID = pal_osThreadGetId(); + TEST_PRINTF("palThreadFunc3::Thread ID is %d\n", threadID); + +#ifdef SEMAPHORE_UNITY_TEST + status = pal_osSemaphoreRelease(semaphore1); + TEST_PRINTF("palThreadFunc3::pal_osSemaphoreRelease res: 0x%08x\n", status); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +#endif //SEMAPHORE_UNITY_TEST + TEST_PRINTF("palThreadFunc3::STAAAAM\n"); +} + +void palThreadFunc4(void const *argument) +{ + palThreadID_t threadID = 10; + threadsArgument_t *tmp = (threadsArgument_t*)argument; +#ifdef MUTEX_UNITY_TEST + palStatus_t status = PAL_SUCCESS; + TEST_PRINTF("palThreadFunc4::before mutex\n"); + status = pal_osMutexWait(mutex1, 200); + TEST_PRINTF("palThreadFunc4::after mutex: 0x%08x\n", status); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + pal_osDelay(3500); //wait 3.5 seconds to make sure that the next thread arrive to this point +#endif //MUTEX_UNITY_TEST + + + tmp->arg4 = 40; + + threadID = pal_osThreadGetId(); + TEST_PRINTF("Thread ID is %d\n", threadID); + + + +#ifdef MUTEX_UNITY_TEST + status = pal_osMutexRelease(mutex1); + TEST_PRINTF("palThreadFunc4::after release mutex: 0x%08x\n", status); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +#endif //MUTEX_UNITY_TEST + TEST_PRINTF("palThreadFunc4::STAAAAM\n"); +} + +void palThreadFunc5(void const *argument) +{ + palThreadID_t threadID = 10; + threadsArgument_t *tmp = (threadsArgument_t*)argument; +#ifdef MUTEX_UNITY_TEST + palStatus_t status = PAL_SUCCESS; + TEST_PRINTF("palThreadFunc5::before mutex\n"); + status = pal_osMutexWait(mutex1, 4500); + TEST_PRINTF("palThreadFunc5::after mutex: 0x%08x\n", status); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +#endif //MUTEX_UNITY_TEST + tmp->arg5 = 50; + + threadID = pal_osThreadGetId(); + TEST_PRINTF("Thread ID is %d\n", threadID); +#ifdef MUTEX_UNITY_TEST + status = pal_osMutexRelease(mutex1); + TEST_PRINTF("palThreadFunc5::after release mutex: 0x%08x\n", status); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +#endif //MUTEX_UNITY_TEST + TEST_PRINTF("palThreadFunc5::STAAAAM\n"); +} + +void palThreadFunc6(void const *argument) +{ + palThreadID_t threadID = 10; + threadsArgument_t *tmp = (threadsArgument_t*)argument; +#ifdef SEMAPHORE_UNITY_TEST + palStatus_t status = PAL_SUCCESS; + uint32_t semaphoresAvailable = 10; + status = pal_osSemaphoreWait(123456, 200, &semaphoresAvailable); //MUST fail, since there is no semaphore with ID=3 + TEST_PRINTF("palThreadFunc6::semaphoresAvailable: %d\n", semaphoresAvailable); + TEST_ASSERT_EQUAL(PAL_ERR_RTOS_PARAMETER, status); + return; +#endif //SEMAPHORE_UNITY_TEST + tmp->arg6 = 60; + + threadID = pal_osThreadGetId(); + TEST_PRINTF("Thread ID is %d\n", threadID); +#ifdef SEMAPHORE_UNITY_TEST + status = pal_osSemaphoreRelease(123456); + TEST_PRINTF("palThreadFunc6::pal_osSemaphoreRelease res: 0x%08x\n", status); + TEST_ASSERT_EQUAL(PAL_ERR_RTOS_PARAMETER, status); +#endif //SEMAPHORE_UNITY_TEST + TEST_PRINTF("palThreadFunc6::STAAAAM\n"); +} + + +void palTimerFunc1(void const *argument) +{ + g_timerArgs.ticksInFunc1 = pal_osKernelSysTick(); + TEST_PRINTF("ticks in palTimerFunc1: 0 - %d\n", g_timerArgs.ticksInFunc1); + TEST_PRINTF("Once Timer function was called\n"); +} + +void palTimerFunc2(void const *argument) +{ + g_timerArgs.ticksInFunc2 = pal_osKernelSysTick(); + TEST_PRINTF("ticks in palTimerFunc2: 0 - %d\n", g_timerArgs.ticksInFunc2); + TEST_PRINTF("Periodic Timer function was called\n"); +} + +void palThreadFuncCustom1(void const *argument) +{ + TEST_PRINTF("palThreadFuncCustom1 was called\n"); +} + +void palThreadFuncCustom2(void const *argument) +{ + TEST_PRINTF("palThreadFuncCustom2 was called\n"); +} + +void palThreadFuncCustom3(void const *argument) +{ + TEST_PRINTF("palThreadFuncCustom3 was called\n"); +} + +void palThreadFuncCustom4(void const *argument) +{ + TEST_PRINTF("palThreadFuncCustom4 was called\n"); +} + +void palRunThreads() +{ + palStatus_t status = PAL_SUCCESS; + palThreadID_t threadID1 = NULLPTR; + palThreadID_t threadID2 = NULLPTR; + palThreadID_t threadID3 = NULLPTR; + palThreadID_t threadID4 = NULLPTR; + palThreadID_t threadID5 = NULLPTR; + palThreadID_t threadID6 = NULLPTR; + + uint32_t *stack1 = malloc(THREAD_STACK_SIZE); + uint32_t *stack2 = malloc(THREAD_STACK_SIZE); + uint32_t *stack3 = malloc(THREAD_STACK_SIZE); + uint32_t *stack4 = malloc(THREAD_STACK_SIZE); + uint32_t *stack5 = malloc(THREAD_STACK_SIZE); + uint32_t *stack6 = malloc(THREAD_STACK_SIZE); + + status = pal_init(NULL); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFunc1, &g_threadsArg, PAL_osPriorityIdle, THREAD_STACK_SIZE, stack1, (palThreadLocalStore_t *)g_threadStorage, &threadID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFunc2, &g_threadsArg, PAL_osPriorityLow, THREAD_STACK_SIZE, stack2, NULL, &threadID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFunc3, &g_threadsArg, PAL_osPriorityNormal, THREAD_STACK_SIZE, stack3, NULL, &threadID3); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFunc4, &g_threadsArg, PAL_osPriorityBelowNormal, THREAD_STACK_SIZE, stack4, NULL, &threadID4); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFunc5, &g_threadsArg, PAL_osPriorityAboveNormal, THREAD_STACK_SIZE, stack5, NULL, &threadID5); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFunc6, &g_threadsArg, PAL_osPriorityHigh, THREAD_STACK_SIZE, stack6, NULL, &threadID6); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + + free(stack1); + free(stack2); + free(stack3); + free(stack4); + free(stack5); + free(stack6); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Common/pal_rtos_test_utils.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#ifndef _PAL_RTOS_TEST_UTILS_H +#define _PAL_RTOS_TEST_UTILS_H + +#include "pal_types.h" +#include "pal_rtos.h" +#include "pal_test_utils.h" + +#define THREAD_STACK_SIZE 1024*sizeof(uint32_t) + +typedef struct threadsArgument{ + uint32_t arg1; + uint32_t arg2; + uint32_t arg3; + uint32_t arg4; + uint32_t arg5; + uint32_t arg6; + uint32_t arg7; +}threadsArgument_t; + + +extern threadsArgument_t g_threadsArg; + +extern uint32_t g_threadStorage[20]; + +void palThreadFunc1(void const *argument); +void palThreadFunc2(void const *argument); +void palThreadFunc3(void const *argument); +void palThreadFunc4(void const *argument); +void palThreadFunc5(void const *argument); +void palThreadFunc6(void const *argument); + + +typedef struct timerArgument{ + uint32_t ticksBeforeTimer; + uint32_t ticksInFunc1; + uint32_t ticksInFunc2; +}timerArgument_t; + +extern timerArgument_t g_timerArgs; + +void palTimerFunc1(void const *argument); +void palTimerFunc2(void const *argument); + + +void palThreadFuncCustom1(void const *argument); +void palThreadFuncCustom2(void const *argument); +void palThreadFuncCustom3(void const *argument); +void palThreadFuncCustom4(void const *argument); + + +#define MEMORY_POOL1_BLOCK_SIZE 32 +#define MEMORY_POOL1_BLOCK_COUNT 5 +#define MEMORY_POOL2_BLOCK_SIZE 12 +#define MEMORY_POOL2_BLOCK_COUNT 4 + +extern palMutexID_t mutex1; +extern palMutexID_t mutex2; + +extern palSemaphoreID_t semaphore1; + +#endif //_PAL_RTOS_TEST_UTILS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Common/pal_socket_test_utils.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "pal.h" +#include "pal_network.h" +#include "pal_socket_test_utils.h" +#include "NetworkInterface.h" +#include "EthernetInterface.h" + +#define TEST_PRINTF printf + +void* palTestGetNetWorkInterfaceContext() +{ + palStatus_t result = PAL_SUCCESS; + EthernetInterface* netInterface = new EthernetInterface(); + if (NULL != netInterface) + { + TEST_PRINTF("new interface created\r\n"); + result = netInterface->connect(); + if (PAL_SUCCESS == result) + { + TEST_PRINTF("interface registered : OK \r\n"); + } + } + return netInterface; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Common/pal_socket_test_utils.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#ifndef _PAL_SOCKET_TEST_UTILS_H +#define _PAL_SOCKET_TEST_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +void* palTestGetNetWorkInterfaceContext(); + +#ifdef __cplusplus +} +#endif + +#endif //_PAL_SOCKET_TEST_UTILS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Common/pal_test_utils.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#ifndef TEST_UNITEST_PAL_TEST_UTILS_H_ +#define TEST_UNITEST_PAL_TEST_UTILS_H_ + + +#define TEST_PRINTF(ARGS...) PAL_PRINTF(ARGS) + + +#endif /* TEST_UNITEST_PAL_TEST_UTILS_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,168 @@ +# PAL Test Guide +## Environment Setup +Python 2.7.11 +If you cannot find Python 2.7.11 for your linux you can get it here [Python 2.7.11](https://launchpad.net/~fkrull/+archive/ubuntu/deadsnakes-python2.7) +Install the needed Python modules on Windows like this: +``` +python -m pip install tabulate +python -m pip install pyserial +python -m pip install -U mbed-ls +python -m pip install shell +python -m pip install pypiwin32 +``` +On Linux you install the same modules like this: +``` +sudo pip install <module> +``` + +##Test Code files +Each API has three files under Test/Unitest or Test/Conformance: + +* **pal_socket_test.c** Contains the test code in the form of functions. One function per test. +* **pal_ socket _test_runner.c** Runs the test functions defined above. +* **pal_ socket _test_main_mbedos.c** Main application that runs all the tests. May also have test specific initializations for the given target platform. + +Each API can also have a common utilities file under Test/Common +**pal_socket_test_utils.c/.h** Utility functions that can be used in various pal_socket test apps. +**pal_socket_test.c** +Contains tests of the form: + +``` +#include "pal_socket.h" +#include "unity.h" +#include "unity_fixture.h" + +TEST(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue) +{ + //This should be true because setUp set this up for us before this test + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); + + //This should be true because we can still change our answer + Counter = 0x1234; + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +} +``` +**pal_ socket _test_runner.c** +Looks like this: +``` +#include "unity.h" +#include "unity_fixture.h" // pal Socket API tests + +TEST_GROUP_RUNNER(pal_socket) +{ +#if (PAL_INCLUDE || FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode) + RUN_TEST_CASE(pal_socket, FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode); +#endif +#if (PAL_INCLUDE || FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken) + RUN_TEST_CASE(pal_socket, FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken); +#endif +#if (PAL_INCLUDE || FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue) + RUN_TEST_CASE(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue); +#endif +#if (PAL_INCLUDE || FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain) + RUN_TEST_CASE(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain); +#endif +#if (PAL_INCLUDE || FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed) + RUN_TEST_CASE(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed); +#endif} +``` + + +**pal_ socket _test_main_mbedos.c** +This can vary a lot from platform to platform and test to test, but will contain lines like the following to run the tests: +``` +extern "C" int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); +extern "C" void TEST_pal_socket_GROUP_RUNNER(void); + + // Run a group of tests + UnityMain(0, argv, TEST_pal_socket_GROUP_RUNNER); +``` + +â +## Test makefile framework +**makefile** â Master make file. It has an entry for each platform target. Includes all_tests.mk. +Configuration specific defines are declared as follows and converted to compilation defines on the compilation command line. +**TARGET_CONFIGURATION_DEFINES:= HAS_RTOS HAS_FS** +They can be also be used to as conditionals in the make file as shown in all_tests.mk +``` +include make_platform.mk + + +.PHONY: all clean check + +#==================================================== +# Platform mbed-os +TARGET_PLATFORM:=mbedosClassic +TARGET_CONFIGURATION_DEFINES:= HAS_RTOS +all: mbedosClassic_all +check: mbedosClassic_check +clean: mbedosClassic_clean +include all_tests.mk +#==================================================== +# Platform morpheus +TARGET_PLATFORM:=mbedOS +TARGET_CONFIGURATION_DEFINES:= HAS_RTOS +all: mbedOS_all +check: mbedOS_check +clean: mbedOS_clean +include all_tests.mk +#==================================================== +``` +**make_platform.mk** â Detects the make platform (Windows, Linux) and sets various definitions accordingly. These are referred to by other make files in order to keep them platform independent. +**all_tests.mk** â contains an entry for each test application to be built. Included by all target platform make files. It looks like this: +``` +#==================================================== +PROJECT=pal_socket +TYPE=Unity + +$(PROJECT)_ADDITIONAL_ SOURCES:= + +include BUILD_TEST.mk +#==================================================== +ifeq ($(findstring HAS_RTOS,$(TARGET_CONFIGURATION_DEFINES)),HAS_RTOS) +PROJECT=pal_rtos +TYPE=Unitest + +$(PROJECT)_ADDITIONAL_SOURCES:=Source/PAL-Impl/Modules/RTOS/$(PROJECT).c \ + Source/PAL-Impl/Modules/RTOS/$(PROJECT)_static_definitions_sample.c \ + Source/Port/Reference-Impl/mbedOS/pal_plat_rtos.c + + +include BUILD_TEST_$(TARGET_PLATFORM).mk +endif +#==================================================== +``` +**BUILD_TEST_BUILD_TEST_mbedOS.mk, BUILD_TEST_FreeRTOS.mk** â Target platform specific make definitions and rules. Defines targets for building the tests. Included for each test that is to be built. +##Usage: +###Make all tests for all platforms: +**make** +or make all tests for a specific platform: +**make mbedOS_all** +**make FreeRTOS_all** + +### To make and run one set of tests: +**make mbedOS_pal_socket** + +### To make and run only one test from a set: +**make mbedOS_pal_socket** PAL_TEST=âFindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCodeâ +To make a binary that just runs two tests from a set: +**make mbedOS_pal_socket PAL_TEST=âFindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBrokenâ** +Note: If you change the argument PAL_TEST, then you will need to force a rebuild with âB. + +### To run all tests: +**make mbedOS_check** +### Run a specific test: +**make mbedOS_check_pal_socket** +â +## Eclipse +It is possible to use the Build command from eclipse. +First set it up to run make as follows. Note that the build directory points to Test: + +![ARMGCC_DIR](eclipseBuildDialog.png) + +You can control which target you build in the next tab by changing all and clean. + +![ARMGCC_DIR](eclipseBuildDialog2.png) + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Scripts/mbed.py Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,328 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + +import os +import shutil +from time import sleep, strftime +import serial +import re +import sys + + +class MbedDeviceManager: + def __init__(self): + try: + import mbed_lstools + except ImportError, e: + print("Error: Can't import 'mbed_lstools' module: %s"% e) + mbed = mbed_lstools.create() + self.mbed_list = mbed.list_mbeds() + for dev in self.mbed_list: + dev['Available'] = True + # part. structure:{'mount_point': 'D:','serial_port': u'COM3','platform_name': 'LPC1768','Available'=True} + + def dump_all_devices(self): + print("dump Devices:") + print(self.mbed_list) + + + def get_device(self, platform_type): + found = False + index = int(-1) + mount_point = None + serial_port = None + print(platform_type) + for idx,dev in enumerate(self.mbed_list): + if dev['platform_name'] == platform_type: + found = True + if dev['platform_name'] == platform_type and dev['Available']: + mount_point = dev['mount_point'] + serial_port = dev['serial_port'] + print('Detected %s. Mount point %s Serial port %s index %s.' + % (platform_type, mount_point, serial_port, idx)) + dev['Available'] = False + return idx, mount_point, serial_port + if found: + print('Device %s is not available already in use.' %platform_type) + else: + print('Device %s is not found.' %platform_type) + return index, mount_point, serial_port + + def free_device(self, index): + dev = self.mbed_list[index] + if not dev['Available']: + dev['Available'] = True + print('Release Device %s : %s .' % (index, dev['platform_name'])) + else: + print('Error: Device %s : %s is already free.' % (index, dev['platform_name']), ) + +mbed_manager = MbedDeviceManager() + +class MBED: + def __init__(self,platform_type): + self.manager = mbed_manager + self.platform_type = platform_type + self.mount_point = None + self.serial_port = None + self.index = -1 + self.running = False + + def detect(self): + self.index, self.mount_point, self.serial_port = self.manager.get_device(self.platform_type) + if self.index >= 0: + return True + else: + return False + + def generic_mbed_copy_win(self, source, destination): + + + from win32com.shell import shell, shellcon + import pythoncom + from os.path import abspath, join + from glob import glob + + for f in glob(join(destination, '*.bin')): + os.unlink(f) + + src = shell.SHCreateItemFromParsingName(source, None, shell.IID_IShellItem) + dest_dir = shell.SHCreateItemFromParsingName( + abspath(destination), + None, + shell.IID_IShellItem + ) + pfo = pythoncom.CoCreateInstance( + shell.CLSID_FileOperation, + None, + pythoncom.CLSCTX_ALL, + shell.IID_IFileOperation + ) + pfo.SetOperationFlags(shellcon.FOF_NO_UI) + pfo.CopyItem(src, dest_dir, None, None) + pfo.PerformOperations() + + return True + + def install_bin(self,bin_file_name): + bin_on_mbed = os.path.join(self.mount_point,os.path.basename(bin_file_name)) + print('%s Copying %s --> %s' %(strftime('%H:%M:%S'),bin_file_name,bin_on_mbed)) + if 'win' in sys.platform: + self.generic_mbed_copy_win(os.path.abspath(bin_file_name), os.path.abspath(self.mount_point)) + else: + shutil.copyfile(bin_file_name,bin_on_mbed) + self.wait_for_file_system() + print('%s Bin installation complete' %strftime('%H:%M:%S')) + + def run(self,serial_capture_file_name,baud=9600,read_timeout=10,stop_on_serial_read_timeout=False): + if serial_capture_file_name is not None: + self.stop_on_serial_read_timeout = stop_on_serial_read_timeout + from multiprocessing import Process, Event, Pipe + self.event = Event() + parent_conn, child_conn = Pipe() + print('Start serial capture process') + process_args=(self.serial_port,baud,read_timeout,serial_capture_file_name,stop_on_serial_read_timeout,self.event,child_conn) + self.capture_process = Process(target=capture_serial,args=process_args) + self.capture_process.start() + print('Waiting for pipe input from subprocess') + self.ip,self.port = parent_conn.recv() + if not self.port or not self.ip : + return 1 + + print('Received IP %s port %s'%(self.ip,self.port)) + else: + print('Running without serial capture') + self.ip,self.port = run_no_capture(self.serial_port,baud,read_timeout) + print('%s IP %s port %s' % (self.platform_type, self.ip, self.port)) + self.running = True + + def end_run(self, delete_binaries=True, release_manager=True): + print('MBED end_run') + if self.running: + if not self.stop_on_serial_read_timeout: + self.event.set() # the thread does not stop on its own. send stop signal + print('MBED end_run waiting for subprocess to terminate') + self.capture_process.join() # wait for completion + print('MBED end_run subprocess terminated') + if delete_binaries: + print('MBED end_run deleting binaries') + # delete all binaries on MBED + filelist = [ f for f in os.listdir(self.mount_point) if f.endswith(".bin") ] + for f in filelist: + print('MBED end_run delete %s',f) + os.remove(os.path.join(self.mount_point,f)) + self.wait_for_file_system() + print('MBED end_run binary delete completed') + self.running = False + if release_manager: + self.manager.free_device(self.index) + + def run_and_capture_till_timeout(self,serial_capture_file_name,baud=9600,read_timeout=10,endOfData=None): + try: + print('[%s run_and_capture_till_timeout] Start' %strftime('%H:%M:%S')) + ser = serial.Serial(self.serial_port,baudrate=baud,timeout=read_timeout) + if ser == None: + print(' serial.Serial returned None..') + capture_file = open(serial_capture_file_name,'w') + read_size = 1000 + cont = True + print('[%s run_and_capture_till_timeout] Reseting device..' %strftime('%H:%M:%S')) + c = reset_mbed(ser) + if c == None: + cont = False + else: + capture_file.write(c) + print('[%s run_and_capture_till_timeout] capturing to file...' %strftime('%H:%M:%S')) + while cont: + c = ser.read(read_size) + # Look for the end of test data string and terminate if it is found. + if endOfData != None: + endPos = c.find(endOfData) + # Clip off the termination string and anything afterwards + if endPos != -1: + c = c[:(endPos + len(endOfData))] + capture_file.write(c) + if endPos != -1: + break + if len(c) < read_size: + print('[%s run_and_capture_till_timeout] serial read timeout. Stopping subprocess' %strftime('%H:%M:%S')) + print ("exit last Buffsize " + str(len(c)) + "<32" ) + cont = False + print('[%s run_and_capture_till_timeout] closing capture file' %strftime('%H:%M:%S')) + capture_file.close() + print('[%s run_and_capture_till_timeout] closing serial port' %strftime('%H:%M:%S')) + ser.flushInput() + ser.flushOutput() + ser.close() + print('[%s run_and_capture_till_timeout] done' %strftime('%H:%M:%S')) + return True + except serial.SerialException as e: + print('[run_and_capture_till_timeout] serial exception',e) + return False + + def wait_for_file_system(self): + #sleep(25) #MBED file system takes some 'settling' time after it is wrirtten to + sleep(3) #MBED file system takes some 'settling' time after it is wrirtten to + +def reset_mbed(ser): + for loop in range(5): + # reset called after open port + # add sleep for port ready (we saw that sometimes read failed...) + delay = 5 + print('[%s reset_mbed] loop=%d , delay=%d' %(strftime('%H:%M:%S'), loop, delay)) + sleep(delay) + try: + ser.sendBreak() + except Exception: + # In linux a termios.error is raised in sendBreak and in + # setBreak. The following setBreak() is needed to release + # the reset signal on the target mcu. + try: + ser.setBreak(False) + except: + pass + c = ser.read(1) + if len(c) == 1: + return c + print ("Error reading from serial port" ) + return None + +def is_valid_ip(ip): + return re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",ip) + +def capture_serial(port,baud,read_timeout,capture_file_name,stop_on_serial_read_timeout,event,pipe_conn): + try: + print('[capture_serial subprocess] starting..') + ser = serial.Serial(port,baudrate=baud,timeout=read_timeout) + capture_file = open(capture_file_name,'w') + read_size = 32 + cont = True + print('[capture_serial subprocess] Reseting device..') + c = reset_mbed(ser) + if c == None: + print('[capture_serial subprocess] Reseting device failed') + + if c == None: + cont = False + print('[capture_serial subprocess] Failed to get IP from device... exiting ') + pipe_conn.send([None,None]) # send IP and port + pipe_conn.close() + capture_file.close() + ser.flushInput() + ser.flushOutput() + ser.close() + return + else: + # parse the first received string for IP and port + ip_str = c.split(':') + if is_valid_ip(ip_str[1]) : + pipe_conn.send([ip_str[1],ip_str[2]]) # send IP and port + print('[capture_serial subprocess] Sending IP to main process %s:%s'%(ip_str[1],ip_str[2])) + print('[capture_serial subprocess] capturing to file...') + else: + print('[capture_serial subprocess] No valid IP address') + pipe_conn.send([None,None]) # send IP and port + cont = False + capture_file.write(c) + pipe_conn.close() + + while cont: + c = ser.read(read_size) + capture_file.write(c) + if stop_on_serial_read_timeout: + if len(c) < read_size: + print('[capture_serial subprocess] serial read timeout. Stopping subprocess') + cont = False + else: + if event.is_set(): + print('[capture_serial subprocess] event is set. Stopping subprocess') + cont = False + + print('[capture_serial subprocess] closing capture file') + capture_file.close() + print('[capture_serial subprocess] closing serial port') + ser.flushInput() + ser.flushOutput() + ser.close() + print('[capture_serial subprocess] Subprocess exiting') + except serial.SerialException as e: + print('[capture_serial subprocess] serial exception',e) + +def run_no_capture(port,baud,read_timeout): + try: + ser = serial.Serial(port,baudrate=baud,timeout=read_timeout) + ip = None + port = None + c = reset_mbed(ser) + if c: + # parse the first received string for IP and port + ip_str = c.split(':') + if is_valid_ip(ip_str[1]) != None: + ip = ip_str[1] + port = ip_str[2] + ser.flushInput() + ser.flushOutput() + ser.close() + return ip,port + except serial.SerialException as e: + print e + + +class MBED_DEVICE(MBED): + def __init__(self,platform_type): + print('MBED Device:' + platform_type) + MBED.__init__(self, platform_type) + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Scripts/perform_test_mbedOS.py Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + +##################################################################### +# Install and run PAL tests for mbed targets. +# +# Arguments: One or more binary files containing tests to execute. +# +# Output: <binary file>_result.txt - Textual result summary +# <binary file>.xml - Junit result summary +# ARM +# Clive Bluston +##################################################################### +from mbed import MBED +import os +import sys +import unity_to_junit +from time import sleep + +# Check that at least one test is specified on the command line +if len(sys.argv) < 2: + sys.exit() +else: + tests = sys.argv[1:] + +# List of textual result files. +resultFiles = [] + +# Supported mbed devices. Can add to this list +deviceList = ["K64F"] + +# Loop over attached mbed devices. +for device in deviceList: + mbed = MBED(device) + deviceDetected = mbed.detect() + if deviceDetected: + # Loop over tests + for test in tests: + mbed.install_bin(test) + noSuffix = os.path.splitext(test)[0] + intermediateResultsFile = noSuffix+".int" + # Remove intermediate file just in case it was left over from a failed run. + if os.path.isfile(intermediateResultsFile): + os.remove(intermediateResultsFile) + resultFile = noSuffix+"_result.txt" + # This delay is to allow output that was generated before the reset to be discarded. + sleep(30) + # Capture test results from the serial port + if mbed.run_and_capture_till_timeout(intermediateResultsFile,baud=9600,read_timeout=10,endOfData="***END OF TESTS**"): + # Success. Convert results to Junit format and write to xml file. + unity_to_junit.unity_to_junit("mbedos_" + os.path.basename(noSuffix), intermediateResultsFile, noSuffix+".xml", resultFile) + # Output intermediate results to the console. + with open(intermediateResultsFile, 'r') as fin: + print fin.read() + os.remove(intermediateResultsFile) + # Add result file name to list + resultFiles.append(resultFile) + else: + response = raw_input("Connect Serial port. Enter when ready") + # Clean up. True parameter closes the device opened by mbed.detect() + mbed.end_run(False,True) + + +# Copy result files to standard output +for file in resultFiles: + with open(file, 'r') as fin: + print fin.read() + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Scripts/pyinstall.sh Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + +#On Windows you install the same modules like this: +#python -m pip install tabulate + +sudo pip install tabulate +sudo pip install pyserial +sudo pip install -U mbed-ls +sudo pip install shell +sudo pip install pypiwin32 + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Scripts/unity_to_junit.py Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,172 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + +import re +import sys +from tabulate import tabulate + +def extract_tags(logLines): + + # These are the Unity tag names we are going to look for. + tagNames = [ + "UnityTest", + "UnityIgnoredTest", + "UnityResult", + ] + + # All tags will end up here. + tags = [] + + for tagName in tagNames: + + # Fetch start and end locations for the start and end markers. + + startMatches = re.finditer(re.escape("<***" + tagName + "***>"), logLines) + endMatches = re.finditer(re.escape("</***" + tagName + "***>"), logLines) + + startOffsets = [match.end() for match in startMatches] + endOffsets = [match.start() - 1 for match in endMatches] + + # If the amount of start and end markers isn't identical, this is an error. + if len(startOffsets) != len(endOffsets): + raise Exception("For tag '" + tagName + "', start and end tags do not match!") + + # Append all found tags to the tags list. + for tagOffsets in zip(startOffsets, endOffsets): + tagContent = logLines[tagOffsets[0]: tagOffsets[1] + 1] + tags.append((tagOffsets[0], tagName, tagContent)) + + # Sort the tags list by the offset. + tags.sort(key=lambda tag_: tag_[0]) + + # Throw away the offset (once sorted, it is no longer needed). + tags = [tag[1:] for tag in tags] + + # At this point we are left with list of tags, each one a pair, consisting of + # (group name, test name, status). + return tags + +def get_test_group_and_name(printableName): + match = re.match(r"TEST\((.*), (.*)\)", printableName) + if match is not None: + return match.group(1), match.group(2) + else: + raise Exception("Erorr parsing test group and name") + +def get_ignored_test_group_and_name(printableName): + match = re.match(r"IGNORE_TEST\((.*), (.*)\)", printableName) + if match is not None: + return match.group(1), match.group(2) + else: + raise Exception("Erorr parsing test group and name") + +def collect_tests(tags): + + tests = [] + + # Build the list of tests, with status for each. + curTest = "" + resultHandled = False + for tag in tags: + + tagName = tag[0] + tagValue = tag[1] + + if tagName == "UnityTest": + curTest = get_test_group_and_name(tagValue) + resultHandled = False + elif tagName == "UnityResult": + if not resultHandled: + tests.append((curTest, tagValue)) + resultHandled = True + elif tagName == "UnityIgnoredTest": + curTest = get_ignored_test_group_and_name(tagValue) + tests.append((curTest, "IGNORE")) + else: + raise Exception("Unknown tag '" + tagName + "' encountered") + + return tests + +def generate_junit_xml_output(packageName, tests, xmlOutFile): + + testsCount = len(tests) + + with open(xmlOutFile, "wt") as f: + print >> f, '<testsuite tests="' + str(testsCount) + '">' + for test in tests: + print >> f, ' <testcase classname="' + packageName + "." + test[0][0] + '" name="' + test[0][1] + '">' + if test[1] == "FAIL": + print >> f, ' <failure/>' + if test[1] == "IGNORE": + print >> f, ' <skipped/>' + print >> f, ' </testcase>' + print >> f, '</testsuite>' + +def generate_text_output(packageName, tests, textOutFile): + + testsCount = len(tests) + + failingTests = 0 + passedTests = 0 + ignoredTests = 0 + + testsTable = [] + for test in tests: + if test[1] == "FAIL": + failingTests += 1 + if test[1] == "PASS": + passedTests += 1 + if test[1] == "IGNORE": + ignoredTests += 1 + + testsTable.append([test[0][0], test[0][1], test[1]]) + + resultsTableHeader = ["TOTAL", "PASS", "FAIL", "IGNORE"] + resultsTable = [[str(testsCount), str(passedTests), str(failingTests), str(ignoredTests)]] + + with open(textOutFile, "wt") as f: + + print >> f, "==== " + packageName + " ====" + print >> f, tabulate(testsTable) + print >> f, tabulate(resultsTable, headers=resultsTableHeader) + + if testsCount == 0 or failingTests > 0: + finalStatus = "FAIL" + else: + finalStatus = "PASS" + print >> f + print >> f, "Final status: " + finalStatus + "." + +def unity_to_junit(packageName, inputFile, xmlOutFile, textOutFile): + + with open(inputFile, "rt") as f: + logLines = f.read() + + tags = extract_tags(logLines) + tests = collect_tests(tags) + + generate_junit_xml_output(packageName, tests, xmlOutFile) + generate_text_output(packageName, tests, textOutFile) + + +if __name__ == "__main__": + + if len(sys.argv) != 5: + print "Usage: <package-name> <input-file> <xml-out-file> <text-out-file>" + sys.exit(1) + + unity_to_junit(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL Test Guide +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_all_test.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,22 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "unity.h" +#include "unity_fixture.h" + +/*empty file to supprt make file*/ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_all_test_main_mbedOS.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "mbed.h" + + +extern "C" int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); + +extern "C" void TEST_pal_update_GROUP_RUNNER(void); +extern "C" void TEST_pal_rtos_GROUP_RUNNER(void); +extern "C" void TEST_pal_socket_GROUP_RUNNER(void); + +void TEST_pal_all_GROUPS_RUNNER(void) +{ + TEST_pal_rtos_GROUP_RUNNER(); + TEST_pal_socket_GROUP_RUNNER(); +} + + +int main(int argc, const char * argv[]) +{ + const char * myargv[] = {"app","-v"}; + + printf("Start tests\r\n"); + fflush(stdout); + + UnityMain(sizeof(myargv)/sizeof(myargv[0]), myargv, TEST_pal_all_GROUPS_RUNNER); + + // This is detected by test runner app, so that it can know when to terminate without waiting for timeout. + printf("***END OF TESTS**\n");for(int i=0;i<1000;i++)putchar('x'); + fflush(stdout); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_all_test_runner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "unity.h" +#include "unity_fixture.h" + + +/*empty file to supprt make file*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_rtos_test.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,413 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "pal_rtos.h" +#include "unity.h" +#include "unity_fixture.h" +#include "pal_rtos_test_utils.h" +#include "pal.h" +#include "pal_rtos_test_utils.h" + +TEST_GROUP(pal_rtos); + +//sometimes you may want to get at local data in a module. +//for example: If you plan to pass by reference, this could be useful +//however, it should often be avoided +//extern int Counter; +uint32_t g_threadStorage[20] = { 0 }; +threadsArgument_t g_threadsArg = {0}; +timerArgument_t g_timerArgs = {0}; +palMutexID_t mutex1 = NULLPTR; +palMutexID_t mutex2 = NULLPTR; +palSemaphoreID_t semaphore1 = NULLPTR; + +//forward declarations +void palRunThreads(); + + +TEST_SETUP(pal_rtos) +{ + //This is run before EACH TEST + //Counter = 0x5a5a; +} + +TEST_TEAR_DOWN(pal_rtos) +{ +} + +TEST(pal_rtos, pal_osKernelSysTick_Unity) +{ + uint32_t tick1 = 0, tick2 = 0; + tick1 = pal_osKernelSysTick(); + tick2 = pal_osKernelSysTick(); + + TEST_ASSERT_TRUE(tick2 != tick1); +} + +TEST(pal_rtos, pal_osKernelSysTick64_Unity) +{ + uint64_t tick1 = 0, tick2 = 0; + + tick1 = pal_osKernelSysTick64(); + tick2 = pal_osKernelSysTick64(); + + TEST_ASSERT_TRUE(tick2 > tick1); +} + +TEST(pal_rtos, pal_osKernelSysTickMicroSec_Unity) +{ + uint64_t tick = 0; + uint64_t microSec = 2000 * 1000; + + tick = pal_osKernelSysTickMicroSec(microSec); + TEST_ASSERT_TRUE(0 != tick); +} + +TEST(pal_rtos, pal_osKernelSysMilliSecTick_Unity) +{ + uint64_t tick = 0; + uint64_t microSec = 2000 * 1000; + uint64_t milliseconds = 0; + + tick = pal_osKernelSysTickMicroSec(microSec); + TEST_ASSERT_TRUE(0 != tick); + + milliseconds = pal_osKernelSysMilliSecTick(tick); + TEST_ASSERT_EQUAL(milliseconds, microSec/1000); +} + + +TEST(pal_rtos, pal_osKernelSysTickFrequency_Unity) +{ + uint64_t frequency = 0; + + frequency = pal_osKernelSysTickFrequency(); + + TEST_ASSERT_TRUE(frequency > 0); +} + +TEST(pal_rtos, pal_osDelay_Unity) +{ + palStatus_t status = PAL_SUCCESS; + uint32_t tick1 , tick2; + + tick1 = pal_osKernelSysTick(); + status = pal_osDelay(200); + tick2 = pal_osKernelSysTick(); + + TEST_ASSERT_TRUE(tick2 > tick1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +} + +TEST(pal_rtos, BasicTimeScenario) +{ + palStatus_t status = PAL_SUCCESS; + uint32_t tick, tick1 , tick2 , index, tickDiff, tickDelta; + uint32_t tmp = 0; + + tick1 = pal_osKernelSysTick(); + for(index = 0 ; index < 2000 ; ++index) + ++tmp; + tick2 = pal_osKernelSysTick(); + + TEST_ASSERT_TRUE(tick1 != tick2); + TEST_ASSERT_TRUE(tick2 > tick1); // to check that the tick counts are incremantal - be aware of wrap-arounds + + /****************************************/ + tick1 = pal_osKernelSysTick(); + status = pal_osDelay(2000); + tick2 = pal_osKernelSysTick(); + + TEST_ASSERT_TRUE(tick1 != tick2); + TEST_ASSERT_TRUE(tick2 > tick1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + tickDiff = tick2 - tick1; + tick = pal_osKernelSysTickMicroSec(2000 * 1000); + // 10 milliseconds delta + tickDelta = pal_osKernelSysTickMicroSec(10 * 1000); + TEST_ASSERT_TRUE((tick - tickDelta < tickDiff) && (tickDiff < tick + tickDelta)); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); +} + +TEST(pal_rtos, TimerUnityTest) +{ + palStatus_t status = PAL_SUCCESS; + palTimerID_t timerID1 = NULLPTR; + palTimerID_t timerID2 = NULLPTR; + status = pal_init(); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osTimerCreate(palTimerFunc1, NULL, palOsTimerOnce, &timerID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osTimerCreate(palTimerFunc2, NULL, palOsTimerPeriodic, &timerID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + g_timerArgs.ticksBeforeTimer = pal_osKernelSysTick(); + status = pal_osTimerStart(timerID1, 1000); + TEST_PRINTF("ticks before Timer: 0 - %d\n", g_timerArgs.ticksBeforeTimer); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + g_timerArgs.ticksBeforeTimer = pal_osKernelSysTick(); + status = pal_osTimerStart(timerID2, 1000); + TEST_PRINTF("ticks before Timer: 1 - %d\n", g_timerArgs.ticksBeforeTimer); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osDelay(1500); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osTimerStop(timerID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osTimerDelete(&timerID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(NULL, timerID1); + + status = pal_osTimerDelete(&timerID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(NULL, timerID2); +} + +TEST(pal_rtos, PrimitivesUnityTest1) +{ + palStatus_t status = PAL_SUCCESS; + status = pal_init(NULL); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osMutexCreate(&mutex1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osMutexCreate(&mutex2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osSemaphoreCreate(1 ,&semaphore1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + palRunThreads(); + + //! sleep for 10 seconds to let the threads finish their functions + status = pal_osDelay(10000); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osSemaphoreDelete(&semaphore1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(NULL, semaphore1); + + status = pal_osMutexDelete(&mutex1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(NULL, mutex1); + + status = pal_osMutexDelete(&mutex2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(NULL, mutex2); + +} + +TEST(pal_rtos, PrimitivesUnityTest2) +{ + palStatus_t status = PAL_SUCCESS; + int32_t tmp = 0; + palThreadID_t threadID = NULLPTR; + uint32_t stack1; //we have small stack just to pass NON-NULL paramter + +//Check Thread parameter validation + status = pal_osThreadCreate(NULL, NULL, PAL_osPriorityIdle, 1024, &stack1, NULL, &threadID); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osThreadCreate(palThreadFunc1, NULL, PAL_osPriorityError, 1024, &stack1, NULL, &threadID); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osThreadCreate(palThreadFunc1, NULL, PAL_osPriorityIdle, 0, &stack1, NULL, &threadID); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osThreadCreate(palThreadFunc1, NULL, PAL_osPriorityIdle, 1024, NULL, NULL, &threadID); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osThreadCreate(palThreadFunc1, NULL, PAL_osPriorityIdle, 1024, &stack1, NULL, NULL); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + +//Check Semaphore parameter validation + status = pal_osSemaphoreCreate(1 ,NULL); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osSemaphoreDelete(NULL); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osSemaphoreWait(NULLPTR, 1000, &tmp); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osSemaphoreWait(tmp, 1000, NULL); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); + + status = pal_osSemaphoreRelease(NULLPTR); + TEST_ASSERT_EQUAL(PAL_ERR_INVALID_ARGUMENT, status); +} + +TEST(pal_rtos, MemoryPoolUnityTest) +{ + palStatus_t status = PAL_SUCCESS; + palMemoryPoolID_t poolID1 = NULLPTR; + palMemoryPoolID_t poolID2 = NULLPTR; + uint8_t* ptr1[MEMORY_POOL1_BLOCK_COUNT] = {0}; + uint8_t* ptr2[MEMORY_POOL2_BLOCK_COUNT] = {0}; + + status = pal_init(NULL); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osPoolCreate(MEMORY_POOL1_BLOCK_SIZE, MEMORY_POOL1_BLOCK_COUNT, &poolID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osPoolCreate(MEMORY_POOL2_BLOCK_SIZE, MEMORY_POOL2_BLOCK_COUNT, &poolID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + for(uint8_t block1 = 0 ; block1 < MEMORY_POOL1_BLOCK_COUNT; ++block1) + { + ptr1[block1] = pal_osPoolAlloc(poolID1); + TEST_ASSERT_NOT_EQUAL(ptr1[block1], NULL); + } + for(uint8_t block2 = 0 ; block2 < MEMORY_POOL2_BLOCK_COUNT; ++block2) + { + ptr2[block2] = pal_osPoolCAlloc(poolID2); + TEST_ASSERT_NOT_EQUAL(ptr2[block2], NULL); + } + + for(uint8_t freeblock1 = 0; freeblock1 < MEMORY_POOL1_BLOCK_COUNT; ++freeblock1) + { + status = pal_osPoolFree(poolID1, ptr1[freeblock1]); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + } + + for(uint8_t freeblock2 = 0; freeblock2 < MEMORY_POOL2_BLOCK_COUNT; ++freeblock2) + { + status = pal_osPoolFree(poolID2, ptr2[freeblock2]); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + } + + status = pal_osPoolDestroy(&poolID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(poolID1, NULL); + status = pal_osPoolDestroy(&poolID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(poolID2, NULL); +} + + +TEST(pal_rtos, MessageUnityTest) +{ + palStatus_t status = PAL_SUCCESS; + palMessageQID_t messageQID = NULLPTR; + uint32_t infoToSend = 3215; + uint32_t infoToGet = 0; + + status = pal_init(NULL); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osMessageQueueCreate(10, &messageQID); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osMessagePut(messageQID, infoToSend, 1500); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osMessageGet(messageQID, 1500, &infoToGet); + + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL_UINT32(infoToSend, infoToGet); + + status = pal_osMessageQueueDestroy(&messageQID); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + TEST_ASSERT_EQUAL(messageQID, NULL); +} + +TEST(pal_rtos, AtomicIncrementUnityTest) +{ + int32_t num1 = 0; + int32_t increment = 10; + int32_t tmp = 0; + int32_t original = num1; + + tmp = pal_osAtomicIncrement(&num1, increment); + + + TEST_ASSERT_EQUAL(original + increment, tmp); + +} + +TEST(pal_rtos, pal_init_test) +{ + palStatus_t status = PAL_SUCCESS; + + status = pal_init(); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_init(); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_init(); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + pal_destroy(); + + pal_destroy(); + + pal_destroy(); + + pal_destroy(); +} + +TEST(pal_rtos, CustomizedTest) +{ + palStatus_t status = PAL_SUCCESS; + palThreadID_t threadID1 = NULLPTR; + palThreadID_t threadID2 = NULLPTR; + uint32_t *stack1 = (uint32_t*)malloc(sizeof(uint32_t) * 512); + uint32_t *stack2 = (uint32_t*)malloc(sizeof(uint32_t) * 512); + + + status = pal_osThreadCreate(palThreadFuncCustom1, NULL, PAL_osPriorityAboveNormal, 1024, stack1, NULL, &threadID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFuncCustom2, NULL, PAL_osPriorityHigh, 1024, stack2, NULL, &threadID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + pal_osDelay(3000); + + status = pal_osThreadTerminate(&threadID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadTerminate(&threadID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + + status = pal_osThreadCreate(palThreadFuncCustom1, NULL, PAL_osPriorityAboveNormal, 1024, stack1, NULL, &threadID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadCreate(palThreadFuncCustom2, NULL, PAL_osPriorityHigh, 1024, stack2, NULL, &threadID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + pal_osDelay(3000); + status = pal_osThreadTerminate(&threadID1); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + + status = pal_osThreadTerminate(&threadID2); + TEST_ASSERT_EQUAL(PAL_SUCCESS, status); + pal_osDelay(500); + + free(stack1); + free(stack2); + +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_rtos_test_main_mbedOS.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "mbed.h" +#include "rtos.h" + +DigitalOut led1(LED1); +InterruptIn sw2(SW2); +uint32_t button_pressed; +Thread *thread2; + +void sw2_press(void) +{ + thread2->signal_set(0x1); +} + +void led_thread(void const *argument) +{ + while (true) { + led1 = !led1; + Thread::wait(1000); + } +} + +void button_thread(void const *argument) +{ + while (true) { + Thread::signal_wait(0x1); + button_pressed++; + } +} + +// Run all the unity tests +//extern "C" void RunAllTests(void); +// Include explicitly and not using the h file because we are compiling this file with C++ and the h file does not +// declare it extern "C" +extern "C" int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); + +extern "C" void TEST_pal_rtos_GROUP_RUNNER(void); + +int main(int argc, const char * argv[]) +{ + const char * myargv[] = {"app","-v"}; + + Thread::wait(2000); + printf("Start tests\n"); + fflush(stdout); + + UnityMain(sizeof(myargv)/sizeof(myargv[0]), myargv, TEST_pal_rtos_GROUP_RUNNER); + + // This is detected by test runner app, so that it can know when to terminate without waiting for timeout. + printf("***END OF TESTS**\n");for(int i=0;i<1000;i++)putchar('x');putchar('\n'); + fflush(stdout); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_rtos_test_runner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "unity.h" +#include "unity_fixture.h" + + +TEST_GROUP_RUNNER(pal_rtos) +{ +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || pal_osKernelSysTick_Unity) + RUN_TEST_CASE(pal_rtos, pal_osKernelSysTick_Unity); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || pal_osKernelSysTick64_Unity) + RUN_TEST_CASE(pal_rtos, pal_osKernelSysTick64_Unity); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || pal_osKernelSysTickMicroSec_Unity) + RUN_TEST_CASE(pal_rtos, pal_osKernelSysTickMicroSec_Unity); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || pal_osKernelSysMilliSecTick_Unity) + RUN_TEST_CASE(pal_rtos, pal_osKernelSysMilliSecTick_Unity); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || pal_osKernelSysTickFrequency_Unity) + RUN_TEST_CASE(pal_rtos, pal_osKernelSysTickFrequency_Unity); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || pal_osDelay_Unity) + RUN_TEST_CASE(pal_rtos, pal_osDelay_Unity); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || BasicTimeScenario) + RUN_TEST_CASE(pal_rtos, BasicTimeScenario); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || TimerUnityTest) + RUN_TEST_CASE(pal_rtos, TimerUnityTest); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || MemoryPoolUnityTest) + RUN_TEST_CASE(pal_rtos, MemoryPoolUnityTest); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || MessageUnityTest) + RUN_TEST_CASE(pal_rtos, MessageUnityTest); +#endif +#if (PAL_INCLUDE || BASIC_RTOS_UNITY_TESTS || AtomicIncrementUnityTest) + RUN_TEST_CASE(pal_rtos, AtomicIncrementUnityTest); +#endif + +#if (PAL_INCLUDE || PRIMITIVES_UNITY_TEST || PrimitivesUnityTest1) + RUN_TEST_CASE(pal_rtos, PrimitivesUnityTest1); +#endif +#if (PAL_INCLUDE || PRIMITIVES_UNITY_TEST || PrimitivesUnityTest2) + RUN_TEST_CASE(pal_rtos, PrimitivesUnityTest2); +#endif +#if (PAL_INCLUDE || PAL_INIT_REFERENCE || pal_init_test) +RUN_TEST_CASE(pal_rtos, pal_init_test); +#endif +#if (CustomizedTest) + RUN_TEST_CASE(pal_rtos, CustomizedTest); +#endif +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_socket_test.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,428 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "pal.h" +#include "pal_network.h" +#include "pal_plat_network.h" +#include "unity.h" +#include "unity_fixture.h" +#include "pal_test_utils.h" +#include "pal_socket_test_utils.h" +#include "string.h" + + + +TEST_GROUP(pal_socket); + +//sometimes you may want to get at local data in a module. +//for example: If you plan to pass by reference, this could be useful +//however, it should often be avoided +//extern int Counter; + +#define PAL_NET_SUPPORT_LWIP 1 +#define PAL_NET_TEST_SERVER_NAME "e109180-lin.kfn.arm.com" +#define PAL_NET_TEST_SERVER_IP {10,45,48,190} +#define PAL_NET_TEST_SERVER_IP_STRING "10.45.48.190" +#define PAL_NET_TEST_SERVER_HTTP_PORT 8686 +#define PAL_NET_TEST_SERVER_UDP_PORT 8383 +#define PAL_NET_TEST_INCOMING_PORT 8000 + +void * g_networkInterface = NULL; + + +static uint32_t s_callbackcounter = 0; + +void socketCallback() +{ + s_callbackcounter++; +} + +TEST_SETUP(pal_socket) +{ + uint32_t index = 0; + palStatus_t status = PAL_SUCCESS; + static void * interfaceCTX = NULL; + //This is run before EACH TEST + if (!interfaceCTX) + { + status = pal_init(); + if (PAL_SUCCESS == status) + { + interfaceCTX = palTestGetNetWorkInterfaceContext(); + pal_registerNetworkInterface(interfaceCTX , &index); + g_networkInterface = interfaceCTX; + } + } +} + +TEST_TEAR_DOWN(pal_socket) +{ +} + +#define PAL_TEST_BUFFER_SIZE 50 + +TEST(pal_socket, socketUDPCreationOptionsTest) +{ + palStatus_t result = PAL_SUCCESS; + palSocket_t sock = 0; + palSocket_t sock2 = 0; + palSocket_t sock3 = 0; + palSocket_t sock5 = 0; + uint32_t numInterface = 0; + palNetInterfaceInfo_t interfaceInfo; + uint32_t interfaceIndex = 0; + uint32_t sockOptVal = 5000; + uint32_t sockOptLen = sizeof(sockOptVal); + + TEST_PRINTF("start socket test\r\n"); + + memset(&interfaceInfo,0,sizeof(interfaceInfo)); + // check that re-addignt he network interface returns the same index + pal_registerNetworkInterface(g_networkInterface, &interfaceIndex); + TEST_ASSERT_EQUAL(interfaceIndex, 0); + pal_registerNetworkInterface(g_networkInterface, &interfaceIndex); + TEST_ASSERT_EQUAL(interfaceIndex, 0); + + TEST_PRINTF("create sockets\r\n"); + + + //blocking + result = pal_socket(PAL_AF_INET, PAL_SOCK_DGRAM, false, interfaceIndex, &sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + result = pal_socket(PAL_AF_INET, PAL_SOCK_DGRAM, false, interfaceIndex, &sock2); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + //non-blocking + result = pal_socket(PAL_AF_INET, PAL_SOCK_DGRAM, true, interfaceIndex, &sock5); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_asynchronousSocket(PAL_AF_INET, PAL_SOCK_STREAM, false, interfaceIndex, socketCallback, &sock3); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + + result = pal_getNumberOfNetInterfaces(&numInterface); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_ASSERT_EQUAL(numInterface, 1); + + result = pal_getNetInterfaceInfo(0, &interfaceInfo); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_PRINTF("interface addr: %d %d %d %d \r\n", interfaceInfo.address.addressData[2], interfaceInfo.address.addressData[3], interfaceInfo.address.addressData[4], interfaceInfo.address.addressData[5]); + + + result = pal_setSocketOptions(sock, PAL_SO_RCVTIMEO, &sockOptVal, sockOptLen); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + TEST_PRINTF("close sockets\r\n"); + + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + result = pal_close(&sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + result = pal_close(&sock2); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + result = pal_close(&sock5); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + result = pal_close(&sock3); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + TEST_PRINTF("end\r\n"); + +} + + +TEST(pal_socket, basicTCPclinetSendRecieve) +{ + + + palStatus_t result = PAL_SUCCESS; + palSocket_t sock = 0; + palSocketAddress_t address = { 0 }; + const char* message = "GET / HTTP/1.0\r\n\r\n"; + size_t sent = 0; + char buffer[100] = { 0 }; + size_t read = 0; + palSocketLength_t addrlen = 0; + + result = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_getAddressInfo(PAL_NET_TEST_SERVER_NAME, &address, &addrlen); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_setSockAddrPort(&address, PAL_NET_TEST_SERVER_HTTP_PORT); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_connect(sock, &address, 16); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_send(sock, message, 45, &sent); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_recv(sock, buffer, 99, &read); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_PRINTF(buffer); + + TEST_ASSERT(read >= 4); + TEST_ASSERT(buffer[0] == 'H' && buffer[1] == 'T'&& buffer[2] == 'T' && buffer[3] == 'P'); + pal_close(&sock); + + TEST_PRINTF("test Done"); + +} + +TEST(pal_socket, basicUDPclinetSendRecieve) +{ + + palStatus_t result = PAL_SUCCESS; + palSocket_t sock = 0; + palSocketAddress_t address = { 0 }; + palSocketAddress_t address2 = { 0 }; + uint8_t buffer[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; + size_t sent = 0; + size_t read = 0; + palSocketLength_t addrlen = 0; + + result = pal_socket(PAL_AF_INET, PAL_SOCK_DGRAM, false, 0, &sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_getAddressInfo(PAL_NET_TEST_SERVER_NAME, &address, &addrlen); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + result = pal_setSockAddrPort(&address, PAL_NET_TEST_SERVER_UDP_PORT); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + TEST_PRINTF("udp send \r\n"); + result = pal_sendTo(sock, buffer, 10, &address, 16, &sent); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_ASSERT_EQUAL(sent, 10); + result = pal_plat_receiveFrom(sock, buffer, 10, &address2, &addrlen, &read); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_ASSERT_EQUAL(read, 10); + TEST_PRINTF("udp done \r\n"); + pal_close(&sock); +} + + +TEST(pal_socket, basicSocketScenario3) +{ + palStatus_t result = PAL_SUCCESS; + palSocket_t sock = 0; + palSocketAddress_t address = { 0 }; + const char* message = "GET / HTTP/1.0\r\nHost:10.45.48.68:8000\r\n\r\n"; + size_t sent = 0; + char buffer[100] = { 0 }; + size_t read = 0; + s_callbackcounter = 0; + palSocketLength_t addrlen = 0; + + result = pal_asynchronousSocket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, socketCallback, &sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_getAddressInfo(PAL_NET_TEST_SERVER_NAME, &address, &addrlen); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_setSockAddrPort(&address, PAL_NET_TEST_SERVER_HTTP_PORT); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_connect(sock, &address, 16); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_send(sock, message, 45, &sent); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_recv(sock, buffer, 99, &read); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_PRINTF(buffer); + + TEST_ASSERT(read >= 4); + TEST_ASSERT(buffer[0] == 'H' && buffer[1] == 'T'&& buffer[2] == 'T' && buffer[3] == 'P'); + TEST_ASSERT(s_callbackcounter > 0); + TEST_PRINTF("callback counter %d \r\n", s_callbackcounter); + pal_close(&sock); + + TEST_PRINTF("test Done"); +} + +TEST(pal_socket, basicSocketScenario4) +{ + palStatus_t result = PAL_SUCCESS; + palSocket_t sock = 0; + palSocket_t sock2 = 0; + palSocketAddress_t address = { 0 }; + const char* message = "GET / HTTP/1.0\r\n\r\n"; + size_t sent = 0; + char buffer[100] = { 0 }; + size_t read = 0; + palSocketLength_t addlen = 0; + uint32_t numSockets = 0; + palSocket_t socketsToCheck[PAL_NET_SOCKET_SELECT_MAX_SOCKETS] = { 0 }; + pal_timeVal_t tv = {0}; + uint8_t palSocketStatus[PAL_NET_SOCKET_SELECT_MAX_SOCKETS] = { 0 }; + + result = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &sock2); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_getAddressInfo("www.w3.org", &address, &addlen); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_PRINTF("addr lookup: %d %d %d %d \r\n", address.addressData[2], address.addressData[3], address.addressData[4], address.addressData[5]); + + result = pal_setSockAddrPort(&address, 80); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_connect(sock, &address, 16); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_send(sock, message, 45, &sent); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + socketsToCheck[0] = sock; + socketsToCheck[1] = sock2; + tv.pal_tv_sec = 5; + tv.pal_tv_usec = 1000; + + result = pal_plat_socketMiniSelect(socketsToCheck, 2, &tv, palSocketStatus, &numSockets); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + //TEST_ASSERT_EQUAL(numSockets, 1); + //TEST_ASSERT(palSocketStatus[0] >= 0); + + result = pal_recv(sock, buffer, 99, &read); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_PRINTF(buffer); + + TEST_ASSERT(read >= 4); + TEST_ASSERT(buffer[0] == 'H' && buffer[1] == 'T'&& buffer[2] == 'T' && buffer[3] == 'P'); + + socketsToCheck[0] = sock2; + socketsToCheck[1] = 0; + tv.pal_tv_sec = 0; + tv.pal_tv_usec = 20000; + result = pal_plat_socketMiniSelect(socketsToCheck, 1, &tv, palSocketStatus, &numSockets); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_ASSERT_EQUAL(numSockets, 0); + TEST_ASSERT(palSocketStatus[0] == 0); + + pal_close(&sock); + pal_close(&sock2); + + TEST_PRINTF("test Done"); + +} + +TEST(pal_socket, basicSocketScenario5) +{ + palStatus_t result = PAL_SUCCESS; + palSocket_t sock = 0; + palSocket_t sock2 = 0; + palSocket_t sock3 = 0; + + palSocketAddress_t address2 = { 0 }; + + char buffer[100] = { 0 }; + const char* messageOut = "HTTP/1.0 200 OK"; + size_t sent = 0; + size_t read = 0; + palSocketLength_t addrlen = 16; + palNetInterfaceInfo_t interfaceInfo; + + memset(&interfaceInfo,0,sizeof(interfaceInfo)); + + + result = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM_SERVER, false, 0, &sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &sock2); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_getNetInterfaceInfo(0, &interfaceInfo); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_setSockAddrPort(&(interfaceInfo.address), PAL_NET_TEST_INCOMING_PORT); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_bind(sock, &(interfaceInfo.address), interfaceInfo.addressSize); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_listen(sock, 10); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + TEST_PRINTF("waiting for connection:\r\n"); + result = pal_accept(sock, &address2, &addrlen, &sock2); + TEST_PRINTF("after accept:\r\n"); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + + result = pal_recv(sock2, buffer, 99, &read); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_PRINTF(buffer); + + result = pal_send(sock2, messageOut, 15, &sent); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + + result = pal_socket(PAL_AF_INET, PAL_SOCK_STREAM, false, 0, &sock3); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + + + pal_close(&sock2); + pal_close(&sock3); + pal_close(&sock); + + TEST_PRINTF("test Done"); +} + + +TEST(pal_socket, tProvUDPTest) +{ + + palStatus_t result = PAL_SUCCESS; + palSocket_t sock = 0; + palSocketAddress_t address = { 0 }; + palSocketAddress_t address2 = { 0 }; + char buffer[100] = { 0 }; + const char* messageOut = "HTTP/1.0 200 OK"; + size_t sent = 0; + size_t read = 0; + palSocketLength_t addrlen = 16; + palSocketLength_t addrlen2 = 16; + int timeout = 10000; + result = pal_socket(PAL_AF_INET, PAL_SOCK_DGRAM, false, 0, &sock); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_getAddressInfo(PAL_NET_TEST_SERVER_IP_STRING, &address, &addrlen); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_setSockAddrPort(&address, PAL_NET_TEST_SERVER_UDP_PORT); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_setSocketOptions(sock, PAL_SO_SNDTIMEO, &timeout, sizeof(timeout)); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_sendTo(sock, messageOut, 16, &address, addrlen, &sent); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_ASSERT_EQUAL(sent, 16); + + result = pal_receiveFrom(sock, buffer, 100, NULL, NULL, &read); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + TEST_ASSERT_EQUAL(read, 16); + + timeout = 1; + result = pal_setSocketOptions(sock, PAL_SO_RCVTIMEO, &timeout, sizeof(timeout)); + TEST_ASSERT_EQUAL(result, PAL_SUCCESS); + + result = pal_receiveFrom(sock, buffer, 100, &address2, &addrlen2, &read); // should get timeout + TEST_ASSERT_EQUAL(result, PAL_ERR_SOCKET_WOULD_BLOCK); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_socket_test_main_mbedOS.cpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "mbed.h" +#include "rtos.h" + +DigitalOut led1(LED1); +InterruptIn sw2(SW2); +uint32_t button_pressed = 0; +Thread *thread2; + +void sw2_press(void) +{ + thread2->signal_set(0x1); +} + +void led_thread(void const *argument) +{ + while (true) { + led1 = !led1; + Thread::wait(1000); + } +} + +void button_thread(void const *argument) +{ + while (true) { + Thread::signal_wait(0x1); + button_pressed++; + } +} + + +// Run all the unity tests +//extern "C" void RunAllTests(void); +// Include explicitly and not using the h file because we are compiling this file with C++ and the h file does not +// declare it extern "C" +extern "C" int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); + +extern "C" void TEST_pal_socket_GROUP_RUNNER(void); + +int main(int argc, const char * argv[]) +{ + const char * myargv[] = {"app","-v"}; + + Thread::wait(2000); + printf("Start tests\n"); + fflush(stdout); + + UnityMain(sizeof(myargv)/sizeof(myargv[0]), myargv, TEST_pal_socket_GROUP_RUNNER); + + // This is detected by test runner app, so that it can know when to terminate without waiting for timeout. + printf("***END OF TESTS**\n");for(int i=0;i<1000;i++)putchar('x');putchar('\n'); + fflush(stdout); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unitest/pal_socket_test_runner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2016 ARM Limited. All rights reserved. +* SPDX-License-Identifier: Apache-2.0 +* 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 +* 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. +*/ + +#include "unity.h" +#include "unity_fixture.h" + + +// pal Socket API tests +TEST_GROUP_RUNNER(pal_socket) +{ +#if (PAL_INCLUDE || socketUDPCreationOptionsTest) + RUN_TEST_CASE(pal_socket, socketUDPCreationOptionsTest); +#endif +#if (PAL_INCLUDE || basicTCPclinetSendRecieve) + RUN_TEST_CASE(pal_socket, basicTCPclinetSendRecieve); +#endif +#if (PAL_INCLUDE || basicUDPclinetSendRecieve) + RUN_TEST_CASE(pal_socket, basicUDPclinetSendRecieve); +#endif +#if (PAL_INCLUDE || basicSocketScenario3) + RUN_TEST_CASE(pal_socket, basicSocketScenario3); +#endif +#if (PAL_INCLUDE || basicSocketScenario4) + RUN_TEST_CASE(pal_socket, basicSocketScenario4); +#endif +#if (PAL_INCLUDE || tProvUDPTest) + RUN_TEST_CASE(pal_socket, tProvUDPTest); +#endif +#if (PAL_INCLUDE || basicSocketScenario5) + RUN_TEST_CASE(pal_socket, basicSocketScenario5); +#endif +} + +// Each of these should be in a separate file. + + +// pal OS API tests +//TEST_GROUP_RUNNER(pal_OS) +//{ +//} + +/* Run all the tests +void RunAllTests(void) +{ + RUN_TEST_GROUP(pal_socket); + //RUN_TEST_GROUP(pal_OS); +}*/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/.gitattributes Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,30 @@ +* text=auto + +# These files are text and should be normalized (convert crlf to lf) +*.rb text +*.test text +*.c text +*.cpp text +*.h text +*.txt text +*.yml text +*.s79 text +*.bat text +*.xcl text +*.inc text +*.info text +*.md text +makefile text +rakefile text + + +#These files are binary and should not be normalized +*.doc binary +*.odt binary +*.pdf binary +*.ewd binary +*.eww binary +*.dni binary +*.wsdt binary +*.dbgdt binary +*.mac binary
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/.gitignore Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,9 @@ +build/ +.DS_Store +examples/example_1/test1.out +examples/example_1/test2.out +examples/example_2/all_tests.out +examples/example_3/test1.out +examples/example_3/test2.out +test/testparameterized.c.results +test/testunity.c.results
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/.settings/language.settings.xml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<project> + <configuration id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.base.1969954189" name="Default"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> + <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> + <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-994959062068727758" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> + <language-scope id="org.eclipse.cdt.core.gcc"/> + <language-scope id="org.eclipse.cdt.core.g++"/> + </provider> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> +</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/.travis.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,9 @@ +language: ruby +rvm: + - "1.9.3" + - "2.0.0" +script: + - cd test && rake ci + - make -s + - cd ../extras/fixture/test && rake ci + - make -s default noStdlibMalloc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/README.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,211 @@ +Unity Test API +============== + +[![Unity Build Status](https://api.travis-ci.org/ThrowTheSwitch/Unity.png?branch=master)](https://travis-ci.org/ThrowTheSwitch/Unity) +__Copyright (c) 2007 - 2014 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams__ + +Running Tests +------------- + + RUN_TEST(func, linenum) + +Each Test is run within the macro `RUN_TEST`. This macro performs necessary setup before the test is called and handles cleanup and result tabulation afterwards. + +Ignoring Tests +-------------- + +There are times when a test is incomplete or not valid for some reason. At these times, TEST_IGNORE can be called. Control will immediately be returned to the caller of the test, and no failures will be returned. + + TEST_IGNORE() + +Ignore this test and return immediately + + TEST_IGNORE_MESSAGE (message) + +Ignore this test and return immediately. Output a message stating why the test was ignored. + +Aborting Tests +-------------- + +There are times when a test will contain an infinite loop on error conditions, or there may be reason to escape from the test early without executing the rest of the test. A pair of macros support this functionality in Unity. The first `TEST_PROTECT` sets up the feature, and handles emergency abort cases. `TEST_ABORT` can then be used at any time within the tests to return to the last `TEST_PROTECT` call. + + TEST_PROTECT() + +Setup and Catch macro + + TEST_ABORT() + +Abort Test macro + +Example: + + main() + { + if (TEST_PROTECT() == 0) + { + MyTest(); + } + } + +If MyTest calls `TEST_ABORT`, program control will immediately return to `TEST_PROTECT` with a non-zero return value. + + +Unity Assertion Summary +======================= + +Basic Validity Tests +-------------------- + + TEST_ASSERT_TRUE(condition) + +Evaluates whatever code is in condition and fails if it evaluates to false + + TEST_ASSERT_FALSE(condition) + +Evaluates whatever code is in condition and fails if it evaluates to true + + TEST_ASSERT(condition) + +Another way of calling `TEST_ASSERT_TRUE` + + TEST_ASSERT_UNLESS(condition) + +Another way of calling `TEST_ASSERT_FALSE` + + TEST_FAIL() + TEST_FAIL_MESSAGE(message) + +This test is automatically marked as a failure. The message is output stating why. + +Numerical Assertions: Integers +------------------------------ + + TEST_ASSERT_EQUAL_INT(expected, actual) + TEST_ASSERT_EQUAL_INT8(expected, actual) + TEST_ASSERT_EQUAL_INT16(expected, actual) + TEST_ASSERT_EQUAL_INT32(expected, actual) + TEST_ASSERT_EQUAL_INT64(expected, actual) + +Compare two integers for equality and display errors as signed integers. A cast will be performed +to your natural integer size so often this can just be used. When you need to specify the exact size, +like when comparing arrays, you can use a specific version: + + TEST_ASSERT_EQUAL_UINT(expected, actual) + TEST_ASSERT_EQUAL_UINT8(expected, actual) + TEST_ASSERT_EQUAL_UINT16(expected, actual) + TEST_ASSERT_EQUAL_UINT32(expected, actual) + TEST_ASSERT_EQUAL_UINT64(expected, actual) + +Compare two integers for equality and display errors as unsigned integers. Like INT, there are +variants for different sizes also. + + TEST_ASSERT_EQUAL_HEX(expected, actual) + TEST_ASSERT_EQUAL_HEX8(expected, actual) + TEST_ASSERT_EQUAL_HEX16(expected, actual) + TEST_ASSERT_EQUAL_HEX32(expected, actual) + TEST_ASSERT_EQUAL_HEX64(expected, actual) + +Compares two integers for equality and display errors as hexadecimal. Like the other integer comparisons, +you can specify the size... here the size will also effect how many nibbles are shown (for example, `HEX16` +will show 4 nibbles). + + _ARRAY + +You can append `_ARRAY` to any of these macros to make an array comparison of that type. Here you will +need to care a bit more about the actual size of the value being checked. You will also specify an +additional argument which is the number of elements to compare. For example: + + TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, elements) + + TEST_ASSERT_EQUAL(expected, actual) + +Another way of calling TEST_ASSERT_EQUAL_INT + + TEST_ASSERT_INT_WITHIN(delta, expected, actual) + +Asserts that the actual value is within plus or minus delta of the expected value. This also comes in +size specific variants. + + +Numerical Assertions: Bitwise +----------------------------- + + TEST_ASSERT_BITS(mask, expected, actual) + +Use an integer mask to specify which bits should be compared between two other integers. High bits in the mask are compared, low bits ignored. + + TEST_ASSERT_BITS_HIGH(mask, actual) + +Use an integer mask to specify which bits should be inspected to determine if they are all set high. High bits in the mask are compared, low bits ignored. + + TEST_ASSERT_BITS_LOW(mask, actual) + +Use an integer mask to specify which bits should be inspected to determine if they are all set low. High bits in the mask are compared, low bits ignored. + + TEST_ASSERT_BIT_HIGH(bit, actual) + +Test a single bit and verify that it is high. The bit is specified 0-31 for a 32-bit integer. + + TEST_ASSERT_BIT_LOW(bit, actual) + +Test a single bit and verify that it is low. The bit is specified 0-31 for a 32-bit integer. + +Numerical Assertions: Floats +---------------------------- + + TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) + +Asserts that the actual value is within plus or minus delta of the expected value. + + TEST_ASSERT_EQUAL_FLOAT(expected, actual) + TEST_ASSERT_EQUAL_DOUBLE(expected, actual) + +Asserts that two floating point values are "equal" within a small % delta of the expected value. + +String Assertions +----------------- + + TEST_ASSERT_EQUAL_STRING(expected, actual) + +Compare two null-terminate strings. Fail if any character is different or if the lengths are different. + + TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) + +Compare two strings. Fail if any character is different, stop comparing after len characters. + + TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) + +Compare two null-terminate strings. Fail if any character is different or if the lengths are different. Output a custom message on failure. + + TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) + +Compare two strings. Fail if any character is different, stop comparing after len characters. Output a custom message on failure. + +Pointer Assertions +------------------ + +Most pointer operations can be performed by simply using the integer comparisons above. However, a couple of special cases are added for clarity. + + TEST_ASSERT_NULL(pointer) + +Fails if the pointer is not equal to NULL + + TEST_ASSERT_NOT_NULL(pointer) + +Fails if the pointer is equal to NULL + +Memory Assertions +----------------- + + TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) + +Compare two blocks of memory. This is a good generic assertion for types that can't be coerced into acting like +standard types... but since it's a memory compare, you have to be careful that your data types are packed. + +_MESSAGE +-------- + +you can append _MESSAGE to any of the macros to make them take an additional argument. This argument +is a string that will be printed at the end of the failure strings. This is useful for specifying more +information about the problem. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/colour_prompt.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,115 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +if RUBY_PLATFORM =~/(win|w)32$/ + begin + require 'Win32API' + rescue LoadError + puts "ERROR! \"Win32API\" library not found" + puts "\"Win32API\" is required for colour on a windows machine" + puts " try => \"gem install Win32API\" on the command line" + puts + end + # puts + # puts 'Windows Environment Detected...' + # puts 'Win32API Library Found.' + # puts +end + +class ColourCommandLine + def initialize + if RUBY_PLATFORM =~/(win|w)32$/ + get_std_handle = Win32API.new("kernel32", "GetStdHandle", ['L'], 'L') + @set_console_txt_attrb = + Win32API.new("kernel32","SetConsoleTextAttribute",['L','N'], 'I') + @hout = get_std_handle.call(-11) + end + end + + def change_to(new_colour) + if RUBY_PLATFORM =~/(win|w)32$/ + @set_console_txt_attrb.call(@hout,self.win32_colour(new_colour)) + else + "\033[30;#{posix_colour(new_colour)};22m" + end + end + + def win32_colour(colour) + case colour + when :black then 0 + when :dark_blue then 1 + when :dark_green then 2 + when :dark_cyan then 3 + when :dark_red then 4 + when :dark_purple then 5 + when :dark_yellow, :narrative then 6 + when :default_white, :default, :dark_white then 7 + when :silver then 8 + when :blue then 9 + when :green, :success then 10 + when :cyan, :output then 11 + when :red, :failure then 12 + when :purple then 13 + when :yellow then 14 + when :white then 15 + else + 0 + end + end + + def posix_colour(colour) + # ANSI Escape Codes - Foreground colors + # | Code | Color | + # | 39 | Default foreground color | + # | 30 | Black | + # | 31 | Red | + # | 32 | Green | + # | 33 | Yellow | + # | 34 | Blue | + # | 35 | Magenta | + # | 36 | Cyan | + # | 37 | Light gray | + # | 90 | Dark gray | + # | 91 | Light red | + # | 92 | Light green | + # | 93 | Light yellow | + # | 94 | Light blue | + # | 95 | Light magenta | + # | 96 | Light cyan | + # | 97 | White | + + case colour + when :black then 30 + when :red, :failure then 31 + when :green, :success then 32 + when :yellow then 33 + when :blue, :narrative then 34 + when :purple, :magenta then 35 + when :cyan, :output then 36 + when :white, :default_white then 37 + when :default then 39 + else + 39 + end + end + + def out_c(mode, colour, str) + case RUBY_PLATFORM + when /(win|w)32$/ + change_to(colour) + $stdout.puts str if mode == :puts + $stdout.print str if mode == :print + change_to(:default_white) + else + $stdout.puts("#{change_to(colour)}#{str}\033[0m") if mode == :puts + $stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print + end + end +end # ColourCommandLine + +def colour_puts(role,str) ColourCommandLine.new.out_c(:puts, role, str) end +def colour_print(role,str) ColourCommandLine.new.out_c(:print, role, str) end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/colour_reporter.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,39 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +require "#{File.expand_path(File.dirname(__FILE__))}/colour_prompt" + +$colour_output = true + +def report(message) + if not $colour_output + $stdout.puts(message) + else + message = message.join('\n') if (message.class == Array) + message.each_line do |line| + line.chomp! + colour = case(line) + when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i + ($1.to_i == 0) ? :green : :red + when /PASS/ + :green + when /^OK$/ + :green + when /(?:FAIL|ERROR)/ + :red + when /IGNORE/ + :yellow + when /^(?:Creating|Compiling|Linking)/ + :white + else + :silver + end + colour_puts(colour, line) + end + end + $stdout.flush + $stderr.flush +end \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/generate_config.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,36 @@ +#this is a sample configuration file for generate_module +#you would use it by calling generate_module with the -ygenerate_config.yml option +#files like this are useful for customizing generate_module to your environment +:generate_module: + :defaults: + #these defaults are used in place of any missing options at the command line + :path_src: ../src/ + :path_inc: ../src/ + :path_tst: ../test/ + :update_svn: true + :includes: + #use [] for no additional includes, otherwise list the includes on separate lines + :src: + - Defs.h + - Board.h + :inc: [] + :tst: + - Defs.h + - Board.h + - Exception.h + :boilerplates: + #these are inserted at the top of generated files. + #just comment out or remove if not desired. + #use %1$s where you would like the file name to appear (path/extension not included) + :src: | + //------------------------------------------- + // %1$s.c + //------------------------------------------- + :inc: | + //------------------------------------------- + // %1$s.h + //------------------------------------------- + :tst: | + //------------------------------------------- + // Test%1$s.c : Units tests for %1$s.c + //-------------------------------------------
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/generate_module.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,202 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +# This script creates all the files with start code necessary for a new module. +# A simple module only requires a source file, header file, and test file. +# Triad modules require a source, header, and test file for each triad type (like model, conductor, and hardware). + +require 'rubygems' +require 'fileutils' + +HERE = File.expand_path(File.dirname(__FILE__)) + '/' + +#help text when requested +HELP_TEXT = [ "\nGENERATE MODULE\n-------- ------", + "\nUsage: ruby generate_module [options] module_name", + " -i\"include\" sets the path to output headers to 'include' (DEFAULT ../src)", + " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)", + " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)", + " -p\"MCH\" sets the output pattern to MCH.", + " dh - driver hardware.", + " dih - driver interrupt hardware.", + " mch - model conductor hardware.", + " mvp - model view presenter.", + " src - just a single source module. (DEFAULT)", + " -d destroy module instead of creating it.", + " -u update subversion too (requires subversion command line)", + " -y\"my.yml\" selects a different yaml config file for module generation", + "" ].join("\n") + +#Built in patterns +PATTERNS = { 'src' => {'' => { :inc => [] } }, + 'dh' => {'Driver' => { :inc => ['%1$sHardware.h'] }, + 'Hardware' => { :inc => [] } + }, + 'dih' => {'Driver' => { :inc => ['%1$sHardware.h', '%1$sInterrupt.h'] }, + 'Interrupt'=> { :inc => ['%1$sHardware.h'] }, + 'Hardware' => { :inc => [] } + }, + 'mch' => {'Model' => { :inc => [] }, + 'Conductor'=> { :inc => ['%1$sModel.h', '%1$sHardware.h'] }, + 'Hardware' => { :inc => [] } + }, + 'mvp' => {'Model' => { :inc => [] }, + 'Presenter'=> { :inc => ['%1$sModel.h', '%1$sView.h'] }, + 'View' => { :inc => [] } + } + } + +#TEMPLATE_TST +TEMPLATE_TST = %q[#include "unity.h" +%2$s#include "%1$s.h" + +void setUp(void) +{ +} + +void tearDown(void) +{ +} + +void test_%1$s_NeedToImplement(void) +{ + TEST_IGNORE_MESSAGE("Need to Implement %1$s"); +} +] + +#TEMPLATE_SRC +TEMPLATE_SRC = %q[%2$s#include "%1$s.h" +] + +#TEMPLATE_INC +TEMPLATE_INC = %q[#ifndef _%3$s_H +#define _%3$s_H%2$s + +#endif // _%3$s_H +] + +# Parse the command line parameters. +ARGV.each do |arg| + case(arg) + when /^-d/ then @destroy = true + when /^-u/ then @update_svn = true + when /^-p(\w+)/ then @pattern = $1 + when /^-s(.+)/ then @path_src = $1 + when /^-i(.+)/ then @path_inc = $1 + when /^-t(.+)/ then @path_tst = $1 + when /^-y(.+)/ then @yaml_config = $1 + when /^(\w+)/ + raise "ERROR: You can't have more than one Module name specified!" unless @module_name.nil? + @module_name = arg + when /^-(h|-help)/ + puts HELP_TEXT + exit + else + raise "ERROR: Unknown option specified '#{arg}'" + end +end +raise "ERROR: You must have a Module name specified! (use option -h for help)" if @module_name.nil? + +#load yaml file if one was requested +if @yaml_config + require 'yaml' + cfg = YAML.load_file(HERE + @yaml_config)[:generate_module] + @path_src = cfg[:defaults][:path_src] if @path_src.nil? + @path_inc = cfg[:defaults][:path_inc] if @path_inc.nil? + @path_tst = cfg[:defaults][:path_tst] if @path_tst.nil? + @update_svn = cfg[:defaults][:update_svn] if @update_svn.nil? + @extra_inc = cfg[:includes] + @boilerplates = cfg[:boilerplates] +else + @boilerplates = {} +end + +# Create default file paths if none were provided +@path_src = HERE + "../src/" if @path_src.nil? +@path_inc = @path_src if @path_inc.nil? +@path_tst = HERE + "../test/" if @path_tst.nil? +@path_src += '/' unless (@path_src[-1] == 47) +@path_inc += '/' unless (@path_inc[-1] == 47) +@path_tst += '/' unless (@path_tst[-1] == 47) +@pattern = 'src' if @pattern.nil? +@includes = { :src => [], :inc => [], :tst => [] } +@includes.merge!(@extra_inc) unless @extra_inc.nil? + +#create triad definition +TRIAD = [ { :ext => '.c', :path => @path_src, :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @boilerplates[:src] }, + { :ext => '.h', :path => @path_inc, :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @boilerplates[:inc] }, + { :ext => '.c', :path => @path_tst+'Test', :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @boilerplates[:tst] }, + ] + +#prepare the pattern for use +@patterns = PATTERNS[@pattern.downcase] +raise "ERROR: The design pattern specified isn't one that I recognize!" if @patterns.nil? + +# Assemble the path/names of the files we need to work with. +files = [] +TRIAD.each do |triad| + @patterns.each_pair do |pattern_file, pattern_traits| + files << { + :path => "#{triad[:path]}#{@module_name}#{pattern_file}#{triad[:ext]}", + :name => "#{@module_name}#{pattern_file}", + :template => triad[:template], + :boilerplate => triad[:boilerplate], + :includes => case(triad[:inc]) + when :src then @includes[:src] | pattern_traits[:inc].map{|f| f % [@module_name]} + when :inc then @includes[:inc] + when :tst then @includes[:tst] | pattern_traits[:inc].map{|f| "Mock#{f}"% [@module_name]} + end + } + end +end + +# destroy files if that was what was requested +if @destroy + files.each do |filespec| + file = filespec[:path] + if File.exist?(file) + if @update_svn + `svn delete \"#{file}\" --force` + puts "File #{file} deleted and removed from source control" + else + FileUtils.remove(file) + puts "File #{file} deleted" + end + else + puts "File #{file} does not exist so cannot be removed." + end + end + puts "Destroy Complete" + exit +end + +#Abort if any module already exists +files.each do |file| + raise "ERROR: File #{file[:name]} already exists. Exiting." if File.exist?(file[:path]) +end + +# Create Source Modules +files.each_with_index do |file, i| + File.open(file[:path], 'w') do |f| + f.write(file[:boilerplate] % [file[:name]]) unless file[:boilerplate].nil? + f.write(file[:template] % [ file[:name], + file[:includes].map{|f| "#include \"#{f}\"\n"}.join, + file[:name].upcase ] + ) + end + if (@update_svn) + `svn add \"#{file[:path]}\"` + if $?.exitstatus == 0 + puts "File #{file[:path]} created and added to source control" + else + puts "File #{file[:path]} created but FAILED adding to source control!" + end + else + puts "File #{file[:path]} created" + end +end + +puts 'Generate Complete'
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/generate_test_runner.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,391 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +$QUICK_RUBY_VERSION = RUBY_VERSION.split('.').inject(0){|vv,v| vv * 100 + v.to_i } +File.expand_path(File.join(File.dirname(__FILE__),'colour_prompt')) + +class UnityTestRunnerGenerator + + def initialize(options = nil) + @options = UnityTestRunnerGenerator.default_options + case(options) + when NilClass then @options + when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options)) + when Hash then @options.merge!(options) + else raise "If you specify arguments, it should be a filename or a hash of options" + end + require "#{File.expand_path(File.dirname(__FILE__))}/type_sanitizer" + end + + def self.default_options + { + :includes => [], + :plugins => [], + :framework => :unity, + :test_prefix => "test|spec|should", + :setup_name => "setUp", + :teardown_name => "tearDown", + :main_name => "main", + } + end + + def self.grab_config(config_file) + options = self.default_options + unless (config_file.nil? or config_file.empty?) + require 'yaml' + yaml_guts = YAML.load_file(config_file) + options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) + raise "No :unity or :cmock section found in #{config_file}" unless options + end + return(options) + end + + def run(input_file, output_file, options=nil) + tests = [] + testfile_includes = [] + used_mocks = [] + + @options.merge!(options) unless options.nil? + module_name = File.basename(input_file) + + #pull required data from source file + source = File.read(input_file) + source = source.force_encoding("ISO-8859-1").encode("utf-8", :replace => nil) if ($QUICK_RUBY_VERSION > 10900) + tests = find_tests(source) + headers = find_includes(source) + testfile_includes = (headers[:local] + headers[:system]) + used_mocks = find_mocks(testfile_includes) + testfile_includes = (testfile_includes - used_mocks) + testfile_includes.delete_if{|inc| inc =~ /(unity|cmock)/} + + #build runner file + generate(input_file, output_file, tests, used_mocks, testfile_includes) + + #determine which files were used to return them + all_files_used = [input_file, output_file] + all_files_used += testfile_includes.map {|filename| filename + '.c'} unless testfile_includes.empty? + all_files_used += @options[:includes] unless @options[:includes].empty? + return all_files_used.uniq + end + + def generate(input_file, output_file, tests, used_mocks, testfile_includes) + File.open(output_file, 'w') do |output| + create_header(output, used_mocks, testfile_includes) + create_externs(output, tests, used_mocks) + create_mock_management(output, used_mocks) + create_suite_setup_and_teardown(output) + create_reset(output, used_mocks) + create_main(output, input_file, tests, used_mocks) + end + + if (@options[:header_file] && !@options[:header_file].empty?) + File.open(@options[:header_file], 'w') do |output| + create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) + end + end + end + + def find_tests(source) + tests_and_line_numbers = [] + + source_scrubbed = source.clone + source_scrubbed = source_scrubbed.gsub(/"[^"]*"/, '') # remove things in strings + source_scrubbed = source_scrubbed.gsub(/\/\/.*$/, '') # remove line comments + source_scrubbed = source_scrubbed.gsub(/\/\*.*?\*\//m, '') # remove block comments + lines = source_scrubbed.split(/(^\s*\#.*$) # Treat preprocessor directives as a logical line + | (;|\{|\}) /x) # Match ;, {, and } as end of lines + + lines.each_with_index do |line, index| + #find tests + if line =~ /^((?:\s*TEST_CASE\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]}).*)\s*\(\s*(.*)\s*\)/ + arguments = $1 + name = $2 + call = $3 + params = $4 + args = nil + if (@options[:use_param_tests] and !arguments.empty?) + args = [] + arguments.scan(/\s*TEST_CASE\s*\((.*)\)\s*$/) {|a| args << a[0]} + end + tests_and_line_numbers << { :test => name, :args => args, :call => call, :params => params, :line_number => 0 } + end + end + tests_and_line_numbers.uniq! {|v| v[:test] } + + #determine line numbers and create tests to run + source_lines = source.split("\n") + source_index = 0; + tests_and_line_numbers.size.times do |i| + source_lines[source_index..-1].each_with_index do |line, index| + if (line =~ /#{tests_and_line_numbers[i][:test]}/) + source_index += index + tests_and_line_numbers[i][:line_number] = source_index + 1 + break + end + end + end + + return tests_and_line_numbers + end + + def find_includes(source) + + #remove comments (block and line, in three steps to ensure correct precedence) + source.gsub!(/\/\/(?:.+\/\*|\*(?:$|[^\/])).*$/, '') # remove line comments that comment out the start of blocks + source.gsub!(/\/\*.*?\*\//m, '') # remove block comments + source.gsub!(/\/\/.*$/, '') # remove line comments (all that remain) + + #parse out includes + includes = { + :local => source.scan(/^\s*#include\s+\"\s*(.+)\.[hH]\s*\"/).flatten, + :system => source.scan(/^\s*#include\s+<\s*(.+)\s*>/).flatten.map { |inc| "<#{inc}>" } + } + return includes + end + + def find_mocks(includes) + mock_headers = [] + includes.each do |include_path| + include_file = File.basename(include_path) + mock_headers << include_path if (include_file =~ /^mock/i) + end + return mock_headers + end + + def create_header(output, mocks, testfile_includes=[]) + output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') + create_runtest(output, mocks) + output.puts("\n/*=======Automagically Detected Files To Include=====*/") + output.puts("#include \"#{@options[:framework].to_s}.h\"") + output.puts('#include "cmock.h"') unless (mocks.empty?) + output.puts('#include <setjmp.h>') + output.puts('#include <stdio.h>') + output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) + if (@options[:header_file] && !@options[:header_file].empty?) + output.puts("#include \"#{File.basename(@options[:header_file])}\"") + else + @options[:includes].flatten.uniq.compact.each do |inc| + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + end + testfile_includes.each do |inc| + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + end + end + mocks.each do |mock| + output.puts("#include \"#{mock.gsub('.h','')}.h\"") + end + if @options[:enforce_strict_ordering] + output.puts('') + output.puts('int GlobalExpectCount;') + output.puts('int GlobalVerifyOrder;') + output.puts('char* GlobalOrderError;') + end + end + + def create_externs(output, tests, mocks) + output.puts("\n/*=======External Functions This Runner Calls=====*/") + output.puts("extern void #{@options[:setup_name]}(void);") + output.puts("extern void #{@options[:teardown_name]}(void);") + tests.each do |test| + output.puts("extern void #{test[:test]}(#{test[:call] || 'void'});") + end + output.puts('') + end + + def create_mock_management(output, mock_headers) + unless (mock_headers.empty?) + output.puts("\n/*=======Mock Management=====*/") + output.puts("static void CMock_Init(void)") + output.puts("{") + if @options[:enforce_strict_ordering] + output.puts(" GlobalExpectCount = 0;") + output.puts(" GlobalVerifyOrder = 0;") + output.puts(" GlobalOrderError = NULL;") + end + mocks = mock_headers.map {|mock| File.basename(mock)} + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Init();") + end + output.puts("}\n") + + output.puts("static void CMock_Verify(void)") + output.puts("{") + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Verify();") + end + output.puts("}\n") + + output.puts("static void CMock_Destroy(void)") + output.puts("{") + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Destroy();") + end + output.puts("}\n") + end + end + + def create_suite_setup_and_teardown(output) + unless (@options[:suite_setup].nil?) + output.puts("\n/*=======Suite Setup=====*/") + output.puts("static int suite_setup(void)") + output.puts("{") + output.puts(@options[:suite_setup]) + output.puts("}") + end + unless (@options[:suite_teardown].nil?) + output.puts("\n/*=======Suite Teardown=====*/") + output.puts("static int suite_teardown(int num_failures)") + output.puts("{") + output.puts(@options[:suite_teardown]) + output.puts("}") + end + end + + def create_runtest(output, used_mocks) + cexception = @options[:plugins].include? :cexception + va_args1 = @options[:use_param_tests] ? ', ...' : '' + va_args2 = @options[:use_param_tests] ? '__VA_ARGS__' : '' + output.puts("\n/*=======Test Runner Used To Run Each Test Below=====*/") + output.puts("#define RUN_TEST_NO_ARGS") if @options[:use_param_tests] + output.puts("#define RUN_TEST(TestFunc, TestLineNum#{va_args1}) \\") + output.puts("{ \\") + output.puts(" Unity.CurrentTestName = #TestFunc#{va_args2.empty? ? '' : " \"(\" ##{va_args2} \")\""}; \\") + output.puts(" Unity.CurrentTestLineNumber = TestLineNum; \\") + output.puts(" Unity.NumberOfTests++; \\") + output.puts(" CMock_Init(); \\") unless (used_mocks.empty?) + output.puts(" UNITY_CLR_DETAILS(); \\") unless (used_mocks.empty?) + output.puts(" if (TEST_PROTECT()) \\") + output.puts(" { \\") + output.puts(" CEXCEPTION_T e; \\") if cexception + output.puts(" Try { \\") if cexception + output.puts(" #{@options[:setup_name]}(); \\") + output.puts(" TestFunc(#{va_args2}); \\") + output.puts(" } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, \"Unhandled Exception!\"); } \\") if cexception + output.puts(" } \\") + output.puts(" if (TEST_PROTECT() && !TEST_IS_IGNORED) \\") + output.puts(" { \\") + output.puts(" #{@options[:teardown_name]}(); \\") + output.puts(" CMock_Verify(); \\") unless (used_mocks.empty?) + output.puts(" } \\") + output.puts(" CMock_Destroy(); \\") unless (used_mocks.empty?) + output.puts(" UnityConcludeTest(); \\") + output.puts("}\n") + end + + def create_reset(output, used_mocks) + output.puts("\n/*=======Test Reset Option=====*/") + output.puts("void resetTest(void);") + output.puts("void resetTest(void)") + output.puts("{") + output.puts(" CMock_Verify();") unless (used_mocks.empty?) + output.puts(" CMock_Destroy();") unless (used_mocks.empty?) + output.puts(" #{@options[:teardown_name]}();") + output.puts(" CMock_Init();") unless (used_mocks.empty?) + output.puts(" #{@options[:setup_name]}();") + output.puts("}") + end + + def create_main(output, filename, tests, used_mocks) + output.puts("\n\n/*=======MAIN=====*/") + if (@options[:main_name] != "main") + output.puts("int #{@options[:main_name]}(void);") + end + output.puts("int #{@options[:main_name]}(void)") + output.puts("{") + output.puts(" suite_setup();") unless @options[:suite_setup].nil? + output.puts(" UnityBegin(\"#{filename.gsub(/\\/,'\\\\')}\");") + if (@options[:use_param_tests]) + tests.each do |test| + if ((test[:args].nil?) or (test[:args].empty?)) + output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, RUN_TEST_NO_ARGS);") + else + test[:args].each {|args| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, #{args});")} + end + end + else + tests.each { |test| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]});") } + end + output.puts() + output.puts(" CMock_Guts_MemFreeFinal();") unless used_mocks.empty? + output.puts(" return #{@options[:suite_teardown].nil? ? "" : "suite_teardown"}(UnityEnd());") + output.puts("}") + end + + def create_h_file(output, filename, tests, testfile_includes, used_mocks) + filename = File.basename(filename).gsub(/[-\/\\\.\,\s]/, "_").upcase + output.puts("/* AUTOGENERATED FILE. DO NOT EDIT. */") + output.puts("#ifndef _#{filename}") + output.puts("#define _#{filename}\n\n") + output.puts("#include \"#{@options[:framework].to_s}.h\"") + output.puts('#include "cmock.h"') unless (used_mocks.empty?) + @options[:includes].flatten.uniq.compact.each do |inc| + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + end + testfile_includes.each do |inc| + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + end + output.puts "\n" + tests.each do |test| + if ((test[:params].nil?) or (test[:params].empty?)) + output.puts("void #{test[:test]}(void);") + else + output.puts("void #{test[:test]}(#{test[:params]});") + end + end + output.puts("#endif\n\n") + end +end + +if ($0 == __FILE__) + options = { :includes => [] } + yaml_file = nil + + #parse out all the options first (these will all be removed as we go) + ARGV.reject! do |arg| + case(arg) + when '-cexception' + options[:plugins] = [:cexception]; true + when /\.*\.ya?ml/ + options = UnityTestRunnerGenerator.grab_config(arg); true + when /--(\w+)=\"?(.*)\"?/ + options[$1.to_sym] = $2; true + when /\.*\.h/ + options[:includes] << arg; true + else false + end + end + + #make sure there is at least one parameter left (the input file) + if !ARGV[0] + puts ["\nusage: ruby #{__FILE__} (files) (options) input_test_file (output)", + "\n input_test_file - this is the C file you want to create a runner for", + " output - this is the name of the runner file to generate", + " defaults to (input_test_file)_Runner", + " files:", + " *.yml / *.yaml - loads configuration from here in :unity or :cmock", + " *.h - header files are added as #includes in runner", + " options:", + " -cexception - include cexception support", + " --setup_name=\"\" - redefine setUp func name to something else", + " --teardown_name=\"\" - redefine tearDown func name to something else", + " --main_name=\"\" - redefine main func name to something else", + " --test_prefix=\"\" - redefine test prefix from default test|spec|should", + " --suite_setup=\"\" - code to execute for setup of entire suite", + " --suite_teardown=\"\" - code to execute for teardown of entire suite", + " --use_param_tests=1 - enable parameterized tests (disabled by default)", + " --header_file=\"\" - path/name of test header file to generate too" + ].join("\n") + exit 1 + end + + #create the default test runner name if not specified + ARGV[1] = ARGV[0].gsub(".c","_Runner.c") if (!ARGV[1]) + + UnityTestRunnerGenerator.new(options).run(ARGV[0], ARGV[1]) +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/parseOutput.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,191 @@ +#============================================================ +# Author: John Theofanopoulos +# A simple parser. Takes the output files generated during the build process and +# extracts information relating to the tests. +# +# Notes: +# To capture an output file under VS builds use the following: +# devenv [build instructions] > Output.txt & type Output.txt +# +# To capture an output file under GCC/Linux builds use the following: +# make | tee Output.txt +# +# To use this parser use the following command +# ruby parseOutput.rb [options] [file] +# options: -xml : produce a JUnit compatible XML file +# file : file to scan for results +#============================================================ + + +class ParseOutput +# The following flag is set to true when a test is found or false otherwise. + @testFlag + @xmlOut + @arrayList + @totalTests + @classIndex + +# Set the flag to indicate if there will be an XML output file or not + def setXmlOutput() + @xmlOut = true + end + +# if write our output to XML + def writeXmlOuput() + output = File.open("report.xml", "w") + output << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + @arrayList.each do |item| + output << item << "\n" + end + output << "</testsuite>\n" + end + +# This function will try and determine when the suite is changed. This is +# is the name that gets added to the classname parameter. + def testSuiteVerify(testSuiteName) + if @testFlag == false + @testFlag = true; + # Split the path name + testName = testSuiteName.split("/") + # Remove the extension + baseName = testName[testName.size - 1].split(".") + @testSuite = "test." + baseName[0] + printf "New Test: %s\n", @testSuite + end + end + + +# Test was flagged as having passed so format the output + def testPassed(array) + lastItem = array.length - 1 + testName = array[lastItem - 1] + testSuiteVerify(array[@className]) + printf "%-40s PASS\n", testName + if @xmlOut == true + @arrayList.push " <testcase classname=\"" + @testSuite + "\" name=\"" + testName + "\"/>" + end + end + +# Test was flagged as being ingored so format the output + def testIgnored(array) + lastItem = array.length - 1 + testName = array[lastItem - 2] + reason = array[lastItem].chomp + testSuiteVerify(array[@className]) + printf "%-40s IGNORED\n", testName + if @xmlOut == true + @arrayList.push " <testcase classname=\"" + @testSuite + "\" name=\"" + testName + "\">" + @arrayList.push " <skipped type=\"TEST IGNORED\"> " + reason + " </skipped>" + @arrayList.push " </testcase>" + end + end + +# Test was flagged as having failed so format the line + def testFailed(array) + lastItem = array.length - 1 + testName = array[lastItem - 2] + reason = array[lastItem].chomp + " at line: " + array[lastItem - 3] + testSuiteVerify(array[@className]) + printf "%-40s FAILED\n", testName + if @xmlOut == true + @arrayList.push " <testcase classname=\"" + @testSuite + "\" name=\"" + testName + "\">" + @arrayList.push " <failure type=\"ASSERT FAILED\"> " + reason + " </failure>" + @arrayList.push " </testcase>" + end + end + + +# Figure out what OS we are running on. For now we are assuming if it's not Windows it must +# be Unix based. + def detectOS() + myOS = RUBY_PLATFORM.split("-") + if myOS.size == 2 + if myOS[1] == "mingw32" + @className = 1 + else + @className = 0 + end + else + @className = 0 + end + + end + +# Main function used to parse the file that was captured. + def process(name) + @testFlag = false + @arrayList = Array.new + + detectOS() + + puts "Parsing file: " + name + + + testPass = 0 + testFail = 0 + testIgnore = 0 + puts "" + puts "=================== RESULTS =====================" + puts "" + File.open(name).each do |line| + # Typical test lines look like this: + # <path>/<test_file>.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 + # <path>/<test_file>.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented + # <path>/<test_file>.c:115:test_tc5100_initCanVoidPtrs:PASS + # + # where path is different on Unix vs Windows devices (Windows leads with a drive letter) + lineArray = line.split(":") + lineSize = lineArray.size + # If we were able to split the line then we can look to see if any of our target words + # were found. Case is important. + if lineSize >= 4 + # Determine if this test passed + if line.include? ":PASS" + testPassed(lineArray) + testPass += 1 + elsif line.include? ":FAIL:" + testFailed(lineArray) + testFail += 1 + elsif line.include? ":IGNORE:" + testIgnored(lineArray) + testIgnore += 1 + # If none of the keywords are found there are no more tests for this suite so clear + # the test flag + else + @testFlag = false + end + else + @testFlag = false + end + end + puts "" + puts "=================== SUMMARY =====================" + puts "" + puts "Tests Passed : " + testPass.to_s + puts "Tests Failed : " + testFail.to_s + puts "Tests Ignored : " + testIgnore.to_s + @totalTests = testPass + testFail + testIgnore + if @xmlOut == true + heading = "<testsuite tests=\"" + @totalTests.to_s + "\" failures=\"" + testFail.to_s + "\"" + " skips=\"" + testIgnore.to_s + "\">" + @arrayList.insert(0, heading) + writeXmlOuput() + end + + # return result + end + + end + +# If the command line has no values in, used a default value of Output.txt +parseMyFile = ParseOutput.new + +if ARGV.size >= 1 + ARGV.each do |a| + if a == "-xml" + parseMyFile.setXmlOutput(); + else + parseMyFile.process(a) + break + end + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/stylize_as_junit.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,264 @@ +#!/usr/bin/ruby +# +# unity_to_junit.rb +# +require 'fileutils' +require 'optparse' +require 'ostruct' +require 'set' + +require 'pp' + +VERSION = 1.0 + +class ArgvParser + + # + # Return a structure describing the options. + # + def self.parse(args) + # The options specified on the command line will be collected in *options*. + # We set default values here. + options = OpenStruct.new + options.results_dir = "." + options.root_path = "." + options.out_file = "results.xml" + + opts = OptionParser.new do |opts| + opts.banner = "Usage: unity_to_junit.rb [options]" + + opts.separator "" + opts.separator "Specific options:" + + opts.on("-r", "--results <dir>", "Look for Unity Results files here.") do |results| + #puts "results #{results}" + options.results_dir = results + end + + opts.on("-p", "--root_path <path>", "Prepend this path to files in results.") do |root_path| + options.root_path = root_path + end + + opts.on("-o", "--output <filename>", "XML file to generate.") do |out_file| + #puts "out_file: #{out_file}" + options.out_file = out_file + end + + opts.separator "" + opts.separator "Common options:" + + # No argument, shows at tail. This will print an options summary. + opts.on_tail("-h", "--help", "Show this message") do + puts opts + exit + end + + # Another typical switch to print the version. + opts.on_tail("--version", "Show version") do + puts "unity_to_junit.rb version #{VERSION}" + exit + end + end + + opts.parse!(args) + options + end # parse() + +end # class OptparseExample + +class UnityToJUnit + include FileUtils::Verbose + attr_reader :report, :total_tests, :failures, :ignored + + def initialize + @report = '' + @unit_name = '' + end + + def run + # Clean up result file names + results = @targets.map {|target| target.gsub(/\\/,"/")} + #puts "Output File: #{@out_file}" + f = File.new(@out_file, "w") + write_xml_header(f) + write_suites_header( f ) + results.each do |result_file| + lines = File.readlines(result_file).map { |line| line.chomp } + if lines.length == 0 + raise "Empty test result file: #{result_file}" + else + result_output = get_details(result_file, lines) + tests,failures,ignored = parse_test_summary(lines) + result_output[:counts][:total] = tests + result_output[:counts][:failed] = failures + result_output[:counts][:ignored] = ignored + result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) + end + #use line[0] from the test output to get the test_file path and name + test_file_str = lines[0].gsub("\\","/") + test_file_str = test_file_str.split(":") + test_file = if (test_file_str.length < 2) + result_file + else + test_file_str[0] + ':' + test_file_str[1] + end + result_output[:source][:path] = File.dirname(test_file) + result_output[:source][:file] = File.basename(test_file) + + # save result_output + @unit_name = File.basename(test_file, ".*") + + write_suite_header( result_output[:counts], f) + write_failures( result_output, f ) + write_tests( result_output, f ) + write_ignored( result_output, f ) + write_suite_footer( f ) + end + write_suites_footer( f ) + f.close + end + + def set_targets(target_array) + @targets = target_array + end + + def set_root_path(path) + @root = path + end + def set_out_file(filename) + @out_file = filename + end + def usage(err_msg=nil) + puts "\nERROR: " + puts err_msg if err_msg + puts "Usage: unity_to_junit.rb [options]" + puts "" + puts "Specific options:" + puts " -r, --results <dir> Look for Unity Results files here." + puts " -p, --root_path <path> Prepend this path to files in results." + puts " -o, --output <filename> XML file to generate." + puts "" + puts "Common options:" + puts " -h, --help Show this message" + puts " --version Show version" + + exit 1 + end + + protected + def get_details(result_file, lines) + results = get_results_structure + lines.each do |line| + line = line.gsub("\\","/") + src_file,src_line,test_name,status,msg = line.split(/:/) + line_out = ((@root and (@root != 0)) ? "#{@root}#{line}" : line ).gsub(/\//, "\\") + case(status) + when 'IGNORE' then results[:ignores] << {:test => test_name, :line => src_line, :message => msg} + when 'FAIL' then results[:failures] << {:test => test_name, :line => src_line, :message => msg} + when 'PASS' then results[:successes] << {:test => test_name, :line => src_line, :message => msg} + end + end + return results + end + + def parse_test_summary(summary) + if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [$1.to_i,$2.to_i,$3.to_i] + else + raise "Couldn't parse test results: #{summary}" + end + end + def here; File.expand_path(File.dirname(__FILE__)); end + + private + + def get_results_structure + return { + :source => {:path => '', :file => ''}, + :successes => [], + :failures => [], + :ignores => [], + :counts => {:total => 0, :passed => 0, :failed => 0, :ignored => 0}, + :stdout => [], + } + end + + def write_xml_header( stream ) + stream.puts "<?xml version='1.0' encoding='utf-8' ?>" + end + + def write_suites_header( stream ) + stream.puts "<testsuites>" + end + + def write_suite_header( counts, stream ) + stream.puts "\t<testsuite errors=\"0\" skipped=\"#{counts[:ignored]}\" failures=\"#{counts[:failed]}\" tests=\"#{counts[:total]}\" name=\"unity\">" + end + + def write_failures( results, stream ) + result = results[:failures] + result.each do |item| + filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) + stream.puts "\t\t<testcase classname=\"#{@unit_name}\" name=\"#{item[:test]}\" time=\"0\">" + stream.puts "\t\t\t<failure message=\"#{item[:message]}\" type=\"Assertion\"/>" + stream.puts "\t\t\t<system-err>
[File] #{filename}
[Line] #{item[:line]}
</system-err>" + stream.puts "\t\t</testcase>" + end + end + + def write_tests( results, stream ) + result = results[:successes] + result.each do |item| + filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) + stream.puts "\t\t<testcase classname=\"#{@unit_name}\" name=\"#{item[:test]}\" time=\"0\" />" + end + end + + def write_ignored( results, stream ) + result = results[:ignores] + result.each do |item| + filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) + puts "Writing ignored tests for test harness: #{filename}" + stream.puts "\t\t<testcase classname=\"#{@unit_name}\" name=\"#{item[:test]}\" time=\"0\">" + stream.puts "\t\t\t<skipped message=\"#{item[:message]}\" type=\"Assertion\"/>" + stream.puts "\t\t\t<system-err>
[File] #{filename}
[Line] #{item[:line]}
</system-err>" + stream.puts "\t\t</testcase>" + end + end + + def write_suite_footer( stream ) + stream.puts "\t</testsuite>" + end + + def write_suites_footer( stream ) + stream.puts "</testsuites>" + end +end #UnityToJUnit + +if __FILE__ == $0 + #parse out the command options + options = ArgvParser.parse(ARGV) + + #create an instance to work with + utj = UnityToJUnit.new + begin + #look in the specified or current directory for result files + targets = "#{options.results_dir.gsub(/\\/, '/')}**/*.test*" + + results = Dir[targets] + raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? + utj.set_targets(results) + + #set the root path + utj.set_root_path(options.root_path) + + #set the output XML file name + #puts "Output File from options: #{options.out_file}" + utj.set_out_file(options.out_file) + + #run the summarizer + puts utj.run + rescue Exception => e + utj.usage e.message + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/test_file_filter.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,23 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +require'yaml' + +module RakefileHelpers + class TestFileFilter + def initialize(all_files = false) + @all_files = all_files + if not @all_files == true + if File.exist?('test_file_filter.yml') + filters = YAML.load_file( 'test_file_filter.yml' ) + @all_files, @only_files, @exclude_files = + filters[:all_files], filters[:only_files], filters[:exclude_files] + end + end + end + attr_accessor :all_files, :only_files, :exclude_files + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/type_sanitizer.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,8 @@ +module TypeSanitizer + + def self.sanitize_c_identifier(unsanitized) + # convert filename to valid C identifier by replacing invalid chars with '_' + return unsanitized.gsub(/[-\/\\\.\,\s]/, "_") + end + +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/unity_test_summary.py Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,135 @@ +#! python3 +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2015 Alexander Mueller / XelaRellum@web.de +# [Released under MIT License. Please refer to license.txt for details] +# Based on the ruby script by Mike Karlesky, Mark VanderVoord, Greg Williams +# ========================================== +import sys +import os +import re +from glob import glob + +class UnityTestSummary: + def __init__(self): + self.report = '' + self.total_tests = 0 + self.failures = 0 + self.ignored = 0 + + def run(self): + # Clean up result file names + results = [] + for target in self.targets: + results.append(target.replace('\\', '/')) + + # Dig through each result file, looking for details on pass/fail: + failure_output = [] + ignore_output = [] + + for result_file in results: + lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n'))) + if len(lines) == 0: + raise Exception("Empty test result file: %s" % result_file) + + details = self.get_details(result_file, lines) + failures = details['failures'] + ignores = details['ignores'] + if len(failures) > 0: failure_output.append('\n'.join(failures)) + if len(ignores) > 0: ignore_output.append('n'.join(ignores)) + tests,failures,ignored = self.parse_test_summary('\n'.join(lines)) + self.total_tests += tests + self.failures += failures + self.ignored += ignored + + if self.ignored > 0: + self.report += "\n" + self.report += "--------------------------\n" + self.report += "UNITY IGNORED TEST SUMMARY\n" + self.report += "--------------------------\n" + self.report += "\n".join(ignore_output) + + if self.failures > 0: + self.report += "\n" + self.report += "--------------------------\n" + self.report += "UNITY FAILED TEST SUMMARY\n" + self.report += "--------------------------\n" + self.report += '\n'.join(failure_output) + + self.report += "\n" + self.report += "--------------------------\n" + self.report += "OVERALL UNITY TEST SUMMARY\n" + self.report += "--------------------------\n" + self.report += "{total_tests} TOTAL TESTS {failures} TOTAL FAILURES {ignored} IGNORED\n".format(total_tests = self.total_tests, failures=self.failures, ignored=self.ignored) + self.report += "\n" + + return self.report + + def set_targets(self, target_array): + self.targets = target_array + + def set_root_path(self, path): + self.root = path + + def usage(self, err_msg=None): + print("\nERROR: ") + if err_msg: + print(err_msg) + print("\nUsage: unity_test_summary.py result_file_directory/ root_path/") + print(" result_file_directory - The location of your results files.") + print(" Defaults to current directory if not specified.") + print(" Should end in / if specified.") + print(" root_path - Helpful for producing more verbose output if using relative paths.") + sys.exit(1) + + def get_details(self, result_file, lines): + results = { 'failures': [], 'ignores': [], 'successes': [] } + for line in lines: + parts = line.split(':') + if len(parts) != 5: + continue + src_file,src_line,test_name,status,msg = parts + if len(self.root) > 0: + line_out = "%s%s" % (self.root, line) + else: + line_out = line + if status == 'IGNORE': + results['ignores'].append(line_out) + elif status == 'FAIL': + results['failures'].append(line_out) + elif status == 'PASS': + results['successes'].append(line_out) + return results + + def parse_test_summary(self, summary): + m = re.search(r"([0-9]+) Tests ([0-9]+) Failures ([0-9]+) Ignored", summary) + if not m: + raise Exception("Couldn't parse test results: %s" % summary) + + return int(m.group(1)), int(m.group(2)), int(m.group(3)) + + +if __name__ == '__main__': + uts = UnityTestSummary() + try: + #look in the specified or current directory for result files + if len(sys.argv) > 1: + targets_dir = sys.argv[1] + else: + targets_dir = './' + targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '*.test*'))) + if len(targets) == 0: + raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir) + uts.set_targets(targets) + + #set the root path + if len(sys.argv) > 2: + root_path = sys.argv[2] + else: + root_path = os.path.split(__file__)[0] + uts.set_root_path(root_path) + + #run the summarizer + print(uts.run()) + except Exception as e: + uts.usage(e)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/unity_test_summary.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,148 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +#!/usr/bin/ruby +# +# unity_test_summary.rb +# +require 'fileutils' +require 'set' + +class UnityTestSummary + include FileUtils::Verbose + + attr_reader :report, :total_tests, :failures, :ignored + + def initialize(opts = {}) + @report = '' + @total_tests = 0 + @failures = 0 + @ignored = 0 + + + end + + def run + # Clean up result file names + results = @targets.map {|target| target.gsub(/\\/,'/')} + + # Dig through each result file, looking for details on pass/fail: + failure_output = [] + ignore_output = [] + + results.each do |result_file| + lines = File.readlines(result_file).map { |line| line.chomp } + if lines.length == 0 + raise "Empty test result file: #{result_file}" + else + output = get_details(result_file, lines) + failure_output << output[:failures] unless output[:failures].empty? + ignore_output << output[:ignores] unless output[:ignores].empty? + tests,failures,ignored = parse_test_summary(lines) + @total_tests += tests + @failures += failures + @ignored += ignored + end + end + + if @ignored > 0 + @report += "\n" + @report += "--------------------------\n" + @report += "UNITY IGNORED TEST SUMMARY\n" + @report += "--------------------------\n" + @report += ignore_output.flatten.join("\n") + end + + if @failures > 0 + @report += "\n" + @report += "--------------------------\n" + @report += "UNITY FAILED TEST SUMMARY\n" + @report += "--------------------------\n" + @report += failure_output.flatten.join("\n") + end + + @report += "\n" + @report += "--------------------------\n" + @report += "OVERALL UNITY TEST SUMMARY\n" + @report += "--------------------------\n" + @report += "#{@total_tests} TOTAL TESTS #{@failures} TOTAL FAILURES #{@ignored} IGNORED\n" + @report += "\n" + end + + def set_targets(target_array) + @targets = target_array + end + + def set_root_path(path) + @root = path + end + + def usage(err_msg=nil) + puts "\nERROR: " + puts err_msg if err_msg + puts "\nUsage: unity_test_summary.rb result_file_directory/ root_path/" + puts " result_file_directory - The location of your results files." + puts " Defaults to current directory if not specified." + puts " Should end in / if specified." + puts " root_path - Helpful for producing more verbose output if using relative paths." + exit 1 + end + + protected + + def get_details(result_file, lines) + results = { :failures => [], :ignores => [], :successes => [] } + lines.each do |line| + src_file,src_line,test_name,status,msg = line.split(/:/) + line_out = ((@root && (@root != 0)) ? "#{@root}#{line}" : line ).gsub(/\//, "\\") + case(status) + when 'IGNORE' then results[:ignores] << line_out + when 'FAIL' then results[:failures] << line_out + when 'PASS' then results[:successes] << line_out + end + end + return results + end + + def parse_test_summary(summary) + if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [$1.to_i,$2.to_i,$3.to_i] + else + raise "Couldn't parse test results: #{summary}" + end + end + + def here; File.expand_path(File.dirname(__FILE__)); end + +end + +if $0 == __FILE__ + + #parse out the command options + opts, args = ARGV.partition {|v| v =~ /^--\w+/} + opts.map! {|v| v[2..-1].to_sym } + + #create an instance to work with + uts = UnityTestSummary.new(opts) + + begin + #look in the specified or current directory for result files + args[0] ||= './' + targets = "#{ARGV[0].gsub(/\\/, '/')}**/*.test*" + results = Dir[targets] + raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? + uts.set_targets(results) + + #set the root path + args[1] ||= Dir.pwd + '/' + uts.set_root_path(ARGV[1]) + + #run the summarizer + puts uts.run + rescue Exception => e + uts.usage e.message + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/auto/unity_to_junit.py Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,146 @@ +import sys +import os +from glob import glob + +from pyparsing import * +from junit_xml import TestSuite, TestCase + + +class UnityTestSummary: + def __init__(self): + self.report = '' + self.total_tests = 0 + self.failures = 0 + self.ignored = 0 + self.targets = 0 + self.root = None + self.test_suites = dict() + + def run(self): + # Clean up result file names + results = [] + for target in self.targets: + results.append(target.replace('\\', '/')) + + # Dig through each result file, looking for details on pass/fail: + for result_file in results: + lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n'))) + if len(lines) == 0: + raise Exception("Empty test result file: %s" % result_file) + + # define an expression for your file reference + entry_one = Combine( + oneOf(list(alphas)) + ':/' + + Word(alphanums + '_-./')) + + entry_two = Word(printables + ' ', excludeChars=':') + entry = entry_one | entry_two + + delimiter = Literal(':').suppress() + tc_result_line = Group(entry.setResultsName('tc_file_name') + delimiter + entry.setResultsName( + 'tc_line_nr') + delimiter + entry.setResultsName('tc_name') + delimiter + entry.setResultsName( + 'tc_status') + Optional( + delimiter + entry.setResultsName('tc_msg'))).setResultsName("tc_line") + + eol = LineEnd().suppress() + sol = LineStart().suppress() + blank_line = sol + eol + + tc_summary_line = Group(Word(nums).setResultsName("num_of_tests") + "Tests" + Word(nums).setResultsName( + "num_of_fail") + "Failures" + Word(nums).setResultsName("num_of_ignore") + "Ignored").setResultsName( + "tc_summary") + tc_end_line = Or(Literal("FAIL"), Literal('Ok')).setResultsName("tc_result") + + # run it and see... + pp1 = tc_result_line | Optional(tc_summary_line | tc_end_line) + pp1.ignore(blank_line | OneOrMore("-")) + + result = list() + for l in lines: + result.append((pp1.parseString(l)).asDict()) + # delete empty results + result = filter(None, result) + + tc_list = list() + for r in result: + if 'tc_line' in r: + tmp_tc_line = r['tc_line'] + + # get only the file name which will be used as the classname + file_name = tmp_tc_line['tc_file_name'].split('\\').pop().split('/').pop().rsplit('.', 1)[0] + tmp_tc = TestCase(name=tmp_tc_line['tc_name'], classname=file_name) + if 'tc_status' in tmp_tc_line: + if str(tmp_tc_line['tc_status']) == 'IGNORE': + if 'tc_msg' in tmp_tc_line: + tmp_tc.add_skipped_info(message=tmp_tc_line['tc_msg'], + output=r'[File]={0}, [Line]={1}'.format( + tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr'])) + else: + tmp_tc.add_skipped_info(message=" ") + elif str(tmp_tc_line['tc_status']) == 'FAIL': + if 'tc_msg' in tmp_tc_line: + tmp_tc.add_failure_info(message=tmp_tc_line['tc_msg'], + output=r'[File]={0}, [Line]={1}'.format( + tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr'])) + else: + tmp_tc.add_failure_info(message=" ") + + tc_list.append((str(result_file), tmp_tc)) + + for k, v in tc_list: + try: + self.test_suites[k].append(v) + except KeyError: + self.test_suites[k] = [v] + ts = [] + for suite_name in self.test_suites: + ts.append(TestSuite(suite_name, self.test_suites[suite_name])) + + with open('result.xml', 'w') as f: + TestSuite.to_file(f, ts, prettyprint='True', encoding='utf-8') + + return self.report + + def set_targets(self, target_array): + self.targets = target_array + + def set_root_path(self, path): + self.root = path + + @staticmethod + def usage(err_msg=None): + print("\nERROR: ") + if err_msg: + print(err_msg) + print("\nUsage: unity_test_summary.py result_file_directory/ root_path/") + print(" result_file_directory - The location of your results files.") + print(" Defaults to current directory if not specified.") + print(" Should end in / if specified.") + print(" root_path - Helpful for producing more verbose output if using relative paths.") + sys.exit(1) + + +if __name__ == '__main__': + uts = UnityTestSummary() + try: + # look in the specified or current directory for result files + if len(sys.argv) > 1: + targets_dir = sys.argv[1] + else: + targets_dir = './' + targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '*.test*'))) + if len(targets) == 0: + raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir) + uts.set_targets(targets) + + # set the root path + if len(sys.argv) > 2: + root_path = sys.argv[2] + else: + root_path = os.path.split(__file__)[0] + uts.set_root_path(root_path) + + # run the summarizer + print(uts.run()) + except Exception as e: + UnityTestSummary.usage(e)
Binary file pal/Test/Unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf has changed
Binary file pal/Test/Unity/docs/UnityAssertionsReference.pdf has changed
Binary file pal/Test/Unity/docs/UnityConfigurationGuide.pdf has changed
Binary file pal/Test/Unity/docs/UnityGettingStartedGuide.pdf has changed
Binary file pal/Test/Unity/docs/UnityHelperScriptsGuide.pdf has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/docs/license.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) <year> 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + +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.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/readme.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,5 @@ +Example 1 +========= + +Close to the simplest possible example of Unity, using only basic features. +Run make to build & run the example tests. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/src/ProductionCode.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ + +#include "ProductionCode.h" + +int Counter = 0; +int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; /* some obnoxious array to search that is 1-based indexing instead of 0. */ + +/* This function is supposed to search through NumbersToFind and find a particular number. + * If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since + * NumbersToFind is indexed from 1. Unfortunately it's broken + * (and should therefore be caught by our tests) */ +int FindFunction_WhichIsBroken(int NumberToFind) +{ + int i = 0; + while (i <= 8) /* Notice I should have been in braces */ + i++; + if (NumbersToFind[i] == NumberToFind) /* Yikes! I'm getting run after the loop finishes instead of during it! */ + return i; + return 0; +} + +int FunctionWhichReturnsLocalVariable(void) +{ + return Counter; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/src/ProductionCode.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ + +int FindFunction_WhichIsBroken(int NumberToFind); +int FunctionWhichReturnsLocalVariable(void);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/src/ProductionCode2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ + +#include "ProductionCode2.h" + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) +{ + (void)Poor; + (void)LittleFunction; + /* Since There Are No Tests Yet, This Function Could Be Empty For All We Know. + * Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget */ + return (char*)0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/src/ProductionCode2.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/test/TestProductionCode.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,62 @@ + +#include "ProductionCode.h" +#include "unity.h" + +/* sometimes you may want to get at local data in a module. + * for example: If you plan to pass by reference, this could be useful + * however, it should often be avoided */ +extern int Counter; + +void setUp(void) +{ + /* This is run before EACH TEST */ + Counter = 0x5a5a; +} + +void tearDown(void) +{ +} + +void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void) +{ + /* All of these should pass */ + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(1)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); +} + +void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void) +{ + /* You should see this line fail in your test summary */ + TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); + + /* Notice the rest of these didn't get a chance to run because the line above failed. + * Unit tests abort each test function on the first sign of trouble. + * Then NEXT test function runs as normal. */ + TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void) +{ + /* This should be true because setUp set this up for us before this test */ + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); + + /* This should be true because we can still change our answer */ + Counter = 0x1234; + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void) +{ + /* This should be true again because setup was rerun before this test (and after we changed it to 0x1234) */ + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void) +{ + /* Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell + * you what actually happened...which in this case was a failure to setup the initial condition. */ + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/test/TestProductionCode2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ + +#include "ProductionCode2.h" +#include "unity.h" + +/* These should be ignored because they are commented out in various ways: +#include "whatever.h" +#include "somethingelse.h" +*/ + +void setUp(void) +{ +} + +void tearDown(void) +{ +} + +void test_IgnoredTest(void) +{ + TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); +} + +void test_AnotherIgnoredTest(void) +{ + TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); +} + +void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void) +{ + TEST_IGNORE(); /* Like This */ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,53 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "ProductionCode2.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_IgnoredTest(void); +extern void test_AnotherIgnoredTest(void); +extern void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("test/TestProductionCode2.c"); + RUN_TEST(test_IgnoredTest, 18); + RUN_TEST(test_AnotherIgnoredTest, 23); + RUN_TEST(test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented, 28); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,57 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "ProductionCode.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void); +extern void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void); +extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void); +extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void); +extern void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("test/TestProductionCode.c"); + RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode, 20); + RUN_TEST(test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken, 30); + RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue, 41); + RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain, 51); + RUN_TEST(test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed, 57); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/readme.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,5 @@ +Example 2 +========= + +Same as the first example, but now using Unity's test fixture to group tests +together. Using the test fixture also makes writing test runners much easier. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/src/ProductionCode.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ + +#include "ProductionCode.h" + +int Counter = 0; +int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; //some obnoxious array to search that is 1-based indexing instead of 0. + +// This function is supposed to search through NumbersToFind and find a particular number. +// If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since +// NumbersToFind is indexed from 1. Unfortunately it's broken +// (and should therefore be caught by our tests) +int FindFunction_WhichIsBroken(int NumberToFind) +{ + int i = 0; + while (i <= 8) //Notice I should have been in braces + i++; + if (NumbersToFind[i] == NumberToFind) //Yikes! I'm getting run after the loop finishes instead of during it! + return i; + return 0; +} + +int FunctionWhichReturnsLocalVariable(void) +{ + return Counter; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/src/ProductionCode.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ + +int FindFunction_WhichIsBroken(int NumberToFind); +int FunctionWhichReturnsLocalVariable(void);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/src/ProductionCode2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ + +#include "ProductionCode2.h" + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) +{ + (void)Poor; + (void)LittleFunction; + //Since There Are No Tests Yet, This Function Could Be Empty For All We Know. + // Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget + return (char*)0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/src/ProductionCode2.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/test/TestProductionCode.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,64 @@ +#include "ProductionCode.h" +#include "unity.h" +#include "unity_fixture.h" + +TEST_GROUP(ProductionCode); + +//sometimes you may want to get at local data in a module. +//for example: If you plan to pass by reference, this could be useful +//however, it should often be avoided +extern int Counter; + +TEST_SETUP(ProductionCode) +{ + //This is run before EACH TEST + Counter = 0x5a5a; +} + +TEST_TEAR_DOWN(ProductionCode) +{ +} + +TEST(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode) +{ + //All of these should pass + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(1)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); +} + +TEST(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken) +{ + // You should see this line fail in your test summary + TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); + + // Notice the rest of these didn't get a chance to run because the line above failed. + // Unit tests abort each test function on the first sign of trouble. + // Then NEXT test function runs as normal. + TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); +} + +TEST(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue) +{ + //This should be true because setUp set this up for us before this test + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); + + //This should be true because we can still change our answer + Counter = 0x1234; + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +} + +TEST(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain) +{ + //This should be true again because setup was rerun before this test (and after we changed it to 0x1234) + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); +} + +TEST(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed) +{ + //Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell + // you what actually happened...which in this case was a failure to setup the initial condition. + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/test/TestProductionCode2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,33 @@ +#include "ProductionCode2.h" +#include "unity.h" +#include "unity_fixture.h" + +TEST_GROUP(ProductionCode2); + +/* These should be ignored because they are commented out in various ways: +#include "whatever.h" +*/ +//#include "somethingelse.h" + +TEST_SETUP(ProductionCode2) +{ +} + +TEST_TEAR_DOWN(ProductionCode2) +{ +} + +TEST(ProductionCode2, IgnoredTest) +{ + TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); +} + +TEST(ProductionCode2, AnotherIgnoredTest) +{ + TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); +} + +TEST(ProductionCode2, ThisFunctionHasNotBeenTested_NeedsToBeImplemented) +{ + TEST_IGNORE(); //Like This +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,9 @@ +#include "unity.h" +#include "unity_fixture.h" + +TEST_GROUP_RUNNER(ProductionCode2) +{ + RUN_TEST_CASE(ProductionCode2, IgnoredTest); + RUN_TEST_CASE(ProductionCode2, AnotherIgnoredTest); + RUN_TEST_CASE(ProductionCode2, ThisFunctionHasNotBeenTested_NeedsToBeImplemented); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ +#include "unity.h" +#include "unity_fixture.h" + +TEST_GROUP_RUNNER(ProductionCode) +{ + RUN_TEST_CASE(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode); + RUN_TEST_CASE(ProductionCode, FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken); + RUN_TEST_CASE(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue); + RUN_TEST_CASE(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain); + RUN_TEST_CASE(ProductionCode, FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_2/test/test_runners/all_tests.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,12 @@ +#include "unity_fixture.h" + +static void RunAllTests(void) +{ + RUN_TEST_GROUP(ProductionCode); + RUN_TEST_GROUP(ProductionCode2); +} + +int main(int argc, const char * argv[]) +{ + return UnityMain(argc, argv, RunAllTests); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/helper/UnityHelper.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,10 @@ +#include "unity.h" +#include "UnityHelper.h" +#include <stdio.h> +#include <string.h> + +void AssertEqualExampleStruct(const EXAMPLE_STRUCT_T expected, const EXAMPLE_STRUCT_T actual, const unsigned short line) +{ + UNITY_TEST_ASSERT_EQUAL_INT(expected.x, actual.x, line, "Example Struct Failed For Field x"); + UNITY_TEST_ASSERT_EQUAL_INT(expected.y, actual.y, line, "Example Struct Failed For Field y"); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/helper/UnityHelper.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,12 @@ +#ifndef _TESTHELPER_H +#define _TESTHELPER_H + +#include "Types.h" + +void AssertEqualExampleStruct(const EXAMPLE_STRUCT_T expected, const EXAMPLE_STRUCT_T actual, const unsigned short line); + +#define UNITY_TEST_ASSERT_EQUAL_EXAMPLE_STRUCT_T(expected, actual, line, message) AssertEqualExampleStruct(expected, actual, line); + +#define TEST_ASSERT_EQUAL_EXAMPLE_STRUCT_T(expected, actual) UNITY_TEST_ASSERT_EQUAL_EXAMPLE_STRUCT_T(expected, actual, __LINE__, NULL); + +#endif // _TESTHELPER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/rakefile.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,43 @@ +HERE = File.expand_path(File.dirname(__FILE__)) + '/' +UNITY_ROOT = File.expand_path(File.dirname(__FILE__)) + '/../..' + +require 'rake' +require 'rake/clean' +require HERE+'rakefile_helper' + +TEMP_DIRS = [ + File.join(HERE, 'build') +] + +TEMP_DIRS.each do |dir| + directory(dir) + CLOBBER.include(dir) +end + +task :prepare_for_tests => TEMP_DIRS + +include RakefileHelpers + +# Load default configuration, for now +DEFAULT_CONFIG_FILE = 'target_gcc_32.yml' +configure_toolchain(DEFAULT_CONFIG_FILE) + +task :unit => [:prepare_for_tests] do + run_tests get_unit_test_files +end + +desc "Generate test summary" +task :summary do + report_summary +end + +desc "Build and test Unity" +task :all => [:clean, :unit, :summary] +task :default => [:clobber, :all] +task :ci => [:default] +task :cruise => [:default] + +desc "Load configuration" +task :config, :config_file do |t, args| + configure_toolchain(args[:config_file]) +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/rakefile_helper.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,256 @@ +require 'yaml' +require 'fileutils' +require UNITY_ROOT+'/auto/unity_test_summary' +require UNITY_ROOT+'/auto/generate_test_runner' +require UNITY_ROOT+'/auto/colour_reporter' + +module RakefileHelpers + + C_EXTENSION = '.c' + + def load_configuration(config_file) + $cfg_file = config_file + $cfg = YAML.load(File.read($cfg_file)) + end + + def configure_clean + CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? + end + + def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + config_file += '.yml' unless config_file =~ /\.yml$/ + load_configuration(config_file) + configure_clean + end + + def get_unit_test_files + path = $cfg['compiler']['unit_tests_path'] + 'Test*' + C_EXTENSION + path.gsub!(/\\/, '/') + FileList.new(path) + end + + def get_local_include_dirs + include_dirs = $cfg['compiler']['includes']['items'].dup + include_dirs.delete_if {|dir| dir.is_a?(Array)} + return include_dirs + end + + def extract_headers(filename) + includes = [] + lines = File.readlines(filename) + lines.each do |line| + m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) + if not m.nil? + includes << m[1] + end + end + return includes + end + + def find_source_file(header, paths) + paths.each do |dir| + src_file = dir + header.ext(C_EXTENSION) + if (File.exists?(src_file)) + return src_file + end + end + return nil + end + + def tackit(strings) + if strings.is_a?(Array) + result = "\"#{strings.join}\"" + else + result = strings + end + return result + end + + def squash(prefix, items) + result = '' + items.each { |item| result += " #{prefix}#{tackit(item)}" } + return result + end + + def build_compiler_fields + command = tackit($cfg['compiler']['path']) + if $cfg['compiler']['defines']['items'].nil? + defines = '' + else + defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) + end + options = squash('', $cfg['compiler']['options']) + includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) + includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + return {:command => command, :defines => defines, :options => options, :includes => includes} + end + + def compile(file, defines=[]) + compiler = build_compiler_fields + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + + "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" + obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + execute(cmd_str + obj_file) + return obj_file + end + + def build_linker_fields + command = tackit($cfg['linker']['path']) + if $cfg['linker']['options'].nil? + options = '' + else + options = squash('', $cfg['linker']['options']) + end + if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) + includes = '' + else + includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end + includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + return {:command => command, :options => options, :includes => includes} + end + + def link_it(exe_name, obj_list) + linker = build_linker_fields + cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + + (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] + execute(cmd_str) + end + + def build_simulator_fields + return nil if $cfg['simulator'].nil? + if $cfg['simulator']['path'].nil? + command = '' + else + command = (tackit($cfg['simulator']['path']) + ' ') + end + if $cfg['simulator']['pre_support'].nil? + pre_support = '' + else + pre_support = squash('', $cfg['simulator']['pre_support']) + end + if $cfg['simulator']['post_support'].nil? + post_support = '' + else + post_support = squash('', $cfg['simulator']['post_support']) + end + return {:command => command, :pre_support => pre_support, :post_support => post_support} + end + + def execute(command_string, verbose=true, raise_on_fail=true) + report command_string + output = `#{command_string}`.chomp + report(output) if (verbose && !output.nil? && (output.length > 0)) + if (($?.exitstatus != 0) and (raise_on_fail)) + raise "Command failed. (Returned #{$?.exitstatus})" + end + return output + end + + def report_summary + summary = UnityTestSummary.new + summary.set_root_path(HERE) + results_glob = "#{$cfg['compiler']['build_path']}*.test*" + results_glob.gsub!(/\\/, '/') + results = Dir[results_glob] + summary.set_targets(results) + summary.run + fail_out "FAIL: There were failures" if (summary.failures > 0) + end + + def run_tests(test_files) + + report 'Running system tests...' + + # Tack on TEST define for compiling unit tests + load_configuration($cfg_file) + test_defines = ['TEST'] + $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? + $cfg['compiler']['defines']['items'] << 'TEST' + + include_dirs = get_local_include_dirs + + # Build and execute each unit test + test_files.each do |test| + obj_list = [] + + # Detect dependencies and build required required modules + extract_headers(test).each do |header| + # Compile corresponding source file if it exists + src_file = find_source_file(header, include_dirs) + if !src_file.nil? + obj_list << compile(src_file, test_defines) + end + end + + # Build the test runner (generate if configured to do so) + test_base = File.basename(test, C_EXTENSION) + runner_name = test_base + '_Runner.c' + if $cfg['compiler']['runner_path'].nil? + runner_path = $cfg['compiler']['build_path'] + runner_name + test_gen = UnityTestRunnerGenerator.new($cfg_file) + test_gen.run(test, runner_path) + else + runner_path = $cfg['compiler']['runner_path'] + runner_name + end + + obj_list << compile(runner_path, test_defines) + + # Build the test module + obj_list << compile(test, test_defines) + + # Link the test executable + link_it(test_base, obj_list) + + # Execute unit test and generate results file + simulator = build_simulator_fields + executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] + if simulator.nil? + cmd_str = executable + else + cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end + output = execute(cmd_str, true, false) + test_results = $cfg['compiler']['build_path'] + test_base + if output.match(/OK$/m).nil? + test_results += '.testfail' + else + test_results += '.testpass' + end + File.open(test_results, 'w') { |f| f.print output } + end + end + + def build_application(main) + + report "Building application..." + + obj_list = [] + load_configuration($cfg_file) + main_path = $cfg['compiler']['source_path'] + main + C_EXTENSION + + # Detect dependencies and build required required modules + include_dirs = get_local_include_dirs + extract_headers(main_path).each do |header| + src_file = find_source_file(header, include_dirs) + if !src_file.nil? + obj_list << compile(src_file) + end + end + + # Build the main source file + main_base = File.basename(main_path, C_EXTENSION) + obj_list << compile(main_path) + + # Create the executable + link_it(main_base, obj_list) + end + + def fail_out(msg) + puts msg + exit(-1) + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/readme.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,19 @@ +Example 3 +========= + +This example project gives an example of some passing, ignored, and failing tests. +It's simple and meant for you to look over and get an idea for what all of this stuff does. + +You can build and test using the makefile if you have gcc installed (you may need to tweak +the locations of some tools in the makefile). Otherwise, the rake version will let you +test with gcc or a couple versions of IAR. You can tweak the yaml files to get those versions +running. + +Ruby is required if you're using the rake version (obviously). This version shows off most of +Unity's advanced features (automatically creating test runners, fancy summaries, etc.) + +The makefile version doesn't require anything outside of your normal build tools, but won't do the +extras for you. So that you can test right away, we've written the test runners for you and +put them in the test\no_ruby subdirectory. If you make changes to the tests or source, you might +need to update these (like when you add or remove tests). Do that for a while and you'll learn +why you really want to start using the Ruby tools. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/src/ProductionCode.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,24 @@ + +#include "ProductionCode.h" + +int Counter = 0; +int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; //some obnoxious array to search that is 1-based indexing instead of 0. + +// This function is supposed to search through NumbersToFind and find a particular number. +// If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since +// NumbersToFind is indexed from 1. Unfortunately it's broken +// (and should therefore be caught by our tests) +int FindFunction_WhichIsBroken(int NumberToFind) +{ + int i = 0; + while (i <= 8) //Notice I should have been in braces + i++; + if (NumbersToFind[i] == NumberToFind) //Yikes! I'm getting run after the loop finishes instead of during it! + return i; + return 0; +} + +int FunctionWhichReturnsLocalVariable(void) +{ + return Counter; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/src/ProductionCode.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3 @@ + +int FindFunction_WhichIsBroken(int NumberToFind); +int FunctionWhichReturnsLocalVariable(void);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/src/ProductionCode2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,11 @@ + +#include "ProductionCode2.h" + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction) +{ + (void)Poor; + (void)LittleFunction; + //Since There Are No Tests Yet, This Function Could Be Empty For All We Know. + // Which isn't terribly useful... but at least we put in a TEST_IGNORE so we won't forget + return (char*)0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/src/ProductionCode2.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ + +char* ThisFunctionHasNotBeenTested(int Poor, char* LittleFunction);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/target_gcc_32.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,46 @@ +# Copied from ~Unity/targets/gcc_32.yml +unity_root: &unity_root '../..' +compiler: + path: gcc + source_path: 'src/' + unit_tests_path: &unit_tests_path 'test/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m32' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + includes: + prefix: '-I' + items: + - 'src/' + - '../../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m32' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/test/TestProductionCode.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,62 @@ + +#include "ProductionCode.h" +#include "unity.h" + +//sometimes you may want to get at local data in a module. +//for example: If you plan to pass by reference, this could be useful +//however, it should often be avoided +extern int Counter; + +void setUp(void) +{ + //This is run before EACH TEST + Counter = 0x5a5a; +} + +void tearDown(void) +{ +} + +void test_FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode(void) +{ + //All of these should pass + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(78)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(1)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(33)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(999)); + TEST_ASSERT_EQUAL(0, FindFunction_WhichIsBroken(-1)); +} + +void test_FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken(void) +{ + // You should see this line fail in your test summary + TEST_ASSERT_EQUAL(1, FindFunction_WhichIsBroken(34)); + + // Notice the rest of these didn't get a chance to run because the line above failed. + // Unit tests abort each test function on the first sign of trouble. + // Then NEXT test function runs as normal. + TEST_ASSERT_EQUAL(8, FindFunction_WhichIsBroken(8888)); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue(void) +{ + //This should be true because setUp set this up for us before this test + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); + + //This should be true because we can still change our answer + Counter = 0x1234; + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain(void) +{ + //This should be true again because setup was rerun before this test (and after we changed it to 0x1234) + TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable()); +} + +void test_FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed(void) +{ + //Sometimes you get the test wrong. When that happens, you get a failure too... and a quick look should tell + // you what actually happened...which in this case was a failure to setup the initial condition. + TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/example_3/test/TestProductionCode2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,31 @@ + +#include "ProductionCode2.h" +#include "unity.h" + +/* These should be ignored because they are commented out in various ways: +#include "whatever.h" +*/ +//#include "somethingelse.h" + +void setUp(void) +{ +} + +void tearDown(void) +{ +} + +void test_IgnoredTest(void) +{ + TEST_IGNORE_MESSAGE("This Test Was Ignored On Purpose"); +} + +void test_AnotherIgnoredTest(void) +{ + TEST_IGNORE_MESSAGE("These Can Be Useful For Leaving Yourself Notes On What You Need To Do Yet"); +} + +void test_ThisFunctionHasNotBeenTested_NeedsToBeImplemented(void) +{ + TEST_IGNORE(); //Like This +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/examples/unity_config.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,257 @@ +/* Unity Configuration + * As of May 11th, 2016 at ThrowTheSwitch/Unity commit 837c529 + * See Also: Unity/docs/UnityConfigurationGuide.pdf + * + * Unity is designed to run on almost anything that is targeted by a C compiler. + * It would be awesome if this could be done with zero configuration. While + * there are some targets that come close to this dream, it is sadly not + * universal. It is likely that you are going to need at least a couple of the + * configuration options described in this document. + * + * All of Unity's configuration options are `#defines`. Most of these are simple + * definitions. A couple are macros with arguments. They live inside the + * unity_internals.h header file. We don't necessarily recommend opening that + * file unless you really need to. That file is proof that a cross-platform + * library is challenging to build. From a more positive perspective, it is also + * proof that a great deal of complexity can be centralized primarily to one + * place in order to provide a more consistent and simple experience elsewhere. + * + * Using These Options + * It doesn't matter if you're using a target-specific compiler and a simulator + * or a native compiler. In either case, you've got a couple choices for + * configuring these options: + * + * 1. Because these options are specified via C defines, you can pass most of + * these options to your compiler through command line compiler flags. Even + * if you're using an embedded target that forces you to use their + * overbearing IDE for all configuration, there will be a place somewhere in + * your project to configure defines for your compiler. + * 2. You can create a custom `unity_config.h` configuration file (present in + * your toolchain's search paths). In this file, you will list definitions + * and macros specific to your target. All you must do is define + * `UNITY_INCLUDE_CONFIG_H` and Unity will rely on `unity_config.h` for any + * further definitions it may need. + */ + +#ifndef UNITY_CONFIG_H +#define UNITY_CONFIG_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* ************************* AUTOMATIC INTEGER TYPES *************************** + * C's concept of an integer varies from target to target. The C Standard has + * rules about the `int` matching the register size of the target + * microprocessor. It has rules about the `int` and how its size relates to + * other integer types. An `int` on one target might be 16 bits while on another + * target it might be 64. There are more specific types in compilers compliant + * with C99 or later, but that's certainly not every compiler you are likely to + * encounter. Therefore, Unity has a number of features for helping to adjust + * itself to match your required integer sizes. It starts off by trying to do it + * automatically. + **************************************************************************** */ + +/* The first thing that Unity does to guess your types is check `stdint.h`. This + * file includes defines like `UINT_MAX` that Unity can make use of to learn a + * lot about your system. It's possible you don't want it to do this or it's + * possible that your system doesn't support `stdint.h`. If that's the case, + * you're going to want to define this. That way, Unity will know to skip the + * inclusion of this file and you won't be left with a compiler error. + */ +/* #define UNITY_EXCLUDE_STDINT_H */ + +/* The second attempt to guess your types is to check `limits.h`. Some compilers + * that don't support `stdint.h` could include `limits.h` instead. If you don't + * want Unity to check this file either, define this to make it skip the + * inclusion. + */ +/* #define UNITY_EXCLUDE_LIMITS_H */ + +/* The third and final attempt to guess your types is to use the `sizeof()` + * operator. Even if the first two options don't work, this one covers most + * cases. There _is_ a rare compiler or two out there that doesn't support + * `sizeof()` in the preprocessing stage, though. For these, you have the + * ability to disable this feature as well. + */ +/* #define UNITY_EXCLUDE_SIZEOF */ + + +/* ********************** MANUAL INTEGER TYPE DEFINITION *********************** + * If you've disabled all of the automatic options above, you're going to have + * to do the configuration yourself. There are just a handful of defines that + * you are going to specify if you don't like the defaults. + **************************************************************************** */ + + /* Define this to be the number of bits an `int` takes up on your system. The + * default, if not auto-detected, is 32 bits. + * + * Example: + */ +/* #define UNITY_INT_WIDTH 16 */ + +/* Define this to be the number of bits a `long` takes up on your system. The + * default, if not autodetected, is 32 bits. This is used to figure out what + * kind of 64-bit support your system can handle. Does it need to specify a + * `long` or a `long long` to get a 64-bit value. On 16-bit systems, this option + * is going to be ignored. + * + * Example: + */ +/* #define UNITY_LONG_WIDTH 16 */ + +/* Define this to be the number of bits a pointer takes up on your system. The + * default, if not autodetected, is 32-bits. If you're getting ugly compiler + * warnings about casting from pointers, this is the one to look at. + * + * Example: + */ +/* #define UNITY_POINTER_WIDTH 64 */ + +/* Unity will automatically include 64-bit support if it auto-detects it, or if + * your `int`, `long`, or pointer widths are greater than 32-bits. Define this + * to enable 64-bit support if none of the other options already did it for you. + * There can be a significant size and speed impact to enabling 64-bit support + * on small targets, so don't define it if you don't need it. + */ +/* #define UNITY_INCLUDE_64 */ + + +/* *************************** FLOATING POINT TYPES **************************** + * In the embedded world, it's not uncommon for targets to have no support for + * floating point operations at all or to have support that is limited to only + * single precision. We are able to guess integer sizes on the fly because + * integers are always available in at least one size. Floating point, on the + * other hand, is sometimes not available at all. Trying to include `float.h` on + * these platforms would result in an error. This leaves manual configuration as + * the only option. + **************************************************************************** */ + + /* By default, Unity guesses that you will want single precision floating point + * support, but not double precision. It's easy to change either of these using + * the include and exclude options here. You may include neither, either, or + * both, as suits your needs. + */ +/* #define UNITY_INCLUDE_FLOAT */ +/* #define UNITY_EXCLUDE_FLOAT */ +/* #define UNITY_INCLUDE_DOUBLE */ +/* #define UNITY_EXCLUDE_DOUBLE */ + +/* For features that are enabled, the following floating point options also + * become available. + */ + +/* Unity aims for as small of a footprint as possible and avoids most standard + * library calls (some embedded platforms don't have a standard library!). + * Because of this, its routines for printing integer values are minimalist and + * hand-coded. To keep Unity universal, though, we chose to _not_ develop our + * own floating point print routines. Instead, the display of floating point + * values during a failure are optional. By default, Unity will not print the + * actual results of floating point assertion failure. So a failed assertion + * will produce a message like `"Values Not Within Delta"`. If you would like + * verbose failure messages for floating point assertions, use these options to + * give more explicit failure messages (e.g. `"Expected 4.56 Was 4.68"`). Note + * that this feature requires the use of `sprintf` so might not be desirable in + * all cases. + */ +/* #define UNITY_FLOAT_VERBOSE */ +/* #define UNITY_DOUBLE_VERBOSE */ + +/* If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C + * floats. If your compiler supports a specialty floating point type, you can + * always override this behavior by using this definition. + * + * Example: + */ +/* #define UNITY_FLOAT_TYPE float16_t */ + +/* If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard + * C doubles. If you would like to change this, you can specify something else + * by using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long + * double` could enable gargantuan floating point types on your 64-bit processor + * instead of the standard `double`. + * + * Example: + */ +/* #define UNITY_DOUBLE_TYPE long double */ + +/* If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as + * documented in the Unity Assertion Guide, you will learn that they are not + * really asserting that two values are equal but rather that two values are + * "close enough" to equal. "Close enough" is controlled by these precision + * configuration options. If you are working with 32-bit floats and/or 64-bit + * doubles (the normal on most processors), you should have no need to change + * these options. They are both set to give you approximately 1 significant bit + * in either direction. The float precision is 0.00001 while the double is + * 10^-12. For further details on how this works, see the appendix of the Unity + * Assertion Guide. + * + * Example: + */ +/* #define UNITY_FLOAT_PRECISION 0.001f */ +/* #define UNITY_DOUBLE_PRECISION 0.001f */ + + +/* *************************** TOOLSET CUSTOMIZATION *************************** + * In addition to the options listed above, there are a number of other options + * which will come in handy to customize Unity's behavior for your specific + * toolchain. It is possible that you may not need to touch any of these but + * certain platforms, particularly those running in simulators, may need to jump + * through extra hoops to operate properly. These macros will help in those + * situations. + **************************************************************************** */ + +/* By default, Unity prints its results to `stdout` as it runs. This works + * perfectly fine in most situations where you are using a native compiler for + * testing. It works on some simulators as well so long as they have `stdout` + * routed back to the command line. There are times, however, where the + * simulator will lack support for dumping results or you will want to route + * results elsewhere for other reasons. In these cases, you should define the + * `UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time + * (as an `int`, since this is the parameter type of the standard C `putchar` + * function most commonly used). You may replace this with whatever function + * call you like. + * + * Example: + * Say you are forced to run your test suite on an embedded processor with no + * `stdout` option. You decide to route your test result output to a custom + * serial `RS232_putc()` function you wrote like thus: + */ +/* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ +/* #define UNITY_OUTPUT_FLUSH() RS232_config(115200,1,8,0) */ +/* #define UNITY_OUTPUT_START() RS232_flush() */ +/* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ + +/* For some targets, Unity can make the otherwise required `setUp()` and + * `tearDown()` functions optional. This is a nice convenience for test writers + * since `setUp` and `tearDown` don't often actually _do_ anything. If you're + * using gcc or clang, this option is automatically defined for you. Other + * compilers can also support this behavior, if they support a C feature called + * weak functions. A weak function is a function that is compiled into your + * executable _unless_ a non-weak version of the same function is defined + * elsewhere. If a non-weak version is found, the weak version is ignored as if + * it never existed. If your compiler supports this feature, you can let Unity + * know by defining `UNITY_SUPPORT_WEAK` as the function attributes that would + * need to be applied to identify a function as weak. If your compiler lacks + * support for weak functions, you will always need to define `setUp` and + * `tearDown` functions (though they can be and often will be just empty). The + * most common options for this feature are: + */ +/* #define UNITY_SUPPORT_WEAK weak */ +/* #define UNITY_SUPPORT_WEAK __attribute__((weak)) */ + +/* Some compilers require a custom attribute to be assigned to pointers, like + * `near` or `far`. In these cases, you can give Unity a safe default for these + * by defining this option with the attribute you would like. + * + * Example: + */ +/* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ +/* #define UNITY_PTR_ATTRIBUTE near */ + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif /* UNITY_CONFIG_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/eclipse/error_parsers.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +Eclipse error parsers +===================== + +These are a godsend for extracting & quickly navigating to +warnings & error messages from console output. Unforunately +I don't know how to write an Eclipse plugin so you'll have +to add them manually. + +To add a console parser to Eclipse, go to Window --> Preferences +--> C/C++ --> Build --> Settings. Click on the 'Error Parsers' +tab and then click the 'Add...' button. See the table below for +the parser fields to add. + +Eclipse will only parse the console output during a build, so +running your unit tests must be part of your build process. +Either add this to your make/rakefile, or add it as a post- +build step in your Eclipse project settings. + + +Unity unit test error parsers +----------------------------- +Severity Pattern File Line Description +------------------------------------------------------------------------------- +Error (\.+)(.*?):(\d+):(.*?):FAIL: (.*) $2 $3 $5 +Warning (\.+)(.*?):(\d+):(.*?):IGNORE: (.*) $2 $3 $5 +Warning (\.+)(.*?):(\d+):(.*?):IGNORE\s*$ $2 $3 Ignored test
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/rakefile.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,48 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +HERE = File.expand_path(File.dirname(__FILE__)) + '/' + +require 'rake' +require 'rake/clean' +require 'rake/testtask' +require HERE + 'rakefile_helper' + +TEMP_DIRS = [ + File.join(HERE, 'build') +] + +TEMP_DIRS.each do |dir| + directory(dir) + CLOBBER.include(dir) +end + +task :prepare_for_tests => TEMP_DIRS + +include RakefileHelpers + +# Load default configuration, for now +DEFAULT_CONFIG_FILE = 'gcc_auto_stdint.yml' +configure_toolchain(DEFAULT_CONFIG_FILE) + +task :unit => [:prepare_for_tests] do + run_tests +end + +desc "Build and test Unity Framework" +task :all => [:clean, :unit] +task :default => [:clobber, :all] +task :ci => [:no_color, :default] +task :cruise => [:no_color, :default] + +desc "Load configuration" +task :config, :config_file do |t, args| + configure_toolchain(args[:config_file]) +end + +task :no_color do + $colour_output = false +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/rakefile_helper.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,179 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +require 'yaml' +require 'fileutils' +require HERE+'../../auto/unity_test_summary' +require HERE+'../../auto/generate_test_runner' +require HERE+'../../auto/colour_reporter' + +module RakefileHelpers + + C_EXTENSION = '.c' + + def load_configuration(config_file) + unless ($configured) + $cfg_file = HERE+"../../test/targets/#{config_file}" unless (config_file =~ /[\\|\/]/) + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if (config_file != DEFAULT_CONFIG_FILE) + end + end + + def configure_clean + CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? + end + + def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + config_file += '.yml' unless config_file =~ /\.yml$/ + config_file = config_file unless config_file =~ /[\\|\/]/ + load_configuration(config_file) + configure_clean + end + + def tackit(strings) + if strings.is_a?(Array) + result = "\"#{strings.join}\"" + else + result = strings + end + return result + end + + def squash(prefix, items) + result = '' + items.each { |item| result += " #{prefix}#{tackit(item)}" } + return result + end + + def build_compiler_fields + command = tackit($cfg['compiler']['path']) + if $cfg['compiler']['defines']['items'].nil? + defines = '' + else + defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) + end + options = squash('', $cfg['compiler']['options']) + includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) + includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + return {:command => command, :defines => defines, :options => options, :includes => includes} + end + + def compile(file, defines=[]) + compiler = build_compiler_fields + unity_include = $cfg['compiler']['includes']['prefix']+'../../src' + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " + + "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" + + "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + execute(cmd_str) + end + + def build_linker_fields + command = tackit($cfg['linker']['path']) + if $cfg['linker']['options'].nil? + options = '' + else + options = squash('', $cfg['linker']['options']) + end + if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) + includes = '' + else + includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end + includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + return {:command => command, :options => options, :includes => includes} + end + + def link_it(exe_name, obj_list) + linker = build_linker_fields + cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + + (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] + execute(cmd_str) + end + + def build_simulator_fields + return nil if $cfg['simulator'].nil? + if $cfg['simulator']['path'].nil? + command = '' + else + command = (tackit($cfg['simulator']['path']) + ' ') + end + if $cfg['simulator']['pre_support'].nil? + pre_support = '' + else + pre_support = squash('', $cfg['simulator']['pre_support']) + end + if $cfg['simulator']['post_support'].nil? + post_support = '' + else + post_support = squash('', $cfg['simulator']['post_support']) + end + return {:command => command, :pre_support => pre_support, :post_support => post_support} + end + + def execute(command_string, verbose=true) + report command_string + output = `#{command_string}`.chomp + report(output) if (verbose && !output.nil? && (output.length > 0)) + if ($?.exitstatus != 0) + raise "Command failed. (Returned #{$?.exitstatus})" + end + return output + end + + def report_summary + summary = UnityTestSummary.new + summary.set_root_path(HERE) + results_glob = "#{$cfg['compiler']['build_path']}*.test*" + results_glob.gsub!(/\\/, '/') + results = Dir[results_glob] + summary.set_targets(results) + summary.run + end + + def run_tests + report 'Running Unity system tests...' + + # Tack on TEST define for compiling unit tests + load_configuration($cfg_file) + test_defines = ['TEST'] + $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? + + # Get a list of all source files needed + src_files = Dir[HERE+'src/*.c'] + src_files += Dir[HERE+'test/*.c'] + src_files += Dir[HERE+'test/main/*.c'] + src_files << '../../src/unity.c' + + # Build object files + src_files.each { |f| compile(f, test_defines) } + obj_list = src_files.map {|f| File.basename(f.ext($cfg['compiler']['object_files']['extension'])) } + + # Link the test executable + test_base = "framework_test" + link_it(test_base, obj_list) + + # Execute unit test and generate results file + simulator = build_simulator_fields + executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] + if simulator.nil? + cmd_str = executable + " -v -r" + else + cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end + output = execute(cmd_str) + test_results = $cfg['compiler']['build_path'] + test_base + if output.match(/OK$/m).nil? + test_results += '.testfail' + else + test_results += '.testpass' + end + File.open(test_results, 'w') { |f| f.print output } + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/readme.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,9 @@ +Copyright (c) 2010 James Grenning and Contributed to Unity Project + +Unity Project - A Test Framework for C +Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +[Released under MIT License. Please refer to license.txt for details] + +This Framework is an optional add-on to Unity. By including unity_framework.h in place of unity.h, +you may now work with Unity in a manner similar to CppUTest. This framework adds the concepts of +test groups and gives finer control of your tests over the command line. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/src/unity_fixture.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,456 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#include <string.h> +#include "unity_fixture.h" +#include "unity_internals.h" + +#define UNITY_RESULTS_TAGS_TEST_START "<***UnityTest***>" +#define UNITY_RESULTS_TAGS_TEST_END "</***UnityTest***>" + +#define UNITY_RESULTS_TAGS_RESULT_START "<***UnityResult***>" +#define UNITY_RESULTS_TAGS_RESULT_END "</***UnityResult***>" + +#define UNITY_RESULTS_TAGS_IGNORE_START "<***UnityIgnoredTest***>" +#define UNITY_RESULTS_TAGS_IGNORE_END "</***UnityIgnoredTest***>" + +struct _UnityFixture UnityFixture; + +//If you decide to use the function pointer approach. +//Build with -D UNITY_OUTPUT_CHAR=outputChar and include <stdio.h> +//int (*outputChar)(int) = putchar; + +#if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA) +void setUp(void) { /*does nothing*/ } +void tearDown(void) { /*does nothing*/ } +#endif + +static void announceTestRun(unsigned int runNumber) +{ + UnityPrint("Unity test run "); + UnityPrintNumberUnsigned(runNumber+1); + UnityPrint(" of "); + UnityPrintNumberUnsigned(UnityFixture.RepeatCount); + UNITY_PRINT_EOL(); +} + +int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)) +{ + int result = UnityGetCommandLineOptions(argc, argv); + unsigned int r; + if (result != 0) + return result; + + for (r = 0; r < UnityFixture.RepeatCount; r++) + { + UnityBegin(argv[0]); + announceTestRun(r); + runAllTests(); + UNITY_PRINT_EOL(); + UnityEnd(); + } + + return (int)Unity.TestFailures; +} + +static int selected(const char* filter, const char* name) +{ + if (filter == 0) + return 1; + return strstr(name, filter) ? 1 : 0; +} + +static int testSelected(const char* test) +{ + return selected(UnityFixture.NameFilter, test); +} + +static int groupSelected(const char* group) +{ + return selected(UnityFixture.GroupFilter, group); +} + +void UnityTestRunner(unityfunction* setup, + unityfunction* testBody, + unityfunction* teardown, + const char* printableName, + const char* group, + const char* name, + const char* file, unsigned int line) +{ + if (testSelected(name) && groupSelected(group)) + { + Unity.TestFile = file; + Unity.CurrentTestName = printableName; + Unity.CurrentTestLineNumber = line; + if (!UnityFixture.Verbose) + UNITY_OUTPUT_CHAR('.'); + else + { + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_TEST_START); + UnityPrint(printableName); + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_TEST_END); + //UnityPrint(printableName); + } + + Unity.NumberOfTests++; + UnityMalloc_StartTest(); + UnityPointer_Init(); + + if (TEST_PROTECT()) + { + setup(); + testBody(); + } + if (TEST_PROTECT()) + { + teardown(); + } + if (TEST_PROTECT()) + { + UnityPointer_UndoAllSets(); + if (!Unity.CurrentTestFailed) + UnityMalloc_EndTest(); + } + UnityConcludeFixtureTest(); + } +} + +void UnityIgnoreTest(const char* printableName, const char* group, const char* name) +{ + if (testSelected(name) && groupSelected(group)) + { + Unity.NumberOfTests++; + Unity.TestIgnores++; + if (!UnityFixture.Verbose) + UNITY_OUTPUT_CHAR('!'); + else + { + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_IGNORE_START); + UnityPrint(printableName); + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_IGNORE_END); + //UnityPrint(printableName); + //UNITY_PRINT_EOL(); + } + } +} + + +//------------------------------------------------- +//Malloc and free stuff +// +#define MALLOC_DONT_FAIL -1 +static int malloc_count; +static int malloc_fail_countdown = MALLOC_DONT_FAIL; + +void UnityMalloc_StartTest(void) +{ + malloc_count = 0; + malloc_fail_countdown = MALLOC_DONT_FAIL; +} + +void UnityMalloc_EndTest(void) +{ + malloc_fail_countdown = MALLOC_DONT_FAIL; + if (malloc_count != 0) + { + UNITY_TEST_FAIL(Unity.CurrentTestLineNumber, "This test leaks!"); + } +} + +void UnityMalloc_MakeMallocFailAfterCount(int countdown) +{ + malloc_fail_countdown = countdown; +} + +// These definitions are always included from unity_fixture_malloc_overrides.h +// We undef to use them or avoid conflict with <stdlib.h> per the C standard +#undef malloc +#undef free +#undef calloc +#undef realloc + +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC +static unsigned char unity_heap[UNITY_INTERNAL_HEAP_SIZE_BYTES]; +static size_t heap_index; +#else +#include <stdlib.h> +#endif + +typedef struct GuardBytes +{ + size_t size; + size_t guard_space; +} Guard; + + +static const char end[] = "END"; + +void* unity_malloc(size_t size) +{ + char* mem; + Guard* guard; + size_t total_size = size + sizeof(Guard) + sizeof(end); + + if (malloc_fail_countdown != MALLOC_DONT_FAIL) + { + if (malloc_fail_countdown == 0) + return NULL; + malloc_fail_countdown--; + } + + if (size == 0) return NULL; +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC + if (heap_index + total_size > UNITY_INTERNAL_HEAP_SIZE_BYTES) + { + guard = NULL; + } + else + { + guard = (Guard*) &unity_heap[heap_index]; + heap_index += total_size; + } +#else + guard = (Guard*)UNITY_FIXTURE_MALLOC(total_size); +#endif + if (guard == NULL) return NULL; + malloc_count++; + guard->size = size; + guard->guard_space = 0; + mem = (char*)&(guard[1]); + memcpy(&mem[size], end, sizeof(end)); + + return (void*)mem; +} + +static int isOverrun(void* mem) +{ + Guard* guard = (Guard*)mem; + char* memAsChar = (char*)mem; + guard--; + + return guard->guard_space != 0 || strcmp(&memAsChar[guard->size], end) != 0; +} + +static void release_memory(void* mem) +{ + Guard* guard = (Guard*)mem; + guard--; + + malloc_count--; +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC + if (mem == unity_heap + heap_index - guard->size - sizeof(end)) + { + heap_index -= (guard->size + sizeof(Guard) + sizeof(end)); + } +#else + UNITY_FIXTURE_FREE(guard); +#endif +} + +void unity_free(void* mem) +{ + int overrun; + + if (mem == NULL) + { + return; + } + + overrun = isOverrun(mem); + release_memory(mem); + if (overrun) + { + UNITY_TEST_FAIL(Unity.CurrentTestLineNumber, "Buffer overrun detected during free()"); + } +} + +void* unity_calloc(size_t num, size_t size) +{ + void* mem = unity_malloc(num * size); + if (mem == NULL) return NULL; + memset(mem, 0, num * size); + return mem; +} + +void* unity_realloc(void* oldMem, size_t size) +{ + Guard* guard = (Guard*)oldMem; + void* newMem; + + if (oldMem == NULL) return unity_malloc(size); + + guard--; + if (isOverrun(oldMem)) + { + release_memory(oldMem); + UNITY_TEST_FAIL(Unity.CurrentTestLineNumber, "Buffer overrun detected during realloc()"); + } + + if (size == 0) + { + release_memory(oldMem); + return NULL; + } + + if (guard->size >= size) return oldMem; + +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC // Optimization if memory is expandable + if (oldMem == unity_heap + heap_index - guard->size - sizeof(end) && + heap_index + size - guard->size <= UNITY_INTERNAL_HEAP_SIZE_BYTES) + { + release_memory(oldMem); // Not thread-safe, like unity_heap generally + return unity_malloc(size); // No memcpy since data is in place + } +#endif + newMem = unity_malloc(size); + if (newMem == NULL) return NULL; // Do not release old memory + memcpy(newMem, oldMem, guard->size); + release_memory(oldMem); + return newMem; +} + + +//-------------------------------------------------------- +//Automatic pointer restoration functions +struct PointerPair +{ + void** pointer; + void* old_value; +}; + +enum { MAX_POINTERS = 50 }; +static struct PointerPair pointer_store[MAX_POINTERS]; +static int pointer_index = 0; + +void UnityPointer_Init(void) +{ + pointer_index = 0; +} + +void UnityPointer_Set(void** pointer, void* newValue, UNITY_LINE_TYPE line) +{ + if (pointer_index >= MAX_POINTERS) + { + UNITY_TEST_FAIL(line, "Too many pointers set"); + } + else + { + pointer_store[pointer_index].pointer = pointer; + pointer_store[pointer_index].old_value = *pointer; + *pointer = newValue; + pointer_index++; + } +} + +void UnityPointer_UndoAllSets(void) +{ + while (pointer_index > 0) + { + pointer_index--; + *(pointer_store[pointer_index].pointer) = + pointer_store[pointer_index].old_value; + } +} + +int UnityGetCommandLineOptions(int argc, const char* argv[]) +{ + int i; + UnityFixture.Verbose = 0; + UnityFixture.GroupFilter = 0; + UnityFixture.NameFilter = 0; + UnityFixture.RepeatCount = 1; + + if (argc == 1) + return 0; + + for (i = 1; i < argc; ) + { + if (strcmp(argv[i], "-v") == 0) + { + UnityFixture.Verbose = 1; + i++; + } + else if (strcmp(argv[i], "-g") == 0) + { + i++; + if (i >= argc) + return 1; + UnityFixture.GroupFilter = argv[i]; + i++; + } + else if (strcmp(argv[i], "-n") == 0) + { + i++; + if (i >= argc) + return 1; + UnityFixture.NameFilter = argv[i]; + i++; + } + else if (strcmp(argv[i], "-r") == 0) + { + UnityFixture.RepeatCount = 2; + i++; + if (i < argc) + { + if (*(argv[i]) >= '0' && *(argv[i]) <= '9') + { + unsigned int digit = 0; + UnityFixture.RepeatCount = 0; + while (argv[i][digit] >= '0' && argv[i][digit] <= '9') + { + UnityFixture.RepeatCount *= 10; + UnityFixture.RepeatCount += (unsigned int)argv[i][digit++] - '0'; + } + i++; + } + } + } else { + // ignore unknown parameter + i++; + } + } + return 0; +} + +void UnityConcludeFixtureTest(void) +{ + if (Unity.CurrentTestIgnored) + { + Unity.TestIgnores++; + UNITY_PRINT_EOL(); + } + else if (!Unity.CurrentTestFailed) + { + if (UnityFixture.Verbose) + { + UnityPrint(" "); + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_RESULT_START); + UnityPrint("PASS"); + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_RESULT_END); + UNITY_OUTPUT_CHAR('\n'); + } +// { +// UnityPrint(" PASS"); +// UNITY_PRINT_EOL(); +// } + } + else // Unity.CurrentTestFailed + { + Unity.TestFailures++; + UNITY_PRINT_EOL(); + } + + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/src/unity_fixture.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,78 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_FIXTURE_H_ +#define UNITY_FIXTURE_H_ + +#include "unity.h" +#include "unity_internals.h" +#include "unity_fixture_malloc_overrides.h" +#include "unity_fixture_internals.h" + +int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); + + +#define TEST_GROUP(group)\ + static const char* TEST_GROUP_##group = #group + +#define TEST_SETUP(group) void TEST_##group##_SETUP(void);\ + void TEST_##group##_SETUP(void) + +#define TEST_TEAR_DOWN(group) void TEST_##group##_TEAR_DOWN(void);\ + void TEST_##group##_TEAR_DOWN(void) + + +#define TEST(group, name) \ + void TEST_##group##_##name##_(void);\ + void TEST_##group##_##name##_run(void);\ + void TEST_##group##_##name##_run(void)\ + {\ + UnityTestRunner(TEST_##group##_SETUP,\ + TEST_##group##_##name##_,\ + TEST_##group##_TEAR_DOWN,\ + "TEST(" #group ", " #name ")",\ + TEST_GROUP_##group, #name,\ + __FILE__, __LINE__);\ + }\ + void TEST_##group##_##name##_(void) + +#define IGNORE_TEST(group, name) \ + void TEST_##group##_##name##_(void);\ + void TEST_##group##_##name##_run(void);\ + void TEST_##group##_##name##_run(void)\ + {\ + UnityIgnoreTest("IGNORE_TEST(" #group ", " #name ")", TEST_GROUP_##group, #name);\ + }\ + void TEST_##group##_##name##_(void) + +#define RUN_TEST_CASE(group, name) \ + { void TEST_##group##_##name##_run(void);\ + TEST_##group##_##name##_run(); } + +//This goes at the bottom of each test file or in a separate c file +#define TEST_GROUP_RUNNER(group)\ + void TEST_##group##_GROUP_RUNNER(void);\ + void TEST_##group##_GROUP_RUNNER(void) + +//Call this from main +#define RUN_TEST_GROUP(group)\ + { void TEST_##group##_GROUP_RUNNER(void);\ + TEST_##group##_GROUP_RUNNER(); } + +//CppUTest Compatibility Macros +#define UT_PTR_SET(ptr, newPointerValue) UnityPointer_Set((void**)&(ptr), (void*)(newPointerValue), __LINE__) +#define TEST_ASSERT_POINTERS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_PTR((expected), (actual)) +#define TEST_ASSERT_BYTES_EQUAL(expected, actual) TEST_ASSERT_EQUAL_HEX8(0xff & (expected), 0xff & (actual)) +#define FAIL(message) TEST_FAIL_MESSAGE((message)) +#define CHECK(condition) TEST_ASSERT_TRUE((condition)) +#define LONGS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_INT((expected), (actual)) +#define STRCMP_EQUAL(expected, actual) TEST_ASSERT_EQUAL_STRING((expected), (actual)) +#define DOUBLES_EQUAL(expected, actual, delta) TEST_ASSERT_FLOAT_WITHIN(((expected), (actual), (delta)) + +void UnityMalloc_MakeMallocFailAfterCount(int count); + +#endif /* UNITY_FIXTURE_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/src/unity_fixture_internals.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,39 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_FIXTURE_INTERNALS_H_ +#define UNITY_FIXTURE_INTERNALS_H_ + +struct _UnityFixture +{ + int Verbose; + unsigned int RepeatCount; + const char* NameFilter; + const char* GroupFilter; +}; +extern struct _UnityFixture UnityFixture; + +typedef void unityfunction(void); +void UnityTestRunner(unityfunction* setup, + unityfunction* body, + unityfunction* teardown, + const char* printableName, + const char* group, + const char* name, + const char* file, unsigned int line); + +void UnityIgnoreTest(const char* printableName, const char* group, const char* name); +void UnityMalloc_StartTest(void); +void UnityMalloc_EndTest(void); +int UnityGetCommandLineOptions(int argc, const char* argv[]); +void UnityConcludeFixtureTest(void); + +void UnityPointer_Set(void** ptr, void* newValue, UNITY_LINE_TYPE line); +void UnityPointer_UndoAllSets(void); +void UnityPointer_Init(void); + +#endif /* UNITY_FIXTURE_INTERNALS_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/src/unity_fixture_malloc_overrides.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,46 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_FIXTURE_MALLOC_OVERRIDES_H_ +#define UNITY_FIXTURE_MALLOC_OVERRIDES_H_ + +#include <stddef.h> + +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC +// Define this macro to remove the use of stdlib.h, malloc, and free. +// Many embedded systems do not have a heap or malloc/free by default. +// This internal unity_malloc() provides allocated memory deterministically from +// the end of an array only, unity_free() only releases from end-of-array, +// blocks are not coalesced, and memory not freed in LIFO order is stranded. + #ifndef UNITY_INTERNAL_HEAP_SIZE_BYTES + #define UNITY_INTERNAL_HEAP_SIZE_BYTES 256 + #endif +#endif + +// These functions are used by the Unity Fixture to allocate and release memory +// on the heap and can be overridden with platform-specific implementations. +// For example, when using FreeRTOS UNITY_FIXTURE_MALLOC becomes pvPortMalloc() +// and UNITY_FIXTURE_FREE becomes vPortFree(). +#if !defined(UNITY_FIXTURE_MALLOC) || !defined(UNITY_FIXTURE_FREE) + #define UNITY_FIXTURE_MALLOC(size) malloc(size) + #define UNITY_FIXTURE_FREE(ptr) free(ptr) +#else + extern void* UNITY_FIXTURE_MALLOC(size_t size); + extern void UNITY_FIXTURE_FREE(void* ptr); +#endif + +#define malloc unity_malloc +#define calloc unity_calloc +#define realloc unity_realloc +#define free unity_free + +void* unity_malloc(size_t size); +void* unity_calloc(size_t num, size_t size); +void* unity_realloc(void * oldMem, size_t size); +void unity_free(void * mem); + +#endif /* UNITY_FIXTURE_MALLOC_OVERRIDES_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/test/main/AllTests.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,22 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#include "unity_fixture.h" + +static void runAllTests(void) +{ + RUN_TEST_GROUP(UnityFixture); + RUN_TEST_GROUP(UnityCommandOptions); + RUN_TEST_GROUP(LeakDetection); + RUN_TEST_GROUP(InternalMalloc); +} + +int main(int argc, const char* argv[]) +{ + return UnityMain(argc, argv, runAllTests); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/test/template_fixture_tests.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,39 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#include "unity_fixture.h" + +static int data = -1; + +TEST_GROUP(mygroup); + +TEST_SETUP(mygroup) +{ + data = 0; +} + +TEST_TEAR_DOWN(mygroup) +{ + data = -1; +} + +TEST(mygroup, test1) +{ + TEST_ASSERT_EQUAL_INT(0, data); +} + +TEST(mygroup, test2) +{ + TEST_ASSERT_EQUAL_INT(0, data); + data = 5; +} + +TEST(mygroup, test3) +{ + data = 7; + TEST_ASSERT_EQUAL_INT(7, data); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/test/unity_fixture_Test.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,533 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#include "unity_fixture.h" +#include "unity_output_Spy.h" +#include <stdlib.h> +#include <string.h> + +TEST_GROUP(UnityFixture); + +TEST_SETUP(UnityFixture) +{ +} + +TEST_TEAR_DOWN(UnityFixture) +{ +} + +static int* pointer1 = 0; +static int* pointer2 = (int*)2; +static int* pointer3 = (int*)3; +static int int1; +static int int2; +static int int3; +static int int4; + +TEST(UnityFixture, PointerSetting) +{ + TEST_ASSERT_POINTERS_EQUAL(pointer1, 0); + UT_PTR_SET(pointer1, &int1); + UT_PTR_SET(pointer2, &int2); + UT_PTR_SET(pointer3, &int3); + TEST_ASSERT_POINTERS_EQUAL(pointer1, &int1); + TEST_ASSERT_POINTERS_EQUAL(pointer2, &int2); + TEST_ASSERT_POINTERS_EQUAL(pointer3, &int3); + UT_PTR_SET(pointer1, &int4); + UnityPointer_UndoAllSets(); + TEST_ASSERT_POINTERS_EQUAL(pointer1, 0); + TEST_ASSERT_POINTERS_EQUAL(pointer2, (int*)2); + TEST_ASSERT_POINTERS_EQUAL(pointer3, (int*)3); +} + +TEST(UnityFixture, ForceMallocFail) +{ + void* m; + void* mfails; + UnityMalloc_MakeMallocFailAfterCount(1); + m = malloc(10); + CHECK(m); + mfails = malloc(10); + TEST_ASSERT_POINTERS_EQUAL(0, mfails); + free(m); +} + +TEST(UnityFixture, ReallocSmallerIsUnchanged) +{ + void* m1 = malloc(10); + void* m2 = realloc(m1, 5); + TEST_ASSERT_POINTERS_EQUAL(m1, m2); + free(m2); +} + +TEST(UnityFixture, ReallocSameIsUnchanged) +{ + void* m1 = malloc(10); + void* m2 = realloc(m1, 10); + TEST_ASSERT_POINTERS_EQUAL(m1, m2); + free(m2); +} + +TEST(UnityFixture, ReallocLargerNeeded) +{ + void* m1 = malloc(10); + void* m2; + CHECK(m1); + strcpy((char*)m1, "123456789"); + m2 = realloc(m1, 15); + // CHECK(m1 != m2); //Depends on implementation + STRCMP_EQUAL("123456789", m2); + free(m2); +} + +TEST(UnityFixture, ReallocNullPointerIsLikeMalloc) +{ + void* m = realloc(0, 15); + CHECK(m != 0); + free(m); +} + +TEST(UnityFixture, ReallocSizeZeroFreesMemAndReturnsNullPointer) +{ + void* m1 = malloc(10); + void* m2 = realloc(m1, 0); + TEST_ASSERT_POINTERS_EQUAL(0, m2); +} + +TEST(UnityFixture, CallocFillsWithZero) +{ + void* m = calloc(3, sizeof(char)); + char* s = (char*)m; + CHECK(m); + TEST_ASSERT_BYTES_EQUAL(0, s[0]); + TEST_ASSERT_BYTES_EQUAL(0, s[1]); + TEST_ASSERT_BYTES_EQUAL(0, s[2]); + free(m); +} + +static char *p1; +static char *p2; + +TEST(UnityFixture, PointerSet) +{ + char c1; + char c2; + char newC1; + char newC2; + p1 = &c1; + p2 = &c2; + + UnityPointer_Init(); + UT_PTR_SET(p1, &newC1); + UT_PTR_SET(p2, &newC2); + TEST_ASSERT_POINTERS_EQUAL(&newC1, p1); + TEST_ASSERT_POINTERS_EQUAL(&newC2, p2); + UnityPointer_UndoAllSets(); + TEST_ASSERT_POINTERS_EQUAL(&c1, p1); + TEST_ASSERT_POINTERS_EQUAL(&c2, p2); +} + +TEST(UnityFixture, FreeNULLSafety) +{ + free(NULL); +} + +TEST(UnityFixture, ConcludeTestIncrementsFailCount) +{ + _U_UINT savedFails = Unity.TestFailures; + _U_UINT savedIgnores = Unity.TestIgnores; + UnityOutputCharSpy_Enable(1); + Unity.CurrentTestFailed = 1; + UnityConcludeFixtureTest(); // Resets TestFailed for this test to pass + Unity.CurrentTestIgnored = 1; + UnityConcludeFixtureTest(); // Resets TestIgnored + UnityOutputCharSpy_Enable(0); + TEST_ASSERT_EQUAL(savedFails + 1, Unity.TestFailures); + TEST_ASSERT_EQUAL(savedIgnores + 1, Unity.TestIgnores); + Unity.TestFailures = savedFails; + Unity.TestIgnores = savedIgnores; +} + +//------------------------------------------------------------ + +TEST_GROUP(UnityCommandOptions); + +static int savedVerbose; +static unsigned int savedRepeat; +static const char* savedName; +static const char* savedGroup; + +TEST_SETUP(UnityCommandOptions) +{ + savedVerbose = UnityFixture.Verbose; + savedRepeat = UnityFixture.RepeatCount; + savedName = UnityFixture.NameFilter; + savedGroup = UnityFixture.GroupFilter; +} + +TEST_TEAR_DOWN(UnityCommandOptions) +{ + UnityFixture.Verbose = savedVerbose; + UnityFixture.RepeatCount= savedRepeat; + UnityFixture.NameFilter = savedName; + UnityFixture.GroupFilter = savedGroup; +} + + +static const char* noOptions[] = { + "testrunner.exe" +}; + +TEST(UnityCommandOptions, DefaultOptions) +{ + UnityGetCommandLineOptions(1, noOptions); + TEST_ASSERT_EQUAL(0, UnityFixture.Verbose); + TEST_ASSERT_POINTERS_EQUAL(0, UnityFixture.GroupFilter); + TEST_ASSERT_POINTERS_EQUAL(0, UnityFixture.NameFilter); + TEST_ASSERT_EQUAL(1, UnityFixture.RepeatCount); +} + +static const char* verbose[] = { + "testrunner.exe", + "-v" +}; + +TEST(UnityCommandOptions, OptionVerbose) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(2, verbose)); + TEST_ASSERT_EQUAL(1, UnityFixture.Verbose); +} + +static const char* group[] = { + "testrunner.exe", + "-g", "groupname" +}; + +TEST(UnityCommandOptions, OptionSelectTestByGroup) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(3, group)); + STRCMP_EQUAL("groupname", UnityFixture.GroupFilter); +} + +static const char* name[] = { + "testrunner.exe", + "-n", "testname" +}; + +TEST(UnityCommandOptions, OptionSelectTestByName) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(3, name)); + STRCMP_EQUAL("testname", UnityFixture.NameFilter); +} + +static const char* repeat[] = { + "testrunner.exe", + "-r", "99" +}; + +TEST(UnityCommandOptions, OptionSelectRepeatTestsDefaultCount) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(2, repeat)); + TEST_ASSERT_EQUAL(2, UnityFixture.RepeatCount); +} + +TEST(UnityCommandOptions, OptionSelectRepeatTestsSpecificCount) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(3, repeat)); + TEST_ASSERT_EQUAL(99, UnityFixture.RepeatCount); +} + +static const char* multiple[] = { + "testrunner.exe", + "-v", + "-g", "groupname", + "-n", "testname", + "-r", "98" +}; + +TEST(UnityCommandOptions, MultipleOptions) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(8, multiple)); + TEST_ASSERT_EQUAL(1, UnityFixture.Verbose); + STRCMP_EQUAL("groupname", UnityFixture.GroupFilter); + STRCMP_EQUAL("testname", UnityFixture.NameFilter); + TEST_ASSERT_EQUAL(98, UnityFixture.RepeatCount); +} + +static const char* dashRNotLast[] = { + "testrunner.exe", + "-v", + "-g", "gggg", + "-r", + "-n", "tttt", +}; + +TEST(UnityCommandOptions, MultipleOptionsDashRNotLastAndNoValueSpecified) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(7, dashRNotLast)); + TEST_ASSERT_EQUAL(1, UnityFixture.Verbose); + STRCMP_EQUAL("gggg", UnityFixture.GroupFilter); + STRCMP_EQUAL("tttt", UnityFixture.NameFilter); + TEST_ASSERT_EQUAL(2, UnityFixture.RepeatCount); +} + +static const char* unknownCommand[] = { + "testrunner.exe", + "-v", + "-g", "groupname", + "-n", "testname", + "-r", "98", + "-z" +}; +TEST(UnityCommandOptions, UnknownCommandIsIgnored) +{ + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(9, unknownCommand)); + TEST_ASSERT_EQUAL(1, UnityFixture.Verbose); + STRCMP_EQUAL("groupname", UnityFixture.GroupFilter); + STRCMP_EQUAL("testname", UnityFixture.NameFilter); + TEST_ASSERT_EQUAL(98, UnityFixture.RepeatCount); +} + +TEST(UnityCommandOptions, GroupOrNameFilterWithoutStringFails) +{ + TEST_ASSERT_EQUAL(1, UnityGetCommandLineOptions(3, unknownCommand)); + TEST_ASSERT_EQUAL(1, UnityGetCommandLineOptions(5, unknownCommand)); + TEST_ASSERT_EQUAL(1, UnityMain(3, unknownCommand, NULL)); +} + +TEST(UnityCommandOptions, GroupFilterReallyFilters) +{ + _U_UINT saved = Unity.NumberOfTests; + TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(4, unknownCommand)); + UnityIgnoreTest(NULL, "non-matching", NULL); + TEST_ASSERT_EQUAL(saved, Unity.NumberOfTests); +} + +IGNORE_TEST(UnityCommandOptions, TestShouldBeIgnored) +{ + TEST_FAIL_MESSAGE("This test should not run!"); +} + +//------------------------------------------------------------ + +TEST_GROUP(LeakDetection); + +TEST_SETUP(LeakDetection) +{ +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC + UnityOutputCharSpy_Create(200); +#else + UnityOutputCharSpy_Create(1000); +#endif +} + +TEST_TEAR_DOWN(LeakDetection) +{ + UnityOutputCharSpy_Destroy(); +} + +#define EXPECT_ABORT_BEGIN \ + { \ + jmp_buf TestAbortFrame; \ + memcpy(TestAbortFrame, Unity.AbortFrame, sizeof(jmp_buf)); \ + if (TEST_PROTECT()) \ + { + +#define EXPECT_ABORT_END \ + } \ + memcpy(Unity.AbortFrame, TestAbortFrame, sizeof(jmp_buf)); \ + } + +// This tricky set of defines lets us see if we are using the Spy, returns 1 if true +#ifdef __STDC_VERSION__ + +#if __STDC_VERSION__ >= 199901L +#define USING_SPY_AS(a) EXPAND_AND_USE_2ND(ASSIGN_VALUE(a), 0) +#define ASSIGN_VALUE(a) VAL_##a +#define VAL_UnityOutputCharSpy_OutputChar 0, 1 +#define EXPAND_AND_USE_2ND(a, b) SECOND_PARAM(a, b, throwaway) +#define SECOND_PARAM(a, b, ...) b +#if USING_SPY_AS(UNITY_OUTPUT_CHAR) + #define USING_OUTPUT_SPY // UNITY_OUTPUT_CHAR = UnityOutputCharSpy_OutputChar +#endif +#endif // >= 199901 + +#else // __STDC_VERSION__ else +#define UnityOutputCharSpy_OutputChar 42 +#if UNITY_OUTPUT_CHAR == UnityOutputCharSpy_OutputChar // Works if no -Wundef -Werror + #define USING_OUTPUT_SPY +#endif +#undef UnityOutputCharSpy_OutputChar +#endif // __STDC_VERSION__ + +TEST(LeakDetection, DetectsLeak) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE_MESSAGE("Build with '-D UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar' to enable tests"); +#else + void* m = malloc(10); + TEST_ASSERT_NOT_NULL(m); + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + UnityMalloc_EndTest(); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "This test leaks!")); + free(m); +#endif +} + +TEST(LeakDetection, BufferOverrunFoundDuringFree) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else + void* m = malloc(10); + char* s = (char*)m; + TEST_ASSERT_NOT_NULL(m); + s[10] = (char)0xFF; + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + free(m); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during free()")); +#endif +} + +TEST(LeakDetection, BufferOverrunFoundDuringRealloc) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else + void* m = malloc(10); + char* s = (char*)m; + TEST_ASSERT_NOT_NULL(m); + s[10] = (char)0xFF; + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + m = realloc(m, 100); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during realloc()")); +#endif +} + +TEST(LeakDetection, BufferGuardWriteFoundDuringFree) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else + void* m = malloc(10); + char* s = (char*)m; + TEST_ASSERT_NOT_NULL(m); + s[-1] = (char)0x00; // Will not detect 0 + s[-2] = (char)0x01; + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + free(m); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during free()")); +#endif +} + +TEST(LeakDetection, BufferGuardWriteFoundDuringRealloc) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else + void* m = malloc(10); + char* s = (char*)m; + TEST_ASSERT_NOT_NULL(m); + s[-1] = (char)0x0A; + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + m = realloc(m, 100); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during realloc()")); +#endif +} + +TEST(LeakDetection, PointerSettingMax) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else + int i; + for (i = 0; i < 50; i++) UT_PTR_SET(pointer1, &int1); + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + UT_PTR_SET(pointer1, &int1); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "Too many pointers set")); +#endif +} + +//------------------------------------------------------------ + +TEST_GROUP(InternalMalloc); + +TEST_SETUP(InternalMalloc) { } +TEST_TEAR_DOWN(InternalMalloc) { } + +TEST(InternalMalloc, MallocPastBufferFails) +{ +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC + void* m = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1); + void* n = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2); + TEST_ASSERT_NOT_NULL(m); + TEST_ASSERT_NULL(n); + free(m); +#endif +} + +TEST(InternalMalloc, CallocPastBufferFails) +{ +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC + void* m = calloc(1, UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1); + void* n = calloc(1, UNITY_INTERNAL_HEAP_SIZE_BYTES/2); + TEST_ASSERT_NOT_NULL(m); + TEST_ASSERT_NULL(n); + free(m); +#endif +} + +TEST(InternalMalloc, MallocThenReallocGrowsMemoryInPlace) +{ +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC + void* m = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1); + void* n = realloc(m, UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 9); + TEST_ASSERT_NOT_NULL(m); + TEST_ASSERT_EQUAL(m, n); + free(n); +#endif +} + +TEST(InternalMalloc, ReallocFailDoesNotFreeMem) +{ +#ifdef UNITY_EXCLUDE_STDLIB_MALLOC + void* m = malloc(UNITY_INTERNAL_HEAP_SIZE_BYTES/2); + void* n1 = malloc(10); + void* out_of_mem = realloc(n1, UNITY_INTERNAL_HEAP_SIZE_BYTES/2 + 1); + void* n2 = malloc(10); + TEST_ASSERT_NOT_NULL(m); + TEST_ASSERT_NULL(out_of_mem); + TEST_ASSERT_NOT_EQUAL(n2, n1); + free(n2); + free(n1); + free(m); +#endif +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/test/unity_fixture_TestRunner.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,57 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#include "unity_fixture.h" + +TEST_GROUP_RUNNER(UnityFixture) +{ + RUN_TEST_CASE(UnityFixture, PointerSetting); + RUN_TEST_CASE(UnityFixture, ForceMallocFail); + RUN_TEST_CASE(UnityFixture, ReallocSmallerIsUnchanged); + RUN_TEST_CASE(UnityFixture, ReallocSameIsUnchanged); + RUN_TEST_CASE(UnityFixture, ReallocLargerNeeded); + RUN_TEST_CASE(UnityFixture, ReallocNullPointerIsLikeMalloc); + RUN_TEST_CASE(UnityFixture, ReallocSizeZeroFreesMemAndReturnsNullPointer); + RUN_TEST_CASE(UnityFixture, CallocFillsWithZero); + RUN_TEST_CASE(UnityFixture, PointerSet); + RUN_TEST_CASE(UnityFixture, FreeNULLSafety); + RUN_TEST_CASE(UnityFixture, ConcludeTestIncrementsFailCount); +} + +TEST_GROUP_RUNNER(UnityCommandOptions) +{ + RUN_TEST_CASE(UnityCommandOptions, DefaultOptions); + RUN_TEST_CASE(UnityCommandOptions, OptionVerbose); + RUN_TEST_CASE(UnityCommandOptions, OptionSelectTestByGroup); + RUN_TEST_CASE(UnityCommandOptions, OptionSelectTestByName); + RUN_TEST_CASE(UnityCommandOptions, OptionSelectRepeatTestsDefaultCount); + RUN_TEST_CASE(UnityCommandOptions, OptionSelectRepeatTestsSpecificCount); + RUN_TEST_CASE(UnityCommandOptions, MultipleOptions); + RUN_TEST_CASE(UnityCommandOptions, MultipleOptionsDashRNotLastAndNoValueSpecified); + RUN_TEST_CASE(UnityCommandOptions, UnknownCommandIsIgnored); + RUN_TEST_CASE(UnityCommandOptions, GroupOrNameFilterWithoutStringFails); + RUN_TEST_CASE(UnityCommandOptions, GroupFilterReallyFilters); + RUN_TEST_CASE(UnityCommandOptions, TestShouldBeIgnored); +} + +TEST_GROUP_RUNNER(LeakDetection) +{ + RUN_TEST_CASE(LeakDetection, DetectsLeak); + RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringFree); + RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringRealloc); + RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringFree); + RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringRealloc); + RUN_TEST_CASE(LeakDetection, PointerSettingMax); +} + +TEST_GROUP_RUNNER(InternalMalloc) +{ + RUN_TEST_CASE(InternalMalloc, MallocPastBufferFails); + RUN_TEST_CASE(InternalMalloc, CallocPastBufferFails); + RUN_TEST_CASE(InternalMalloc, MallocThenReallocGrowsMemoryInPlace); + RUN_TEST_CASE(InternalMalloc, ReallocFailDoesNotFreeMem); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/test/unity_output_Spy.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,57 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + + +#include "unity_output_Spy.h" +#include "unity_fixture.h" + +#include <stdio.h> +#include <string.h> + +static int size; +static int count; +static char* buffer; +static int spy_enable; + +void UnityOutputCharSpy_Create(int s) +{ + size = (s > 0) ? s : 0; + count = 0; + spy_enable = 0; + buffer = malloc((size_t)size); + TEST_ASSERT_NOT_NULL_MESSAGE(buffer, "Internal malloc failed in Spy Create():" __FILE__); + memset(buffer, 0, (size_t)size); +} + +void UnityOutputCharSpy_Destroy(void) +{ + size = 0; + free(buffer); +} + +void UnityOutputCharSpy_OutputChar(int c) +{ + if (spy_enable) + { + if (count < (size-1)) + buffer[count++] = (char)c; + } + else + { + putchar(c); + } +} + +const char * UnityOutputCharSpy_Get(void) +{ + return buffer; +} + +void UnityOutputCharSpy_Enable(int enable) +{ + spy_enable = enable; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/extras/fixture/test/unity_output_Spy.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,17 @@ +//- Copyright (c) 2010 James Grenning and Contributed to Unity Project +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef D_unity_output_Spy_H +#define D_unity_output_Spy_H + +void UnityOutputCharSpy_Create(int s); +void UnityOutputCharSpy_Destroy(void); +void UnityOutputCharSpy_OutputChar(int c); +const char * UnityOutputCharSpy_Get(void); +void UnityOutputCharSpy_Enable(int enable); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/release/build.info Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +119 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/release/version.info Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +2.3.2 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/src/unity.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,1320 @@ +/* ========================================================================= + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +============================================================================ */ + +#include "unity.h" +#include <stddef.h> + +/* If omitted from header, declare overrideable prototypes here so they're ready for use */ +#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION +void UNITY_OUTPUT_CHAR(int); +#endif + +/* Helpful macros for us to use here */ +#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } +#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } + +/* return prematurely if we are already in failure or ignore state */ +#define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } + +struct _Unity Unity; + +static const char UnityStrOk[] = "OK"; +static const char UnityStrPass[] = "PASS"; +static const char UnityStrFail[] = "FAIL"; +static const char UnityStrIgnore[] = "IGNORE"; +static const char UnityStrNull[] = "NULL"; +static const char UnityStrSpacer[] = ". "; +static const char UnityStrExpected[] = " Expected "; +static const char UnityStrWas[] = " Was "; +static const char UnityStrElement[] = " Element "; +static const char UnityStrByte[] = " Byte "; +static const char UnityStrMemory[] = " Memory Mismatch."; +static const char UnityStrDelta[] = " Values Not Within Delta "; +static const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; +static const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; +static const char UnityStrNullPointerForActual[] = " Actual pointer was NULL"; +static const char UnityStrNot[] = "Not "; +static const char UnityStrInf[] = "Infinity"; +static const char UnityStrNegInf[] = "Negative Infinity"; +static const char UnityStrNaN[] = "NaN"; +static const char UnityStrDet[] = "Determinate"; +static const char UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; +const char UnityStrErrFloat[] = "Unity Floating Point Disabled"; +const char UnityStrErrDouble[] = "Unity Double Precision Disabled"; +const char UnityStrErr64[] = "Unity 64-bit Support Disabled"; +static const char UnityStrBreaker[] = "-----------------------"; +static const char UnityStrResultsTests[] = " Tests "; +static const char UnityStrResultsFailures[] = " Failures "; +static const char UnityStrResultsIgnored[] = " Ignored "; +static const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; +static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; + +#ifdef UNITY_FLOAT_NEEDS_ZERO +/* Dividing by these constants produces +/- infinity. + * The rationale is given in UnityAssertFloatIsInf's body. */ +static const _UF f_zero = 0.0f; +#endif + +/* compiler-generic print formatting masks */ +static const _U_UINT UnitySizeMask[] = +{ + 255u, /* 0xFF */ + 65535u, /* 0xFFFF */ + 65535u, + 4294967295u, /* 0xFFFFFFFF */ + 4294967295u, + 4294967295u, + 4294967295u +#ifdef UNITY_SUPPORT_64 + ,0xFFFFFFFFFFFFFFFF +#endif +}; + +/*----------------------------------------------- + * Pretty Printers & Test Result Output Handlers + *-----------------------------------------------*/ + +void UnityPrint(const char* string) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch) + { + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UnityPrintNumberHex((_U_UINT)*pch, 2); + } + pch++; + } + } +} + +void UnityPrintLen(const char* string, const _UU32 length); +void UnityPrintLen(const char* string, const _UU32 length) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch && (_UU32)(pch - string) < length) + { + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UnityPrintNumberHex((_U_UINT)*pch, 2); + } + pch++; + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style) +{ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + UnityPrintNumber(number); + } + else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) + { + UnityPrintNumberUnsigned( (_U_UINT)number & UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1] ); + } + else + { + UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1)); + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumber(const _U_SINT number_to_print) +{ + _U_UINT number = (_U_UINT)number_to_print; + + if (number_to_print < 0) + { + /* A negative number, including MIN negative */ + UNITY_OUTPUT_CHAR('-'); + number = (_U_UINT)(-number_to_print); + } + UnityPrintNumberUnsigned(number); +} + +/*----------------------------------------------- + * basically do an itoa using as little ram as possible */ +void UnityPrintNumberUnsigned(const _U_UINT number) +{ + _U_UINT divisor = 1; + + /* figure out initial divisor */ + while (number / divisor > 9) + { + divisor *= 10; + } + + /* now mod and print, then divide divisor */ + do + { + UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); + divisor /= 10; + } + while (divisor > 0); +} + +/*-----------------------------------------------*/ +void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) +{ + _U_UINT nibble; + char nibbles = nibbles_to_print; + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + + while (nibbles > 0) + { + nibble = (number >> (--nibbles << 2)) & 0x0000000F; + if (nibble <= 9) + { + UNITY_OUTPUT_CHAR((char)('0' + nibble)); + } + else + { + UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintMask(const _U_UINT mask, const _U_UINT number) +{ + _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1); + _US32 i; + + for (i = 0; i < UNITY_INT_WIDTH; i++) + { + if (current_bit & mask) + { + if (current_bit & number) + { + UNITY_OUTPUT_CHAR('1'); + } + else + { + UNITY_OUTPUT_CHAR('0'); + } + } + else + { + UNITY_OUTPUT_CHAR('X'); + } + current_bit = current_bit >> 1; + } +} + +/*-----------------------------------------------*/ +#ifdef UNITY_FLOAT_VERBOSE +#include <stdio.h> + +#ifndef UNITY_VERBOSE_NUMBER_MAX_LENGTH +# ifdef UNITY_DOUBLE_VERBOSE +# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 317 +# else +# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 47 +# endif +#endif + +void UnityPrintFloat(_UF number) +{ + char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1]; + snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number); + UnityPrint(TempBuffer); +} +#endif + +/*-----------------------------------------------*/ + +void UnityPrintFail(void); +void UnityPrintFail(void) +{ + UnityPrint(UnityStrFail); +} + +void UnityPrintOk(void); +void UnityPrintOk(void) +{ + UnityPrint(UnityStrOk); +} + +/*-----------------------------------------------*/ +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line); +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) +{ +#ifndef UNITY_FIXTURES + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((_U_SINT)line); + UNITY_OUTPUT_CHAR(':'); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else + UNITY_UNUSED(file); + UNITY_UNUSED(line); +#endif +} + +/* SA_PATCH: Make failures more noticable. */ +static void UnityPrintVisibleFailure(void); +static void UnityPrintVisibleFailure(void) +{ + UNITY_OUTPUT_CHAR('\n'); + UnityPrint("===!!!===> "); + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_RESULT_START); + UnityPrint(UnityStrFail); + /* SA_PATCH: Output results using easy to parse tags. */ + UnityPrint(UNITY_RESULTS_TAGS_RESULT_END); + UnityPrint(" <===!!!==="); +} +/*-----------------------------------------------*/ +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line); +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) +{ +#ifndef UNITY_FIXTURES + UnityTestResultsBegin(Unity.TestFile, line); +#else + UNITY_UNUSED(line); +#endif + /* SA_PATCH: Make failures more noticable. */ + UnityPrintVisibleFailure(); + //UnityPrint(UnityStrFail); + UNITY_OUTPUT_CHAR(':'); +} + +/*-----------------------------------------------*/ +void UnityConcludeTest(void) +{ + if (Unity.CurrentTestIgnored) + { + Unity.TestIgnores++; + } + else if (!Unity.CurrentTestFailed) + { + UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); + UnityPrint(UnityStrPass); + } + else + { + Unity.TestFailures++; + } + + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); +} + +/*-----------------------------------------------*/ +static void UnityAddMsgIfSpecified(const char* msg); +static void UnityAddMsgIfSpecified(const char* msg) +{ + if (msg) + { + UnityPrint(UnityStrSpacer); +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + UnityPrint(msg); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual); +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(expected); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(actual); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const _UU32 length) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(expected, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(actual, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + + + +/*----------------------------------------------- + * Assertion & Control Helpers + *-----------------------------------------------*/ + +static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_LINE_TYPE lineNumber, const char* msg) +{ + /* return true if they are both NULL */ + if ((expected == NULL) && (actual == NULL)) + return 1; + + /* throw error if just expected is NULL */ + if (expected == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForExpected); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + /* throw error if just actual is NULL */ + if (actual == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForActual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + /* return false if neither is NULL */ + return 0; +} + +/*----------------------------------------------- + * Assertion Functions + *-----------------------------------------------*/ + +void UnityAssertBits(const _U_SINT mask, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_SKIP_EXECUTION; + + if ((mask & expected) != (mask & actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintMask((_U_UINT)mask, (_U_UINT)expected); + UnityPrint(UnityStrWas); + UnityPrintMask((_U_UINT)mask, (_U_UINT)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualNumber(const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + UNITY_SKIP_EXECUTION; + + if (expected != actual) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#define UnityPrintPointlessAndBail() \ +{ \ + UnityTestResultsFailBegin(lineNumber); \ + UnityPrint(UnityStrPointless); \ + UnityAddMsgIfSpecified(msg); \ + UNITY_FAIL_AND_BAIL; } + +/*-----------------------------------------------*/ +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + _UU32 elements = num_elements; + UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; + UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + /* If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case + * as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific + * variants do not. Therefore remove this flag. */ + switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO)) + { + case UNITY_DISPLAY_STYLE_HEX8: + case UNITY_DISPLAY_STYLE_INT8: + case UNITY_DISPLAY_STYLE_UINT8: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + } + break; + case UNITY_DISPLAY_STYLE_HEX16: + case UNITY_DISPLAY_STYLE_INT16: + case UNITY_DISPLAY_STYLE_UINT16: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 2); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 2); + } + break; +#ifdef UNITY_SUPPORT_64 + case UNITY_DISPLAY_STYLE_HEX64: + case UNITY_DISPLAY_STYLE_INT64: + case UNITY_DISPLAY_STYLE_UINT64: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 8); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 8); + } + break; +#endif + default: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 4); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 4); + } + break; + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT +void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, + UNITY_PTR_ATTRIBUTE const _UF* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual; + _UF diff, tol; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + diff = *ptr_expected - *ptr_actual; + if (diff < 0.0f) + diff = 0.0f - diff; + tol = UNITY_FLOAT_PRECISION * *ptr_expected; + if (tol < 0.0f) + tol = 0.0f - tol; + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (diff > tol)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat(*ptr_expected); + UnityPrint(UnityStrWas); + UnityPrintFloat(*ptr_actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_expected++; + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsWithin(const _UF delta, + const _UF expected, + const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UF diff = actual - expected; + _UF pos_delta = delta; + + UNITY_SKIP_EXECUTION; + + if (diff < 0.0f) + { + diff = 0.0f - diff; + } + if (pos_delta < 0.0f) + { + pos_delta = 0.0f - pos_delta; + } + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (pos_delta < diff)) + { + UnityTestResultsFailBegin(lineNumber); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat(expected); + UnityPrint(UnityStrWas); + UnityPrintFloat(actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatSpecial(const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; + _U_SINT should_be_trait = ((_U_SINT)style & 1); + _U_SINT is_trait = !should_be_trait; + _U_SINT trait_index = (_U_SINT)(style >> 1); + + UNITY_SKIP_EXECUTION; + + switch(style) + { + /* To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly + * We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise */ + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) & ispos(actual); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) & isneg(actual); + break; + + /* NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. */ + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual); + break; + + /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ + case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_NOT_DET: + if (isinf(actual) | isnan(actual)) + is_trait = 0; + else + is_trait = 1; + break; + + default: + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrintFloat(actual); +#else + if (should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_FLOAT */ + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_DOUBLE +void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, + UNITY_PTR_ATTRIBUTE const _UD* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual; + _UD diff, tol; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + diff = *ptr_expected - *ptr_actual; + if (diff < 0.0) + diff = 0.0 - diff; + tol = UNITY_DOUBLE_PRECISION * *ptr_expected; + if (tol < 0.0) + tol = 0.0 - tol; + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (diff > tol)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat((float)(*ptr_expected)); + UnityPrint(UnityStrWas); + UnityPrintFloat((float)(*ptr_actual)); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_expected++; + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesWithin(const _UD delta, + const _UD expected, + const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UD diff = actual - expected; + _UD pos_delta = delta; + + UNITY_SKIP_EXECUTION; + + if (diff < 0.0) + { + diff = 0.0 - diff; + } + if (pos_delta < 0.0) + { + pos_delta = 0.0 - pos_delta; + } + + /* This first part of this condition will catch any NaN or Infinite values */ + if (isnan(diff) || isinf(diff) || (pos_delta < diff)) + { + UnityTestResultsFailBegin(lineNumber); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat((float)expected); + UnityPrint(UnityStrWas); + UnityPrintFloat((float)actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ + +void UnityAssertDoubleSpecial(const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; + _U_SINT should_be_trait = ((_U_SINT)style & 1); + _U_SINT is_trait = !should_be_trait; + _U_SINT trait_index = (_U_SINT)(style >> 1); + + UNITY_SKIP_EXECUTION; + + switch(style) + { + /* To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly + * We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise */ + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) & ispos(actual); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) & isneg(actual); + break; + + /* NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. */ + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual); + break; + + /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ + case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_NOT_DET: + if (isinf(actual) | isnan(actual)) + is_trait = 0; + else + is_trait = 1; + break; + + default: + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrintFloat(actual); +#else + if (should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + + +#endif /* not UNITY_EXCLUDE_DOUBLE */ + +/*-----------------------------------------------*/ +void UnityAssertNumbersWithin( const _U_UINT delta, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + UNITY_SKIP_EXECUTION; + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual > expected) + Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); + else + Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); + } + else + { + if ((_U_UINT)actual > (_U_UINT)expected) + Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); + else + Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((_U_SINT)delta, style); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i; + + UNITY_SKIP_EXECUTION; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; expected[i] || actual[i]; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStrings(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const _UU32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i; + + UNITY_SKIP_EXECUTION; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; (expected[i] || actual[i]) && i < length; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStringsLen(expected, actual, length); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + + +/*-----------------------------------------------*/ +void UnityAssertEqualStringArray( const char** expected, + const char** actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i, j = 0; + + UNITY_SKIP_EXECUTION; + + /* if no elements, it's an error */ + if (num_elements == 0) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + do + { + /* if both pointers not null compare the strings */ + if (expected[j] && actual[j]) + { + for (i = 0; expected[j][i] || actual[j][i]; i++) + { + if (expected[j][i] != actual[j][i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected[j] != actual[j]) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(j); + } + UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + } while (++j < num_elements); +} + +/*-----------------------------------------------*/ +void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 length, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; + _UU32 elements = num_elements; + _UU32 bytes; + + UNITY_SKIP_EXECUTION; + + if ((elements == 0) || (length == 0)) + { + UnityPrintPointlessAndBail(); + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + /* /////////////////////////////////// */ + bytes = length; + while (bytes--) + { + if (*ptr_exp != *ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrMemory); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + } + UnityPrint(UnityStrByte); + UnityPrintNumberUnsigned(length - bytes - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + } + /* /////////////////////////////////// */ + + } +} + +/*----------------------------------------------- + * Control Functions + *-----------------------------------------------*/ + +void UnityFail(const char* msg, const UNITY_LINE_TYPE line) +{ + UNITY_SKIP_EXECUTION; + + UnityTestResultsBegin(Unity.TestFile, line); + /* SA_PATCH: Make failures more noticable. */ + UnityPrintVisibleFailure(); + //UnityPrintFail(); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + if (msg[0] != ' ') + { + UNITY_OUTPUT_CHAR(' '); + } + UnityPrint(msg); + } + + UNITY_FAIL_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) +{ + UNITY_SKIP_EXECUTION; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrIgnore); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_IGNORE_AND_BAIL; +} + +/*-----------------------------------------------*/ +#if defined(UNITY_WEAK_ATTRIBUTE) + UNITY_WEAK_ATTRIBUTE void setUp(void) { } + UNITY_WEAK_ATTRIBUTE void tearDown(void) { } +#elif defined(UNITY_WEAK_PRAGMA) +# pragma weak setUp + void setUp(void) { } +# pragma weak tearDown + void tearDown(void) { } +#endif +/*-----------------------------------------------*/ +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) +{ + Unity.CurrentTestName = FuncName; + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; + Unity.NumberOfTests++; + UNITY_CLR_DETAILS(); + if (TEST_PROTECT()) + { + setUp(); + Func(); + } + if (TEST_PROTECT() && !(Unity.CurrentTestIgnored)) + { + tearDown(); + } + UnityConcludeTest(); +} + +/*-----------------------------------------------*/ +void UnityBegin(const char* filename) +{ + Unity.TestFile = filename; + Unity.CurrentTestName = NULL; + Unity.CurrentTestLineNumber = 0; + Unity.NumberOfTests = 0; + Unity.TestFailures = 0; + Unity.TestIgnores = 0; + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + + UNITY_CLR_DETAILS(); + UNITY_OUTPUT_START(); +} + +/*-----------------------------------------------*/ +int UnityEnd(void) +{ + UNITY_PRINT_EOL(); + UnityPrint(UnityStrBreaker); + UNITY_PRINT_EOL(); + UnityPrintNumber((_U_SINT)(Unity.NumberOfTests)); + UnityPrint(UnityStrResultsTests); + UnityPrintNumber((_U_SINT)(Unity.TestFailures)); + UnityPrint(UnityStrResultsFailures); + UnityPrintNumber((_U_SINT)(Unity.TestIgnores)); + UnityPrint(UnityStrResultsIgnored); + UNITY_PRINT_EOL(); + if (Unity.TestFailures == 0U) + { + UnityPrintOk(); + } + else + { + UnityPrintFail(); +#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL + UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); +#endif + } + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); + UNITY_OUTPUT_COMPLETE(); + return (int)(Unity.TestFailures); +} + +/*-----------------------------------------------*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/src/unity.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,291 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_FRAMEWORK_H +#define UNITY_FRAMEWORK_H +#define UNITY + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "unity_internals.h" + +void setUp(void); +void tearDown(void); + +/*------------------------------------------------------- + * Configuration Options + *------------------------------------------------------- + * All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above. + + * Integers/longs/pointers + * - Unity attempts to automatically discover your integer sizes + * - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in <stdint.h> + * - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in <limits.h> + * - define UNITY_EXCLUDE_SIZEOF to stop attempting to use sizeof in macros + * - If you cannot use the automatic methods above, you can force Unity by using these options: + * - define UNITY_SUPPORT_64 + * - define UNITY_INT_WIDTH + * - UNITY_LONG_WIDTH + * - UNITY_POINTER_WIDTH + + * Floats + * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons + * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT + * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats + * - define UNITY_FLOAT_VERBOSE to print floating point values in errors (uses sprintf) + * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons + * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) + * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE + * - define UNITY_DOUBLE_TYPE to specify something other than double + * - define UNITY_DOUBLE_VERBOSE to print floating point values in errors (uses sprintf) + * - define UNITY_VERBOSE_NUMBER_MAX_LENGTH to change maximum length of printed numbers (used by sprintf) + + * Output + * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired + * - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure + + * Optimization + * - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge + * - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests. + + * Test Cases + * - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script + + * Parameterized Tests + * - you'll want to create a define of TEST_CASE(...) which basically evaluates to nothing + + *------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message)) +#define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL) +#define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message)) +#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL) +#define TEST_ONLY() + +/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. + * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ +#define TEST_PASS() longjmp(Unity.AbortFrame, 1) + +/*------------------------------------------------------- + * Test Asserts (simple) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE") +#define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE") +#define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE") +#define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE") +#define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL") +#define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL") + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, NULL) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL) + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/*------------------------------------------------------- + * Test Asserts (with additional messages) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message)) + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, (message)) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message)) + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message)) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* end of UNITY_FRAMEWORK_H */ +#ifdef __cplusplus +} +#endif +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/src/unity_internals.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,795 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_INTERNALS_H +#define UNITY_INTERNALS_H + +#ifdef UNITY_INCLUDE_CONFIG_H +//#include "unity_config.h" +#endif + +#include <setjmp.h> + +/* Unity Attempts to Auto-Detect Integer Types + * Attempt 1: UINT_MAX, ULONG_MAX, etc in <stdint.h> + * Attempt 2: UINT_MAX, ULONG_MAX, etc in <limits.h> + * Attempt 3: Deduced from sizeof() macros */ +#ifndef UNITY_EXCLUDE_STDINT_H +#include <stdint.h> +#endif + +#ifndef UNITY_EXCLUDE_LIMITS_H +#include <limits.h> +#endif + +#ifndef UNITY_EXCLUDE_SIZEOF +#ifndef UINT_MAX +#define UINT_MAX (sizeof(unsigned int) * 256 - 1) +#endif +#ifndef ULONG_MAX +#define ULONG_MAX (sizeof(unsigned long) * 256 - 1) +#endif +#ifndef UINTPTR_MAX +/* apparently this is not a constant expression: (sizeof(unsigned int *) * 256 - 1) so we have to just let this fall through */ +#endif +#endif + +#ifndef UNITY_EXCLUDE_MATH_H +#include <math.h> +#endif + +/*------------------------------------------------------- + * Guess Widths If Not Specified + *-------------------------------------------------------*/ + +/* Determine the size of an int, if not already specificied. + * We cannot use sizeof(int), because it is not yet defined + * at this stage in the trnslation of the C program. + * Therefore, infer it from UINT_MAX if possible. */ +#ifndef UNITY_INT_WIDTH + #ifdef UINT_MAX + #if (UINT_MAX == 0xFFFF) + #define UNITY_INT_WIDTH (16) + #elif (UINT_MAX == 0xFFFFFFFF) + #define UNITY_INT_WIDTH (32) + #elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_INT_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_INT_WIDTH + #define UNITY_INT_WIDTH (32) +#endif + +/* Determine the size of a long, if not already specified, + * by following the process used above to define + * UNITY_INT_WIDTH. */ +#ifndef UNITY_LONG_WIDTH + #ifdef ULONG_MAX + #if (ULONG_MAX == 0xFFFF) + #define UNITY_LONG_WIDTH (16) + #elif (ULONG_MAX == 0xFFFFFFFF) + #define UNITY_LONG_WIDTH (32) + #elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_LONG_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_LONG_WIDTH + #define UNITY_LONG_WIDTH (32) +#endif + +/* Determine the size of a pointer, if not already specified, + * by following the process used above to define + * UNITY_INT_WIDTH. */ +#ifndef UNITY_POINTER_WIDTH + #ifdef UINTPTR_MAX + #if (UINTPTR_MAX+0 <= 0xFFFF) + #define UNITY_POINTER_WIDTH (16) + #elif (UINTPTR_MAX+0 <= 0xFFFFFFFF) + #define UNITY_POINTER_WIDTH (32) + #elif (UINTPTR_MAX+0 <= 0xFFFFFFFFFFFFFFFF) + #define UNITY_POINTER_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_POINTER_WIDTH + #ifdef INTPTR_MAX + #if (INTPTR_MAX+0 <= 0x7FFF) + #define UNITY_POINTER_WIDTH (16) + #elif (INTPTR_MAX+0 <= 0x7FFFFFFF) + #define UNITY_POINTER_WIDTH (32) + #elif (INTPTR_MAX+0 <= 0x7FFFFFFFFFFFFFFF) + #define UNITY_POINTER_WIDTH (64) + #endif + #endif +#endif +#ifndef UNITY_POINTER_WIDTH + #define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH +#endif + +/*------------------------------------------------------- + * Int Support (Define types based on detected sizes) + *-------------------------------------------------------*/ + +#if (UNITY_INT_WIDTH == 32) + typedef unsigned char _UU8; + typedef unsigned short _UU16; + typedef unsigned int _UU32; + typedef signed char _US8; + typedef signed short _US16; + typedef signed int _US32; +#elif (UNITY_INT_WIDTH == 16) + typedef unsigned char _UU8; + typedef unsigned int _UU16; + typedef unsigned long _UU32; + typedef signed char _US8; + typedef signed int _US16; + typedef signed long _US32; +#else + #error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported) +#endif + +/*------------------------------------------------------- + * 64-bit Support + *-------------------------------------------------------*/ + +#ifndef UNITY_SUPPORT_64 +#if UNITY_LONG_WIDTH > 32 +#define UNITY_SUPPORT_64 +#endif +#endif +#ifndef UNITY_SUPPORT_64 +#if UNITY_POINTER_WIDTH > 32 +#define UNITY_SUPPORT_64 +#endif +#endif + +#ifndef UNITY_SUPPORT_64 + +/* No 64-bit Support */ +typedef _UU32 _U_UINT; +typedef _US32 _U_SINT; + +#else + +/* 64-bit Support */ +#if (UNITY_LONG_WIDTH == 32) + typedef unsigned long long _UU64; + typedef signed long long _US64; +#elif (UNITY_LONG_WIDTH == 64) + typedef unsigned long _UU64; + typedef signed long _US64; +#else + #error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported) +#endif +typedef _UU64 _U_UINT; +typedef _US64 _U_SINT; + +#endif + +/*------------------------------------------------------- + * Pointer Support + *-------------------------------------------------------*/ + +#if (UNITY_POINTER_WIDTH == 32) + typedef _UU32 _UP; +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 +#elif (UNITY_POINTER_WIDTH == 64) + typedef _UU64 _UP; +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 +#elif (UNITY_POINTER_WIDTH == 16) + typedef _UU16 _UP; +#define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 +#else + #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) +#endif + +#ifndef UNITY_PTR_ATTRIBUTE +#define UNITY_PTR_ATTRIBUTE +#endif + +#ifndef UNITY_INTERNAL_PTR +#define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void* +/* #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const _UU8* */ +#endif + +/*------------------------------------------------------- + * Float Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_FLOAT + +/* No Floating Point Support */ +#undef UNITY_INCLUDE_FLOAT +#undef UNITY_FLOAT_PRECISION +#undef UNITY_FLOAT_TYPE +#undef UNITY_FLOAT_VERBOSE + +#else + +#ifndef UNITY_INCLUDE_FLOAT +#define UNITY_INCLUDE_FLOAT +#endif + +/* Floating Point Support */ +#ifndef UNITY_FLOAT_PRECISION +#define UNITY_FLOAT_PRECISION (0.00001f) +#endif +#ifndef UNITY_FLOAT_TYPE +#define UNITY_FLOAT_TYPE float +#endif +typedef UNITY_FLOAT_TYPE _UF; + +#ifndef isinf +#define isinf(n) (((1.0f / f_zero) == n) ? 1 : 0) || (((-1.0f / f_zero) == n) ? 1 : 0) +#define UNITY_FLOAT_NEEDS_ZERO +#endif + +#ifndef isnan +#define isnan(n) ((n != n) ? 1 : 0) +#endif + +#ifndef isneg +#define isneg(n) ((n < 0.0f) ? 1 : 0) +#endif + +#ifndef ispos +#define ispos(n) ((n > 0.0f) ? 1 : 0) +#endif + +#endif + +/*------------------------------------------------------- + * Double Float Support + *-------------------------------------------------------*/ + +/* unlike FLOAT, we DON'T include by default */ +#ifndef UNITY_EXCLUDE_DOUBLE +#ifndef UNITY_INCLUDE_DOUBLE +#define UNITY_EXCLUDE_DOUBLE +#endif +#endif + +#ifdef UNITY_EXCLUDE_DOUBLE + +/* No Floating Point Support */ +#undef UNITY_DOUBLE_PRECISION +#undef UNITY_DOUBLE_TYPE +#undef UNITY_DOUBLE_VERBOSE + +#ifdef UNITY_INCLUDE_DOUBLE +#undef UNITY_INCLUDE_DOUBLE +#endif + +#else + +/* Double Floating Point Support */ +#ifndef UNITY_DOUBLE_PRECISION +#define UNITY_DOUBLE_PRECISION (1e-12f) +#endif +#ifndef UNITY_DOUBLE_TYPE +#define UNITY_DOUBLE_TYPE double +#endif +typedef UNITY_DOUBLE_TYPE _UD; + +#endif + +#ifdef UNITY_DOUBLE_VERBOSE +#ifndef UNITY_FLOAT_VERBOSE +#define UNITY_FLOAT_VERBOSE +#endif +#endif + +/*------------------------------------------------------- + * Output Method: stdout (DEFAULT) + *-------------------------------------------------------*/ +#ifndef UNITY_OUTPUT_CHAR +/* Default to using putchar, which is defined in stdio.h */ +#include <stdio.h> +#define UNITY_OUTPUT_CHAR(a) (void)putchar(a) +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifndef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION +extern void UNITY_OUTPUT_CHAR(int); + #endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH +/* Default to using fflush, which is defined in stdio.h */ +#include <stdio.h> +#define UNITY_OUTPUT_FLUSH (void)fflush(stdout) +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION +extern void UNITY_OUTPUT_FLUSH(void); + #endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH +#define UNITY_FLUSH_CALL() +#else +#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH +#endif + +#ifndef UNITY_PRINT_EOL +#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n') +#endif + +#ifndef UNITY_OUTPUT_START +#define UNITY_OUTPUT_START() +#endif + +#ifndef UNITY_OUTPUT_COMPLETE +#define UNITY_OUTPUT_COMPLETE() +#endif + +/*------------------------------------------------------- + * Footprint + *-------------------------------------------------------*/ + +#ifndef UNITY_LINE_TYPE +#define UNITY_LINE_TYPE _U_UINT +#endif + +#ifndef UNITY_COUNTER_TYPE +#define UNITY_COUNTER_TYPE _U_UINT +#endif + +/*------------------------------------------------------- + * Language Features Available + *-------------------------------------------------------*/ +#if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA) +# ifdef __GNUC__ /* includes clang */ +# if !(defined(__WIN32__) && defined(__clang__)) +# define UNITY_WEAK_ATTRIBUTE __attribute__((weak)) +# endif +# endif +#endif + +#ifdef UNITY_NO_WEAK +# undef UNITY_WEAK_ATTRIBUTE +# undef UNITY_WEAK_PRAGMA +#endif + + +/*------------------------------------------------------- + * Internal Structs Needed + *-------------------------------------------------------*/ + +typedef void (*UnityTestFunction)(void); + +#define UNITY_DISPLAY_RANGE_INT (0x10) +#define UNITY_DISPLAY_RANGE_UINT (0x20) +#define UNITY_DISPLAY_RANGE_HEX (0x40) +#define UNITY_DISPLAY_RANGE_AUTO (0x80) + +typedef enum +{ +#if (UNITY_INT_WIDTH == 16) + UNITY_DISPLAY_STYLE_INT = 2 + UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 32) + UNITY_DISPLAY_STYLE_INT = 4 + UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 64) + UNITY_DISPLAY_STYLE_INT = 8 + UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO, +#endif + UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT, +#endif + +#if (UNITY_INT_WIDTH == 16) + UNITY_DISPLAY_STYLE_UINT = 2 + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 32) + UNITY_DISPLAY_STYLE_UINT = 4 + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO, +#elif (UNITY_INT_WIDTH == 64) + UNITY_DISPLAY_STYLE_UINT = 8 + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO, +#endif + UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT, +#endif + UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX, +#endif + UNITY_DISPLAY_STYLE_UNKNOWN +} UNITY_DISPLAY_STYLE_T; + +#ifndef UNITY_EXCLUDE_FLOAT +typedef enum _UNITY_FLOAT_TRAIT_T +{ + UNITY_FLOAT_IS_NOT_INF = 0, + UNITY_FLOAT_IS_INF, + UNITY_FLOAT_IS_NOT_NEG_INF, + UNITY_FLOAT_IS_NEG_INF, + UNITY_FLOAT_IS_NOT_NAN, + UNITY_FLOAT_IS_NAN, + UNITY_FLOAT_IS_NOT_DET, + UNITY_FLOAT_IS_DET, + UNITY_FLOAT_INVALID_TRAIT +} UNITY_FLOAT_TRAIT_T; +#endif + +struct _Unity +{ + const char* TestFile; + const char* CurrentTestName; +#ifndef UNITY_EXCLUDE_DETAILS + const char* CurrentDetail1; + const char* CurrentDetail2; +#endif + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; + jmp_buf AbortFrame; +}; + +extern struct _Unity Unity; + +/*------------------------------------------------------- + * Test Suite Management + *-------------------------------------------------------*/ + +void UnityBegin(const char* filename); +int UnityEnd(void); +void UnityConcludeTest(void); +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum); + +/*------------------------------------------------------- + * Details Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_DETAILS +#define UNITY_CLR_DETAILS() +#define UNITY_SET_DETAIL(d1) +#define UNITY_SET_DETAILS(d1,d2) +#else +#define UNITY_CLR_DETAILS() { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } +#define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = 0; } +#define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = d2; } + +#ifndef UNITY_DETAIL1_NAME +#define UNITY_DETAIL1_NAME "Function" +#endif + +#ifndef UNITY_DETAIL2_NAME +#define UNITY_DETAIL2_NAME "Argument" +#endif +#endif + +/*------------------------------------------------------- + * Test Output + *-------------------------------------------------------*/ + +void UnityPrint(const char* string); +void UnityPrintMask(const _U_UINT mask, const _U_UINT number); +void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style); +void UnityPrintNumber(const _U_SINT number); +void UnityPrintNumberUnsigned(const _U_UINT number); +void UnityPrintNumberHex(const _U_UINT number, const char nibbles); + +#ifdef UNITY_FLOAT_VERBOSE +void UnityPrintFloat(const _UF number); +#endif + +/*------------------------------------------------------- + * Test Assertion Fuctions + *------------------------------------------------------- + * Use the macros below this section instead of calling + * these directly. The macros have a consistent naming + * convention and will pull in file and line information + * for you. */ + +void UnityAssertEqualNumber(const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertBits(const _U_SINT mask, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const _UU32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringArray( const char** expected, + const char** actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 length, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertNumbersWithin(const _U_UINT delta, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityFail(const char* message, const UNITY_LINE_TYPE line); + +void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); + +#ifndef UNITY_EXCLUDE_FLOAT +void UnityAssertFloatsWithin(const _UF delta, + const _UF expected, + const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, + UNITY_PTR_ATTRIBUTE const _UF* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertFloatSpecial(const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +void UnityAssertDoublesWithin(const _UD delta, + const _UD expected, + const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, + UNITY_PTR_ATTRIBUTE const _UD* actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertDoubleSpecial(const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +/*------------------------------------------------------- + * Error Strings We Might Need + *-------------------------------------------------------*/ + +extern const char UnityStrErrFloat[]; +extern const char UnityStrErrDouble[]; +extern const char UnityStrErr64[]; + +/*------------------------------------------------------- + * Test Running Macros + *-------------------------------------------------------*/ + +#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) + +#define TEST_ABORT() {longjmp(Unity.AbortFrame, 1);} + +/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ +#ifndef RUN_TEST +#ifdef __STDC_VERSION__ +#if __STDC_VERSION__ >= 199901L +#define RUN_TEST(...) UnityDefaultTestRun(RUN_TEST_FIRST(__VA_ARGS__), RUN_TEST_SECOND(__VA_ARGS__)) +#define RUN_TEST_FIRST(...) RUN_TEST_FIRST_HELPER(__VA_ARGS__, throwaway) +#define RUN_TEST_FIRST_HELPER(first, ...) (first), #first +#define RUN_TEST_SECOND(...) RUN_TEST_SECOND_HELPER(__VA_ARGS__, __LINE__, throwaway) +#define RUN_TEST_SECOND_HELPER(first, second, ...) (second) +#endif +#endif +#endif + +/* If we can't do the tricky version, we'll just have to require them to always include the line number */ +#ifndef RUN_TEST +#ifdef CMOCK +#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num) +#else +#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__) +#endif +#endif + +#define TEST_LINE_NUM (Unity.CurrentTestLineNumber) +#define TEST_IS_IGNORED (Unity.CurrentTestIgnored) +#define UNITY_NEW_TEST(a) \ + Unity.CurrentTestName = (a); \ + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \ + Unity.NumberOfTests++; + +#ifndef UNITY_BEGIN +#define UNITY_BEGIN() UnityBegin(__FILE__) +#endif + +#ifndef UNITY_END +#define UNITY_END() UnityEnd() +#endif + +#define UNITY_UNUSED(x) (void)(sizeof(x)) + +/*------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define UNITY_TEST_FAIL(line, message) UnityFail( (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_IGNORE(line, message) UnityIgnore( (message), (UNITY_LINE_TYPE)(line)) + +/*------------------------------------------------------- + * Test Asserts + *-------------------------------------------------------*/ + +#define UNITY_TEST_ASSERT(condition, line, message) if (condition) {} else {UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message));} +#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message)) + +#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU8 )(expected), (_U_SINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU16)(expected), (_U_SINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU32)(expected), (_U_SINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((_U_SINT)(mask), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line)) + +#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) + +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UP)(expected), (_U_SINT)(_UP)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (_UU32)(len), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), 1, (message), (UNITY_LINE_TYPE)(line)) + +#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(_UP*)(expected), (UNITY_INTERNAL_PTR)(_UP*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) + +#ifdef UNITY_SUPPORT_64 +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#else +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#endif + +#ifdef UNITY_EXCLUDE_FLOAT +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#else +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((_UF)(delta), (_UF)(expected), (_UF)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((_UF)(expected) * (_UF)UNITY_FLOAT_PRECISION, (_UF)(expected), (_UF)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((_UF*)(expected), (_UF*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +#ifdef UNITY_EXCLUDE_DOUBLE +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#else +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((_UD)(delta), (_UD)(expected), (_UD)(actual), (message), (UNITY_LINE_TYPE)line) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((_UD)(expected) * (_UD)UNITY_DOUBLE_PRECISION, (_UD)expected, (_UD)actual, (UNITY_LINE_TYPE)(line), message) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((_UD*)(expected), (_UD*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)line) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +/* + * SA_PATCH: Output results using easy to parse tags. + * These tags are used when sending out verbose Unity output ("-v"). + * They wrap each of the important data pieces, and allow parsing of the results by an + * external tool. + * The tags are always printed - this isn't configurable. + */ + +#define UNITY_RESULTS_TAGS_TEST_START "<***UnityTest***>" +#define UNITY_RESULTS_TAGS_TEST_END "</***UnityTest***>" + +#define UNITY_RESULTS_TAGS_RESULT_START "<***UnityResult***>" +#define UNITY_RESULTS_TAGS_RESULT_END "</***UnityResult***>" + +#define UNITY_RESULTS_TAGS_IGNORE_START "<***UnityIgnoredTest***>" +#define UNITY_RESULTS_TAGS_IGNORE_END "</***UnityIgnoredTest***>" + +/* End of UNITY_INTERNALS_H */ +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_cmd.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,61 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_def.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,57 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_head1.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,55 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "testsample_head1.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_head1.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,15 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ +#ifndef _TESTSAMPLE_HEAD1_H +#define _TESTSAMPLE_HEAD1_H + +#include "unity.h" +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +void test_TheFirstThingToTest(void); +void test_TheSecondThingToTest(void); +void test_TheThirdThingToTest(void); +void test_TheFourthThingToTest(void); +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_cmd.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,80 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_def.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,76 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_head1.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,75 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "testsample_mock_head1.h" +#include "Mockstanky.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_head1.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,13 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ +#ifndef _TESTSAMPLE_MOCK_HEAD1_H +#define _TESTSAMPLE_MOCK_HEAD1_H + +#include "unity.h" +#include "cmock.h" +#include "funky.h" +#include <setjmp.h> + +void test_TheFirstThingToTest(void); +void test_TheSecondThingToTest(void); +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_new1.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "one.h" +#include "two.h" +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +int GlobalExpectCount; +int GlobalVerifyOrder; +char* GlobalOrderError; + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + GlobalExpectCount = 0; + GlobalVerifyOrder = 0; + GlobalOrderError = NULL; + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_new2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Suite Setup=====*/ +static int suite_setup(void) +{ +a_custom_setup(); +} + +/*=======Suite Teardown=====*/ +static int suite_teardown(int num_failures) +{ +a_custom_teardown(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + suite_setup(); + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return suite_teardown(UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_param.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,77 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST_NO_ARGS +#define RUN_TEST(TestFunc, TestLineNum, ...) \ +{ \ + Unity.CurrentTestName = #TestFunc "(" #__VA_ARGS__ ")"; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(__VA_ARGS__); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21, RUN_TEST_NO_ARGS); + RUN_TEST(test_TheSecondThingToTest, 43, RUN_TEST_NO_ARGS); + + CMock_Guts_MemFreeFinal(); + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_run1.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "one.h" +#include "two.h" +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +int GlobalExpectCount; +int GlobalVerifyOrder; +char* GlobalOrderError; + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + GlobalExpectCount = 0; + GlobalVerifyOrder = 0; + GlobalOrderError = NULL; + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_run2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Suite Setup=====*/ +static int suite_setup(void) +{ +a_custom_setup(); +} + +/*=======Suite Teardown=====*/ +static int suite_teardown(int num_failures) +{ +a_custom_teardown(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + suite_setup(); + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return suite_teardown(UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_mock_yaml.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,90 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + CMock_Init(); \ + UNITY_CLR_DETAILS(); \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + CMock_Verify(); \ + } \ + CMock_Destroy(); \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include "cmock.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "two.h" +#include "three.h" +#include <four.h> +#include "funky.h" +#include <setjmp.h> +#include "Mockstanky.h" + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); + + +/*=======Mock Management=====*/ +static void CMock_Init(void) +{ + Mockstanky_Init(); +} +static void CMock_Verify(void) +{ + Mockstanky_Verify(); +} +static void CMock_Destroy(void) +{ + Mockstanky_Destroy(); +} + +/*=======Suite Setup=====*/ +static int suite_setup(void) +{ +a_yaml_setup(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + CMock_Verify(); + CMock_Destroy(); + tearDown(); + CMock_Init(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + suite_setup(); + UnityBegin("testdata/mocksample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + + CMock_Guts_MemFreeFinal(); + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_new1.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "one.h" +#include "two.h" +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +int GlobalExpectCount; +int GlobalVerifyOrder; +char* GlobalOrderError; + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_new2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Suite Setup=====*/ +static int suite_setup(void) +{ +a_custom_setup(); +} + +/*=======Suite Teardown=====*/ +static int suite_teardown(int num_failures) +{ +a_custom_teardown(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + suite_setup(); + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return suite_teardown(UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_param.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,58 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST_NO_ARGS +#define RUN_TEST(TestFunc, TestLineNum, ...) \ +{ \ + Unity.CurrentTestName = #TestFunc "(" #__VA_ARGS__ ")"; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(__VA_ARGS__); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21, RUN_TEST_NO_ARGS); + RUN_TEST(test_TheSecondThingToTest, 43, RUN_TEST_NO_ARGS); + RUN_TEST(test_TheThirdThingToTest, 53, RUN_TEST_NO_ARGS); + RUN_TEST(test_TheFourthThingToTest, 58, RUN_TEST_NO_ARGS); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_run1.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,67 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "one.h" +#include "two.h" +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +int GlobalExpectCount; +int GlobalVerifyOrder; +char* GlobalOrderError; + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_run2.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,70 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Suite Setup=====*/ +static int suite_setup(void) +{ +a_custom_setup(); +} + +/*=======Suite Teardown=====*/ +static int suite_teardown(int num_failures) +{ +a_custom_teardown(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + suite_setup(); + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return suite_teardown(UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/expectdata/testsample_yaml.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,71 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +/*=======Test Runner Used To Run Each Test Below=====*/ +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + CEXCEPTION_T e; \ + Try { \ + setUp(); \ + TestFunc(); \ + } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +/*=======Automagically Detected Files To Include=====*/ +#include "unity.h" +#include <setjmp.h> +#include <stdio.h> +#include "CException.h" +#include "two.h" +#include "three.h" +#include <four.h> +#include "funky.h" +#include "stanky.h" +#include <setjmp.h> + +/*=======External Functions This Runner Calls=====*/ +extern void setUp(void); +extern void tearDown(void); +extern void test_TheFirstThingToTest(void); +extern void test_TheSecondThingToTest(void); +extern void test_TheThirdThingToTest(void); +extern void test_TheFourthThingToTest(void); + + +/*=======Suite Setup=====*/ +static int suite_setup(void) +{ +a_yaml_setup(); +} + +/*=======Test Reset Option=====*/ +void resetTest(void); +void resetTest(void) +{ + tearDown(); + setUp(); +} + + +/*=======MAIN=====*/ +int main(void) +{ + suite_setup(); + UnityBegin("testdata/testsample.c"); + RUN_TEST(test_TheFirstThingToTest, 21); + RUN_TEST(test_TheSecondThingToTest, 43); + RUN_TEST(test_TheThirdThingToTest, 53); + RUN_TEST(test_TheFourthThingToTest, 58); + + return (UnityEnd()); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/rakefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,60 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +UNITY_ROOT = File.expand_path(File.dirname(__FILE__)) + '/' + +require 'rake' +require 'rake/clean' +require UNITY_ROOT + 'rakefile_helper' + +TEMP_DIRS = [ + File.join(UNITY_ROOT, 'build') +] + +TEMP_DIRS.each do |dir| + directory(dir) + CLOBBER.include(dir) +end + +task :prepare_for_tests => TEMP_DIRS + +include RakefileHelpers + +# Load proper GCC as defult configuration +DEFAULT_CONFIG_FILE = 'gcc_auto_stdint.yml' +configure_toolchain(DEFAULT_CONFIG_FILE) + +desc "Test unity with its own unit tests" +task :unit => [:prepare_for_tests] do + run_tests get_unit_test_files +end + +desc "Test unity's helper scripts" +task :scripts => [:prepare_for_tests] do + Dir['tests/test_*.rb'].each do |scriptfile| + require "./"+scriptfile + end +end + +desc "Generate test summary" +task :summary do + report_summary +end + +desc "Build and test Unity" +task :all => [:clean, :prepare_for_tests, :scripts, :unit, :summary] +task :default => [:clobber, :all] +task :ci => [:no_color, :default] +task :cruise => [:no_color, :default] + +desc "Load configuration" +task :config, :config_file do |t, args| + configure_toolchain(args[:config_file]) +end + +task :no_color do + $colour_output = false +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/rakefile_helper.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,255 @@ +# ========================================== +# Unity Project - A Test Framework for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +require 'yaml' +require 'fileutils' +require UNITY_ROOT + '../auto/unity_test_summary' +require UNITY_ROOT + '../auto/generate_test_runner' +require UNITY_ROOT + '../auto/colour_reporter' + +module RakefileHelpers + + C_EXTENSION = '.c' + + def load_configuration(config_file) + unless ($configured) + $cfg_file = "targets/#{config_file}" unless (config_file =~ /[\\|\/]/) + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if (config_file != DEFAULT_CONFIG_FILE) + end + end + + def configure_clean + CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? + end + + def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + config_file += '.yml' unless config_file =~ /\.yml$/ + config_file = config_file unless config_file =~ /[\\|\/]/ + load_configuration(config_file) + configure_clean + end + + def get_unit_test_files + path = $cfg['compiler']['unit_tests_path'] + 'test*' + C_EXTENSION + path.gsub!(/\\/, '/') + FileList.new(path) + end + + def get_local_include_dirs + include_dirs = $cfg['compiler']['includes']['items'].dup + include_dirs.delete_if {|dir| dir.is_a?(Array)} + return include_dirs + end + + def extract_headers(filename) + includes = [] + lines = File.readlines(filename) + lines.each do |line| + m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) + if not m.nil? + includes << m[1] + end + end + return includes + end + + def find_source_file(header, paths) + paths.each do |dir| + src_file = dir + header.ext(C_EXTENSION) + if (File.exists?(src_file)) + return src_file + end + end + return nil + end + + def tackit(strings) + if strings.is_a?(Array) + result = "\"#{strings.join}\"" + else + result = strings + end + return result + end + + def squash(prefix, items) + result = '' + items.each { |item| result += " #{prefix}#{tackit(item)}" } + return result + end + + def should(behave, &block) + if block + puts "Should " + behave + yield block + else + puts "UNIMPLEMENTED CASE: Should #{behave}" + end + end + + def build_compiler_fields + command = tackit($cfg['compiler']['path']) + if $cfg['compiler']['defines']['items'].nil? + defines = '' + else + defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy']) + end + options = squash('', $cfg['compiler']['options']) + includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) + includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + return {:command => command, :defines => defines, :options => options, :includes => includes} + end + + def compile(file, defines=[]) + compiler = build_compiler_fields + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + + "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" + obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + execute(cmd_str + obj_file) + return obj_file + end + + def build_linker_fields + command = tackit($cfg['linker']['path']) + if $cfg['linker']['options'].nil? + options = '' + else + options = squash('', $cfg['linker']['options']) + end + if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) + includes = '' + else + includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end + includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + return {:command => command, :options => options, :includes => includes} + end + + def link_it(exe_name, obj_list) + linker = build_linker_fields + cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + + (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] + execute(cmd_str) + end + + def build_simulator_fields + return nil if $cfg['simulator'].nil? + if $cfg['simulator']['path'].nil? + command = '' + else + command = (tackit($cfg['simulator']['path']) + ' ') + end + if $cfg['simulator']['pre_support'].nil? + pre_support = '' + else + pre_support = squash('', $cfg['simulator']['pre_support']) + end + if $cfg['simulator']['post_support'].nil? + post_support = '' + else + post_support = squash('', $cfg['simulator']['post_support']) + end + return {:command => command, :pre_support => pre_support, :post_support => post_support} + end + + def execute(command_string, verbose=true) + report command_string + output = `#{command_string}`.chomp + report(output) if (verbose && !output.nil? && (output.length > 0)) + if $?.exitstatus != 0 + raise "Command failed. (Returned #{$?.exitstatus})" + end + return output + end + + def report_summary + summary = UnityTestSummary.new + summary.set_root_path(UNITY_ROOT) + results_glob = "#{$cfg['compiler']['build_path']}*.test*" + results_glob.gsub!(/\\/, '/') + results = Dir[results_glob] + summary.set_targets(results) + report summary.run + end + + def run_tests(test_files) + report 'Running Unity system tests...' + + # Tack on TEST define for compiling unit tests + load_configuration($cfg_file) + test_defines = ['TEST'] + $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? + $cfg['compiler']['defines']['items'] << 'TEST' + + include_dirs = get_local_include_dirs + + # Build and execute each unit test + test_files.each do |test| + obj_list = [] + + if !$cfg['compiler']['aux_sources'].nil? + $cfg['compiler']['aux_sources'].each do |aux| + obj_list << compile(aux, test_defines) + end + end + + # Detect dependencies and build required modules + extract_headers(test).each do |header| + # Compile corresponding source file if it exists + src_file = find_source_file(header, include_dirs) + if !src_file.nil? + obj_list << compile(src_file, test_defines) + end + end + + # Build the test runner (generate if configured to do so) + test_base = File.basename(test, C_EXTENSION) + + runner_name = test_base + '_Runner.c' + runner_path = '' + + if $cfg['compiler']['runner_path'].nil? + runner_path = $cfg['compiler']['build_path'] + runner_name + else + runner_path = $cfg['compiler']['runner_path'] + runner_name + end + + options = $cfg[:unity] + options[:use_param_tests] = (test =~ /parameterized/) ? true : false + UnityTestRunnerGenerator.new(options).run(test, runner_path) + obj_list << compile(runner_path, test_defines) + + # Build the test module + obj_list << compile(test, test_defines) + + # Link the test executable + link_it(test_base, obj_list) + + # Execute unit test and generate results file + simulator = build_simulator_fields + executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] + if simulator.nil? + cmd_str = executable + else + cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end + output = execute(cmd_str) + test_results = $cfg['compiler']['build_path'] + test_base + if output.match(/OK$/m).nil? + test_results += '.testfail' + else + test_results += '.testpass' + end + File.open(test_results, 'w') { |f| f.print output } + + end + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/clang_file.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +--- +compiler: + path: clang + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-Wall' + - '-Wextra' + - '-Werror' + - '-Wcast-qual' + - '-Wconversion' + - '-Wdisabled-optimization' + - '-Wformat=2' + - '-Winit-self' + - '-Winline' + - '-Winvalid-pch' + - '-Wmissing-declarations' + - '-Wmissing-include-dirs' + - '-Wmissing-prototypes' + - '-Wnonnull' + - '-Wpacked' + - '-Wpointer-arith' + - '-Wredundant-decls' + - '-Wswitch-default' + - '-Wstrict-aliasing' + - '-Wstrict-overflow=5' + - '-Wuninitialized' + - '-Wunused' +# - '-Wunreachable-code' + - '-Wreturn-type' + - '-Wshadow' + - '-Wundef' + - '-Wwrite-strings' + - '-Wno-missing-declarations' + - '-Wno-missing-prototypes' + - '-Wno-nested-externs' + - '-Wno-redundant-decls' + - '-Wno-unused-parameter' + - '-Wno-variadic-macros' + - '-Wbad-function-cast' + - '-fms-extensions' + - '-fno-omit-frame-pointer' + - '-ffloat-store' + - '-fno-common' + - '-fstrict-aliasing' + - '-std=gnu99' + - '-pedantic' + - '-O0' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_64 + - UNITY_OUTPUT_RESULTS_FILE + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: clang + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/clang_strict.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,85 @@ +--- +compiler: + path: clang + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-Wall' + - '-Wextra' + - '-Werror' + - '-Wcast-qual' + - '-Wconversion' + - '-Wdisabled-optimization' + - '-Wformat=2' + - '-Winit-self' + - '-Winline' + - '-Winvalid-pch' + - '-Wmissing-declarations' + - '-Wmissing-include-dirs' + - '-Wmissing-prototypes' + - '-Wnonnull' + - '-Wpacked' + - '-Wpointer-arith' + - '-Wredundant-decls' + - '-Wswitch-default' + - '-Wstrict-aliasing' + - '-Wstrict-overflow=5' + - '-Wuninitialized' + - '-Wunused' +# - '-Wunreachable-code' + - '-Wreturn-type' + - '-Wshadow' + - '-Wundef' + - '-Wwrite-strings' + - '-Wno-missing-declarations' + - '-Wno-missing-prototypes' + - '-Wno-nested-externs' + - '-Wno-redundant-decls' + - '-Wno-unused-parameter' + - '-Wno-variadic-macros' + - '-Wbad-function-cast' + - '-fms-extensions' + - '-fno-omit-frame-pointer' + - '-ffloat-store' + - '-fno-common' + - '-fstrict-aliasing' + - '-std=gnu99' + - '-pedantic' + - '-O0' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_SUPPORT_64 + - UNITY_OUTPUT_FLUSH + - UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: clang + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/gcc_32.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,49 @@ +compiler: + path: gcc + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m32' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_EXCLUDE_STDINT_H + - UNITY_EXCLUDE_LIMITS_H + - UNITY_EXCLUDE_SIZEOF + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_INT_WIDTH=32 + - UNITY_LONG_WIDTH=32 + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m32' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/gcc_64.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,50 @@ +compiler: + path: gcc + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m64' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_EXCLUDE_STDINT_H + - UNITY_EXCLUDE_LIMITS_H + - UNITY_EXCLUDE_SIZEOF + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_SUPPORT_64 + - UNITY_INT_WIDTH=32 + - UNITY_LONG_WIDTH=64 + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/gcc_auto_limits.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,46 @@ +compiler: + path: gcc + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m64' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_EXCLUDE_STDINT_H + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_SUPPORT_64 + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/gcc_auto_sizeof.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,47 @@ +compiler: + path: gcc + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m64' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_EXCLUDE_STDINT_H + - UNITY_EXCLUDE_LIMITS_H + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_SUPPORT_64 + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/gcc_auto_stdint.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,58 @@ +compiler: + path: gcc + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m64' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + - '-Wextra' + - '-Werror' + - '-Wpointer-arith' + - '-Wcast-align' + - '-Wwrite-strings' + - '-Wswitch-default' + - '-Wunreachable-code' + - '-Winit-self' + - '-Wmissing-field-initializers' + - '-Wno-unknown-pragmas' + - '-Wstrict-prototypes' + - '-Wundef' + - '-Wold-style-definition' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_SUPPORT_64 + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/gcc_manual_math.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,46 @@ +compiler: + path: gcc + source_path: '../src/' + unit_tests_path: &unit_tests_path 'tests/' + build_path: &build_path 'build/' + options: + - '-c' + - '-m64' + - '-Wall' + - '-Wno-address' + - '-std=c99' + - '-pedantic' + includes: + prefix: '-I' + items: + - 'src/' + - '../src/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_EXCLUDE_MATH_H + - UNITY_INCLUDE_DOUBLE + - UNITY_SUPPORT_TEST_CASES + - UNITY_SUPPORT_64 + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: gcc + options: + - -lm + - '-m64' + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.exe' + destination: *build_path +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/hitech_picc18.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,101 @@ +# rumor has it that this yaml file works for the standard edition of the +# hitech PICC18 compiler, but not the pro version. +# +compiler: + path: cd build && picc18 + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - --chip=18F87J10 + - --ide=hitide + - --q #quiet please + - --asmlist + - --codeoffset=0 + - --emi=wordwrite # External memory interface protocol + - --warn=0 # allow all normal warning messages + - --errors=10 # Number of errors before aborting compile + - --char=unsigned + - -Bl # Large memory model + - -G # generate symbol file + - --cp=16 # 16-bit pointers + - --double=24 + - -N255 # 255-char symbol names + - --opt=none # Do not use any compiler optimziations + - -c # compile only + - -M + includes: + prefix: '-I' + items: + - 'c:/Projects/NexGen/Prototypes/CMockTest/src/' + - 'c:/Projects/NexGen/Prototypes/CMockTest/mocks/' + - 'c:/CMock/src/' + - 'c:/CMock/examples/src/' + - 'c:/CMock/vendor/unity/src/' + - 'c:/CMock/vendor/unity/examples/helper/' + - *unit_tests_path + defines: + prefix: '-D' + items: + - UNITY_INT_WIDTH=16 + - UNITY_POINTER_WIDTH=16 + - CMOCK_MEM_STATIC + - CMOCK_MEM_SIZE=3000 + - UNITY_SUPPORT_TEST_CASES + - _PICC18 + object_files: + # prefix: '-O' # Hi-Tech doesn't want a prefix. They key off of filename .extensions, instead + extension: '.obj' + destination: *build_path + +linker: + path: cd build && picc18 + options: + - --chip=18F87J10 + - --ide=hitide + - --cp=24 # 24-bit pointers. Is this needed for linker?? + - --double=24 # Is this needed for linker?? + - -Lw # Scan the pic87*w.lib in the lib/ of the compiler installation directory + - --summary=mem,file # info listing + - --summary=+psect + - --summary=+hex + - --output=+intel + - --output=+mcof + - --runtime=+init # Directs startup code to copy idata, ibigdata and ifardata psects from ROM to RAM. + - --runtime=+clear # Directs startup code to clear bss, bigbss, rbss and farbss psects + - --runtime=+clib # link in the c-runtime + - --runtime=+keep # Keep the generated startup src after its obj is linked + - -G # Generate src-level symbol file + - -MIWasTheLastToBuild.map + - --warn=0 # allow all normal warning messages + - -Bl # Large memory model (probably not needed for linking) + includes: + prefix: '-I' + object_files: + path: *build_path + extension: '.obj' + bin_files: + prefix: '-O' + extension: '.hex' + destination: *build_path + +simulator: + path: + pre_support: + - 'java -client -jar ' # note space + - ['C:\Program Files\HI-TECH Software\HI-TIDE\3.15\lib\', 'simpic18.jar'] + - 18F87J10 + post_support: + +:cmock: + :plugins: [] + :includes: + - Types.h + :suite_teardown: | + if (num_failures) + _FAILED_TEST(); + else + _PASSED_TESTS(); + return 0; + +colour: true
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/iar_arm_v4.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,89 @@ +tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 4.0 Kickstart\' +compiler: + path: [*tools_root, 'arm\bin\iccarm.exe'] + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - --dlib_config + - [*tools_root, 'arm\lib\dl4tptinl8n.h'] + - -z3 + - --no_cse + - --no_unroll + - --no_inline + - --no_code_motion + - --no_tbaa + - --no_clustering + - --no_scheduling + - --debug + - --cpu_mode thumb + - --endian little + - --cpu ARM7TDMI + - --stack_align 4 + - --interwork + - -e + - --silent + - --warnings_are_errors + - --fpu None + - --diag_suppress Pa050 + includes: + prefix: '-I' + items: + - [*tools_root, 'arm\inc\'] + - 'src\' + - '..\src\' + - *unit_tests_path + - 'vendor\unity\src\' + defines: + prefix: '-D' + items: + - UNITY_SUPPORT_64 + - 'UNITY_SUPPORT_TEST_CASES' + object_files: + prefix: '-o' + extension: '.r79' + destination: *build_path +linker: + path: [*tools_root, 'common\bin\xlink.exe'] + options: + - -rt + - [*tools_root, 'arm\lib\dl4tptinl8n.r79'] + - -D_L_EXTMEM_START=0 + - -D_L_EXTMEM_SIZE=0 + - -D_L_HEAP_SIZE=120 + - -D_L_STACK_SIZE=32 + - -e_small_write=_formatted_write + - -s + - __program_start + - -f + - [*tools_root, '\arm\config\lnkarm.xcl'] + includes: + prefix: '-I' + items: + - [*tools_root, 'arm\config\'] + - [*tools_root, 'arm\lib\'] + object_files: + path: *build_path + extension: '.r79' + bin_files: + prefix: '-o' + extension: '.d79' + destination: *build_path +simulator: + path: [*tools_root, 'common\bin\CSpyBat.exe'] + pre_support: + - --silent + - [*tools_root, 'arm\bin\armproc.dll'] + - [*tools_root, 'arm\bin\armsim.dll'] + post_support: + - --plugin + - [*tools_root, 'arm\bin\armbat.dll'] + - --backend + - -B + - -p + - [*tools_root, 'arm\config\ioat91sam7X256.ddf'] + - -d + - sim +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/iar_arm_v5.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,79 @@ +tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 5.3\' +compiler: + path: [*tools_root, 'arm\bin\iccarm.exe'] + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - --dlib_config + - [*tools_root, 'arm\inc\DLib_Config_Normal.h'] + - --no_cse + - --no_unroll + - --no_inline + - --no_code_motion + - --no_tbaa + - --no_clustering + - --no_scheduling + - --debug + - --cpu_mode thumb + - --endian=little + - --cpu=ARM7TDMI + - --interwork + - --warnings_are_errors + - --fpu=None + - --diag_suppress=Pa050 + - --diag_suppress=Pe111 + - -e + - -On + includes: + prefix: '-I' + items: + - [*tools_root, 'arm\inc\'] + - 'src\' + - '..\src\' + - *unit_tests_path + - 'vendor\unity\src\' + - 'iar\iar_v5\incIAR\' + defines: + prefix: '-D' + items: + - UNITY_SUPPORT_64 + - 'UNITY_SUPPORT_TEST_CASES' + object_files: + prefix: '-o' + extension: '.r79' + destination: *build_path +linker: + path: [*tools_root, 'arm\bin\ilinkarm.exe'] + options: + - --redirect _Printf=_PrintfLarge + - --redirect _Scanf=_ScanfSmall + - --semihosting + - --entry __iar_program_start + - --config + - [*tools_root, 'arm\config\generic.icf'] + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.out' + destination: *build_path +simulator: + path: [*tools_root, 'common\bin\CSpyBat.exe'] + pre_support: + - --silent + - [*tools_root, 'arm\bin\armproc.dll'] + - [*tools_root, 'arm\bin\armsim.dll'] + post_support: + - --plugin + - [*tools_root, 'arm\bin\armbat.dll'] + - --backend + - -B + - -p + - [*tools_root, 'arm\config\debugger\atmel\ioat91sam7X256.ddf'] + - -d + - sim +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/iar_arm_v5_3.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,79 @@ +tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 5.3\' +compiler: + path: [*tools_root, 'arm\bin\iccarm.exe'] + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - --dlib_config + - [*tools_root, 'arm\inc\DLib_Config_Normal.h'] + - --no_cse + - --no_unroll + - --no_inline + - --no_code_motion + - --no_tbaa + - --no_clustering + - --no_scheduling + - --debug + - --cpu_mode thumb + - --endian=little + - --cpu=ARM7TDMI + - --interwork + - --warnings_are_errors + - --fpu=None + - --diag_suppress=Pa050 + - --diag_suppress=Pe111 + - -e + - -On + includes: + prefix: '-I' + items: + - [*tools_root, 'arm\inc\'] + - 'src\' + - '..\src\' + - *unit_tests_path + - 'vendor\unity\src\' + - 'iar\iar_v5\incIAR\' + defines: + prefix: '-D' + items: + - UNITY_SUPPORT_64 + - 'UNITY_SUPPORT_TEST_CASES' + object_files: + prefix: '-o' + extension: '.r79' + destination: *build_path +linker: + path: [*tools_root, 'arm\bin\ilinkarm.exe'] + options: + - --redirect _Printf=_PrintfLarge + - --redirect _Scanf=_ScanfSmall + - --semihosting + - --entry __iar_program_start + - --config + - [*tools_root, 'arm\config\generic.icf'] + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.out' + destination: *build_path +simulator: + path: [*tools_root, 'common\bin\CSpyBat.exe'] + pre_support: + - --silent + - [*tools_root, 'arm\bin\armproc.dll'] + - [*tools_root, 'arm\bin\armsim.dll'] + post_support: + - --plugin + - [*tools_root, 'arm\bin\armbat.dll'] + - --backend + - -B + - -p + - [*tools_root, 'arm\config\debugger\atmel\ioat91sam7X256.ddf'] + - -d + - sim +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,93 @@ +#Default tool path for IAR 5.4 on Windows XP 64bit +tools_root: &tools_root 'C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4 Kickstart\' +compiler: + path: [*tools_root, 'arm\bin\iccarm.exe'] + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - --diag_suppress=Pa050 + #- --diag_suppress=Pe111 + - --debug + - --endian=little + - --cpu=Cortex-M3 + - --no_path_in_file_macros + - -e + - --fpu=None + - --dlib_config + - [*tools_root, 'arm\inc\DLib_Config_Normal.h'] + #- --preinclude --preinclude C:\Vss\T2 Working\common\system.h + - --interwork + - --warnings_are_errors +# - Ohz + - -Oh +# - --no_cse +# - --no_unroll +# - --no_inline +# - --no_code_motion +# - --no_tbaa +# - --no_clustering +# - --no_scheduling + + includes: + prefix: '-I' + items: + - [*tools_root, 'arm\inc\'] + - 'src\' + - '..\src\' + - *unit_tests_path + - 'vendor\unity\src\' + - 'iar\iar_v5\incIAR\' + defines: + prefix: '-D' + items: + - ewarm + - PART_LM3S9B92 + - TARGET_IS_TEMPEST_RB1 + - USE_ROM_DRIVERS + - UART_BUFFERED + - UNITY_SUPPORT_64 + object_files: + prefix: '-o' + extension: '.r79' + destination: *build_path +linker: + path: [*tools_root, 'arm\bin\ilinkarm.exe'] + options: + - --redirect _Printf=_PrintfLarge + - --redirect _Scanf=_ScanfSmall + - --semihosting + - --entry __iar_program_start + - --config + - [*tools_root, 'arm\config\generic.icf'] +# - ['C:\Temp\lm3s9b92.icf'] + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.out' + destination: *build_path +simulator: + path: [*tools_root, 'common\bin\CSpyBat.exe'] + pre_support: + #- --silent + - [*tools_root, 'arm\bin\armproc.dll'] + - [*tools_root, 'arm\bin\armsim2.dll'] + post_support: + - --plugin + - [*tools_root, 'arm\bin\armbat.dll'] + - --backend + - -B + - --endian=little + - --cpu=Cortex-M3 + - --fpu=None + - -p + - [*tools_root, 'arm\config\debugger\TexasInstruments\iolm3sxxxx.ddf'] + - --semihosting + - --device=LM3SxBxx + #- -d + #- sim +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/iar_cortexm3_v5.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,83 @@ +# unit testing under iar compiler / simulator for STM32 Cortex-M3 + +tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 5.4\' +compiler: + path: [*tools_root, 'arm\bin\iccarm.exe'] + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - --dlib_config + - [*tools_root, 'arm\inc\DLib_Config_Normal.h'] + - --no_cse + - --no_unroll + - --no_inline + - --no_code_motion + - --no_tbaa + - --no_clustering + - --no_scheduling + - --debug + - --cpu_mode thumb + - --endian=little + - --cpu=Cortex-M3 + - --interwork + - --warnings_are_errors + - --fpu=None + - --diag_suppress=Pa050 + - --diag_suppress=Pe111 + - -e + - -On + includes: + prefix: '-I' + items: + - [*tools_root, 'arm\inc\'] + - 'src\' + - '..\src\' + - *unit_tests_path + - 'vendor\unity\src\' + - 'iar\iar_v5\incIAR\' + defines: + prefix: '-D' + items: + - 'IAR' + - 'UNITY_SUPPORT_64' + - 'UNITY_SUPPORT_TEST_CASES' + object_files: + prefix: '-o' + extension: '.r79' + destination: *build_path +linker: + path: [*tools_root, 'arm\bin\ilinkarm.exe'] + options: + - --redirect _Printf=_PrintfLarge + - --redirect _Scanf=_ScanfSmall + - --semihosting + - --entry __iar_program_start + - --config + - [*tools_root, 'arm\config\generic_cortex.icf'] + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.out' + destination: *build_path +simulator: + path: [*tools_root, 'common\bin\CSpyBat.exe'] + pre_support: + - --silent + - [*tools_root, 'arm\bin\armproc.dll'] + - [*tools_root, 'arm\bin\armsim.dll'] + post_support: + - --plugin + - [*tools_root, 'arm\bin\armbat.dll'] + - --backend + - -B + - -p + - [*tools_root, 'arm\config\debugger\ST\iostm32f107xx.ddf'] + - --cpu=Cortex-M3 + - -d + - sim +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/iar_msp430.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,94 @@ +tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 5.3 MSP430\' +core_root: &core_root [*tools_root, '430\'] +core_bin: &core_bin [*core_root, 'bin\'] +core_config: &core_config [*core_root, 'config\'] +core_lib: &core_lib [*core_root, 'lib\'] +core_inc: &core_inc [*core_root, 'inc\'] +core_config: &core_config [*core_root, 'config\'] + +compiler: + path: [*core_bin, 'icc430.exe'] + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - --dlib_config + - [*core_lib, 'dlib\dl430fn.h'] + - --no_cse + - --no_unroll + - --no_inline + - --no_code_motion + - --no_tbaa + - --debug + - -e + - -Ol + - --multiplier=16 + - --double=32 + - --diag_suppress Pa050 + - --diag_suppress Pe111 + includes: + prefix: '-I' + items: + - *core_inc + - [*core_inc, 'dlib'] + - [*core_lib, 'dlib'] + - 'src\' + - '../src/' + - *unit_tests_path + - 'vendor\unity\src' + defines: + prefix: '-D' + items: + - '__MSP430F149__' + - 'INT_WIDTH=16' + - 'UNITY_EXCLUDE_FLOAT' + - 'UNITY_SUPPORT_TEST_CASES' + object_files: + prefix: '-o' + extension: '.r43' + destination: *build_path +linker: + path: [*core_bin, 'xlink.exe'] + options: + - -rt + - [*core_lib, 'dlib\dl430fn.r43'] + - -e_PrintfTiny=_Printf + - -e_ScanfSmall=_Scanf + - -s __program_start + - -D_STACK_SIZE=50 + - -D_DATA16_HEAP_SIZE=50 + - -D_DATA20_HEAP_SIZE=50 + - -f + - [*core_config, 'lnk430f5438.xcl'] + - -f + - [*core_config, 'multiplier.xcl'] + includes: + prefix: '-I' + items: + - *core_config + - *core_lib + - [*core_lib, 'dlib'] + object_files: + path: *build_path + extension: '.r79' + bin_files: + prefix: '-o' + extension: '.d79' + destination: *build_path +simulator: + path: [*tools_root, 'common\bin\CSpyBat.exe'] + pre_support: + - --silent + - [*core_bin, '430proc.dll'] + - [*core_bin, '430sim.dll'] + post_support: + - --plugin + - [*core_bin, '430bat.dll'] + - --backend -B + - --cpu MSP430F5438 + - -p + - [*core_config, 'MSP430F5438.ddf'] + - -d sim +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/targets/iar_sh2a_v6.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,85 @@ +tools_root: &tools_root 'C:\Program Files\IAR Systems\Embedded Workbench 6.0\' +compiler: + path: [*tools_root, 'sh\bin\iccsh.exe'] + source_path: '..\src\' + unit_tests_path: &unit_tests_path 'tests\' + build_path: &build_path 'build\' + options: + - -e + - --char_is_signed + - -Ol + - --no_cse + - --no_unroll + - --no_inline + - --no_code_motion + - --no_tbaa + - --no_scheduling + - --no_clustering + - --debug + - --dlib_config + - [*tools_root, 'sh\inc\DLib_Product.h'] + - --double=32 + - --code_model=huge + - --data_model=huge + - --core=sh2afpu + - --warnings_affect_exit_code + - --warnings_are_errors + - --mfc + - --use_unix_directory_separators + - --diag_suppress=Pe161 + includes: + prefix: '-I' + items: + - [*tools_root, 'sh\inc\'] + - [*tools_root, 'sh\inc\c'] + - 'src\' + - '..\src\' + - *unit_tests_path + - 'vendor\unity\src\' + defines: + prefix: '-D' + items: + - UNITY_SUPPORT_64 + - 'UNITY_SUPPORT_TEST_CASES' + object_files: + prefix: '-o' + extension: '.o' + destination: *build_path +linker: + path: [*tools_root, 'sh\bin\ilinksh.exe'] + options: + - --redirect __Printf=__PrintfSmall + - --redirect __Scanf=__ScanfSmall + - --config + - [*tools_root, 'sh\config\generic.icf'] + - --config_def _CSTACK_SIZE=0x800 + - --config_def _HEAP_SIZE=0x800 + - --config_def _INT_TABLE=0x10 + - --entry __iar_program_start + - --debug_lib + object_files: + path: *build_path + extension: '.o' + bin_files: + prefix: '-o' + extension: '.out' + destination: *build_path +simulator: + path: [*tools_root, 'common\bin\CSpyBat.exe'] + pre_support: + - --silent + - [*tools_root, 'sh\bin\shproc.dll'] + - [*tools_root, 'sh\bin\shsim.dll'] + post_support: + - --plugin + - [*tools_root, 'sh\bin\shbat.dll'] + - --backend + - -B + - --core sh2afpu + - -p + - [*tools_root, 'sh\config\debugger\io7264.ddf'] + - -d + - sim +colour: true +:unity: + :plugins: []
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/testdata/mocksample.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,51 @@ +// This is just a sample test file to be used to test the generator script +#ifndef TEST_SAMPLE_H +#define TEST_SAMPLE_H + +#include <setjmp.h> +#include "unity.h" +#include "funky.h" +#include "Mockstanky.h" + +void setUp(void) +{ + CustomSetupStuff(); +} + +void tearDown(void) +{ + CustomTeardownStuff +} + +//Yup, nice comment +void test_TheFirstThingToTest(void) +{ + TEST_ASSERT(1); + + TEST_ASSERT_TRUE(1); +} + +/* +void test_ShouldBeIgnored(void) +{ + DoesStuff(); +} +*/ + +//void test_ShouldAlsoNotBeTested(void) +//{ +// Call_An_Expect(); +// +// CallAFunction(); +// test_CallAFunctionThatLooksLikeATest(); +//} + +void test_TheSecondThingToTest(void) +{ + Call_An_Expect(); + + CallAFunction(); + test_CallAFunctionThatLooksLikeATest(); +} + +#endif //TEST_SAMPLE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/testdata/sample.yml Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,9 @@ +:unity: + :includes: + - two.h + - three.h + - <four.h> + :plugins: + - :cexception + :suite_setup: | + a_yaml_setup(); \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/testdata/testsample.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,68 @@ +// This is just a sample test file to be used to test the generator script +#ifndef TEST_SAMPLE_H +#define TEST_SAMPLE_H + +#include <setjmp.h> +#include "unity.h" +#include "funky.h" +#include "stanky.h" + +void setUp(void) +{ + CustomSetupStuff(); +} + +void tearDown(void) +{ + CustomTeardownStuff +} + +//Yup, nice comment +void test_TheFirstThingToTest(void) +{ + TEST_ASSERT(1); + + TEST_ASSERT_TRUE(1); +} + +/* +void test_ShouldBeIgnored(void) +{ + DoesStuff(); +} +*/ + +//void test_ShouldAlsoNotBeTested(void) +//{ +// Call_An_Expect(); +// +// CallAFunction(); +// test_CallAFunctionThatLooksLikeATest(); +//} + +void test_TheSecondThingToTest(void) +{ + uint8_t* crazyString = "GET / HTTP/1.1\r\nHost: 127.0.0.1:8081\r\nConnection: keep-alive\r\nCache-Control: no-cache\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36\r\nPostman-Token: 768c7149-c3fb-f704-71a2-63918d9195b2\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate, sdch\r\nAccept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n\r\n"; + + Call_An_Expect(); + + CallAFunction(); + test_CallAFunctionThatLooksLikeATest(); +} + +void test_TheThirdThingToTest(void) +{ + CallAFunction(); +} + +void test_TheFourthThingToTest(void) +{ + uint8_t* anotherString = "GET / HTTP/1.1\r\nHost: 127.0.0.1:8081\r\nConnection: keep-alive\r\nCache-Control: no-cache\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36\r\nPostman-Token: 768c7149-c3fb-f704-71a2-63918d9195b2\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate, sdch\r\nAccept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n\r\n"; + + Call_An_Expect(); + + CallAFunction(); + test_CallAFunctionThatLooksLikeATest(); +} + +#endif //TEST_SAMPLE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/tests/test_generate_test_runner.rb Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,102 @@ +# ========================================== +# CMock Project - Automatic Mock Generation for C +# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ========================================== + +require '../auto/generate_test_runner.rb' + +TEST_FILE = 'testdata/testsample.c' +TEST_MOCK = 'testdata/mocksample.c' +OUT_FILE = 'build/testsample_' +EXP_FILE = 'expectdata/testsample_' + +$generate_test_runner_failures = 0 + +def verify_output_equal(subtest) + expected = File.read(EXP_FILE + subtest + '.c').gsub(/\r\n/,"\n") + actual = File.read(OUT_FILE + subtest + '.c').gsub(/\r\n/,"\n") + if (expected != actual) + report(" #{subtest}:FAIL") + $generate_test_runner_failures += 1 + else + report(" #{subtest}:PASS") + end +end + +should "GenerateARunnerByCreatingRunnerWithOptions" do + sets = { 'def' => nil, + 'new1' => { :plugins => [:cexception], :includes => ['one.h', 'two.h'], :enforce_strict_ordering => true }, + 'new2' => { :plugins => [:ignore], :suite_setup => "a_custom_setup();", :suite_teardown => "a_custom_teardown();" } + } + + sets.each_pair do |subtest, options| + UnityTestRunnerGenerator.new(options).run(TEST_FILE, OUT_FILE + subtest + '.c') + verify_output_equal(subtest) + UnityTestRunnerGenerator.new(options).run(TEST_MOCK, OUT_FILE + 'mock_' + subtest + '.c') + verify_output_equal('mock_' + subtest) + end +end + +should "GenerateARunnerAlongWithAHeaderIfSpecified" do + sets = { 'head1' => { :header_file => "#{OUT_FILE}head1.h" } } + sets.each_pair do |subtest, options| + UnityTestRunnerGenerator.new(options).run(TEST_FILE, OUT_FILE + subtest + '.c') + verify_output_equal(subtest) + end + + sets = { 'head1' => { :header_file => "#{OUT_FILE}mock_head1.h" } } + sets.each_pair do |subtest, options| + UnityTestRunnerGenerator.new(options).run(TEST_MOCK, OUT_FILE + 'mock_' + subtest + '.c') + verify_output_equal('mock_' + subtest) + end +end + +should "GenerateARunnerByRunningRunnerWithOptions" do + sets = { 'run1' => { :plugins => [:cexception], :includes => ['one.h', 'two.h'], :enforce_strict_ordering => true }, + 'run2' => { :plugins => [:ignore], :suite_setup => "a_custom_setup();", :suite_teardown => "a_custom_teardown();" } + } + + sets.each_pair do |subtest, options| + UnityTestRunnerGenerator.new.run(TEST_FILE, OUT_FILE + subtest + '.c', options) + verify_output_equal(subtest) + UnityTestRunnerGenerator.new.run(TEST_MOCK, OUT_FILE + 'mock_' + subtest + '.c', options) + verify_output_equal('mock_' + subtest) + end +end + +should "GenerateARunnerByPullingYamlOptions" do + subtest = 'yaml' + cmdstr = "ruby ../auto/generate_test_runner.rb testdata/sample.yml \"#{TEST_FILE}\" \"#{OUT_FILE + subtest + '.c'}\"" + `#{cmdstr}` + verify_output_equal(subtest) + + cmdstr = "ruby ../auto/generate_test_runner.rb testdata/sample.yml \"#{TEST_MOCK}\" \"#{OUT_FILE + 'mock_' + subtest + '.c'}\"" + `#{cmdstr}` + verify_output_equal('mock_' + subtest) +end + +should "GenerateARunnerByPullingCommandlineOptions" do + subtest = 'cmd' + cmdstr = "ruby ../auto/generate_test_runner.rb -cexception \"#{TEST_FILE}\" \"#{OUT_FILE + subtest + '.c'}\"" + `#{cmdstr}` + verify_output_equal(subtest) + + cmdstr = "ruby ../auto/generate_test_runner.rb -cexception \"#{TEST_MOCK}\" \"#{OUT_FILE + 'mock_' + subtest + '.c'}\"" + `#{cmdstr}` + verify_output_equal('mock_' + subtest) +end + +should "GenerateARunnerThatUsesParameterizedTests" do + sets = { 'param' => { :plugins => [:ignore], :use_param_tests => true } + } + + sets.each_pair do |subtest, options| + UnityTestRunnerGenerator.new(options).run(TEST_FILE, OUT_FILE + subtest + '.c') + verify_output_equal(subtest) + UnityTestRunnerGenerator.new(options).run(TEST_MOCK, OUT_FILE + 'mock_' + subtest + '.c') + verify_output_equal('mock_' + subtest) + end +end + +raise "There were #{$generate_test_runner_failures.to_s} failures while testing generate_test_runner.rb" if ($generate_test_runner_failures > 0)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/tests/testparameterized.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,104 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#include <setjmp.h> +#include <stdio.h> +#include "unity.h" + +void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests + +#define TEST_CASE(...) + +#define EXPECT_ABORT_BEGIN \ + if (TEST_PROTECT()) \ + { + +#define VERIFY_FAILS_END \ + } \ + Unity.CurrentTestFailed = (Unity.CurrentTestFailed == 1) ? 0 : 1; \ + if (Unity.CurrentTestFailed == 1) { \ + SetToOneMeanWeAlreadyCheckedThisGuy = 1; \ + UnityPrint("[[[[ Previous Test Should Have Failed But Did Not ]]]]"); \ + UNITY_OUTPUT_CHAR('\n'); \ + } + +#define VERIFY_IGNORES_END \ + } \ + Unity.CurrentTestFailed = (Unity.CurrentTestIgnored == 1) ? 0 : 1; \ + Unity.CurrentTestIgnored = 0; \ + if (Unity.CurrentTestFailed == 1) { \ + SetToOneMeanWeAlreadyCheckedThisGuy = 1; \ + UnityPrint("[[[[ Previous Test Should Have Ignored But Did Not ]]]]"); \ + UNITY_OUTPUT_CHAR('\n'); \ + } + +int SetToOneToFailInTearDown; +int SetToOneMeanWeAlreadyCheckedThisGuy; + +void setUp(void) +{ + SetToOneToFailInTearDown = 0; + SetToOneMeanWeAlreadyCheckedThisGuy = 0; +} + +void tearDown(void) +{ + if (SetToOneToFailInTearDown == 1) + TEST_FAIL_MESSAGE("<= Failed in tearDown"); + if ((SetToOneMeanWeAlreadyCheckedThisGuy == 0) && (Unity.CurrentTestFailed > 0)) + { + UnityPrint("[[[[ Previous Test Should Have Passed But Did Not ]]]]"); + UNITY_OUTPUT_CHAR('\n'); + } +} + +TEST_CASE(0) +TEST_CASE(44) +TEST_CASE((90)+9) +void test_TheseShouldAllPass(int Num) +{ + TEST_ASSERT_TRUE(Num < 100); +} + +TEST_CASE(3) +TEST_CASE(77) +TEST_CASE( (99) + 1 - (1)) +void test_TheseShouldAllFail(int Num) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_TRUE(Num > 100); + VERIFY_FAILS_END +} + +TEST_CASE(1) +TEST_CASE(44) +TEST_CASE(99) +TEST_CASE(98) +void test_TheseAreEveryOther(int Num) +{ + if (Num & 1) + { + EXPECT_ABORT_BEGIN + TEST_ASSERT_TRUE(Num > 100); + VERIFY_FAILS_END + } + else + { + TEST_ASSERT_TRUE(Num < 100); + } +} + +void test_NormalPassesStillWork(void) +{ + TEST_ASSERT_TRUE(1); +} + +void test_NormalFailsStillWork(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_TRUE(0); + VERIFY_FAILS_END +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/Unity/test/tests/testunity.c Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,3804 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#include <setjmp.h> +#include "unity.h" +#include <string.h> + +// Dividing by these constants produces +/- infinity. +// The rationale is given in UnityAssertFloatIsInf's body. +#ifndef UNITY_EXCLUDE_FLOAT +static const _UF f_zero = 0.0f; +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +static const _UD d_zero = 0.0; +#endif + +#define EXPECT_ABORT_BEGIN \ + if (TEST_PROTECT()) \ + { + +#define VERIFY_FAILS_END \ + } \ + Unity.CurrentTestFailed = (Unity.CurrentTestFailed == 1) ? 0 : 1; \ + if (Unity.CurrentTestFailed == 1) { \ + SetToOneMeanWeAlreadyCheckedThisGuy = 1; \ + UnityPrintNumberUnsigned(Unity.CurrentTestLineNumber); \ + UNITY_OUTPUT_CHAR(':'); \ + UnityPrint(Unity.CurrentTestName); \ + UnityPrint("[[[[ Previous Test Should Have Failed But Did Not ]]]]"); \ + UNITY_OUTPUT_CHAR('\n'); \ + } + +#define VERIFY_IGNORES_END \ + } \ + Unity.CurrentTestFailed = (Unity.CurrentTestIgnored == 1) ? 0 : 1; \ + Unity.CurrentTestIgnored = 0; \ + if (Unity.CurrentTestFailed == 1) { \ + SetToOneMeanWeAlreadyCheckedThisGuy = 1; \ + UnityPrint("[[[[ Previous Test Should Have Ignored But Did Not ]]]]"); \ + UNITY_OUTPUT_CHAR('\n'); \ + } + +static int SetToOneToFailInTearDown; +static int SetToOneMeanWeAlreadyCheckedThisGuy; + +void setUp(void) +{ + SetToOneToFailInTearDown = 0; + SetToOneMeanWeAlreadyCheckedThisGuy = 0; +} + +void tearDown(void) +{ + if (SetToOneToFailInTearDown == 1) + TEST_FAIL_MESSAGE("<= Failed in tearDown"); + if ((SetToOneMeanWeAlreadyCheckedThisGuy == 0) && (Unity.CurrentTestFailed > 0)) + { + UnityPrint("[[[[ Previous Test Should Have Passed But Did Not ]]]]"); + UNITY_OUTPUT_CHAR('\n'); + } +} + +void testUnitySizeInitializationReminder(void) +{ + /* This test ensures that sizeof(struct _Unity) doesn't change. If this + * test breaks, go look at the initialization of the Unity global variable + * in unity.c and make sure we're filling in the proper fields. */ + const char* message = "Unexpected size for _Unity struct. Please check that " + "the initialization of the Unity symbol in unity.c is " + "still correct."; + + /* Define a structure with all the same fields as `struct _Unity`. */ +#ifdef UNITY_EXCLUDE_DETAILS + struct { + const char* TestFile; + const char* CurrentTestName; + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; + jmp_buf AbortFrame; + } _Expected_Unity; +#else + struct { + const char* TestFile; + const char* CurrentTestName; + const char* CurrentDetails1; + const char* CurrentDetails2; + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; + jmp_buf AbortFrame; + } _Expected_Unity; +#endif + + /* Compare our fake structure's size to the actual structure's size. They + * should be the same. + * + * This accounts for alignment, padding, and packing issues that might come + * up between different architectures. */ + TEST_ASSERT_EQUAL_MESSAGE(sizeof(_Expected_Unity), sizeof(Unity), message); +} + +void testPassShouldEndImmediatelyWithPass(void) +{ + TEST_PASS(); + TEST_FAIL_MESSAGE("We should have passed already and finished this test"); +} + +void testTrue(void) +{ + TEST_ASSERT(1); + + TEST_ASSERT_TRUE(1); +} + +void testFalse(void) +{ + TEST_ASSERT_FALSE(0); + + TEST_ASSERT_UNLESS(0); +} + +void testPreviousPass(void) +{ + TEST_ASSERT_EQUAL_INT(0U, Unity.TestFailures); +} + +void testNotVanilla(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT(0); + VERIFY_FAILS_END +} + +void testNotTrue(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_TRUE(0); + VERIFY_FAILS_END +} + +void testNotFalse(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_FALSE(1); + VERIFY_FAILS_END +} + +void testNotUnless(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UNLESS(1); + VERIFY_FAILS_END +} + +void testNotNotEqual(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_NOT_EQUAL(10, 10); + VERIFY_FAILS_END +} + +void testFail(void) +{ + EXPECT_ABORT_BEGIN + TEST_FAIL_MESSAGE("Expected for testing"); + VERIFY_FAILS_END +} + +void testIsNull(void) +{ + char* ptr1 = NULL; + const char* ptr2 = "hello"; + + TEST_ASSERT_NULL(ptr1); + TEST_ASSERT_NOT_NULL(ptr2); +} + +void testIsNullShouldFailIfNot(void) +{ + const char* ptr1 = "hello"; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_NULL(ptr1); + VERIFY_FAILS_END +} + +void testNotNullShouldFailIfNULL(void) +{ + char* ptr1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_NOT_NULL(ptr1); + VERIFY_FAILS_END +} + +void testIgnore(void) +{ + EXPECT_ABORT_BEGIN + TEST_IGNORE(); + TEST_FAIL_MESSAGE("This should not be reached"); + VERIFY_IGNORES_END +} + +void testIgnoreMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_IGNORE_MESSAGE("This is an expected TEST_IGNORE_MESSAGE string!"); + TEST_FAIL_MESSAGE("This should not be reached"); + VERIFY_IGNORES_END +} + +void testNotEqualInts(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT(3982, 3983); + VERIFY_FAILS_END +} + +void testNotEqualInt8s(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT8(-127, -126); + VERIFY_FAILS_END +} + +void testNotEqualInt16s(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT16(-16383, -16382); + VERIFY_FAILS_END +} + +void testNotEqualInt32s(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT32(-2147483647, -2147483648); //use largest 32 bit negative to test printability + VERIFY_FAILS_END +} + +void testNotEqualBits(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_BITS(0xFF00, 0x5555, 0x5A55); + VERIFY_FAILS_END +} + +void testNotEqualUInts(void) +{ + _UU16 v0, v1; + + v0 = 9000; + v1 = 9001; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualUInt8s(void) +{ + _UU8 v0, v1; + + v0 = 254; + v1 = 255; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT8(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualUInt16s(void) +{ + _UU16 v0, v1; + + v0 = 65535; + v1 = 65534; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT16(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualUInt32s(void) +{ + _UU32 v0, v1; + + v0 = 4294967295; + v1 = 4294967294; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT32(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualHex8s(void) +{ + _UU8 v0, v1; + + v0 = 0x23; + v1 = 0x22; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX8(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualHex8sIfSigned(void) +{ + _US8 v0, v1; + + v0 = -2; + v1 = 2; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX8(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualHex16s(void) +{ + _UU16 v0, v1; + + v0 = 0x1234; + v1 = 0x1235; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX16(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualHex16sIfSigned(void) +{ + _US16 v0, v1; + + v0 = -1024; + v1 = -1028; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX16(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualHex32s(void) +{ + _UU32 v0, v1; + + v0 = 900000; + v1 = 900001; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32(v0, v1); + VERIFY_FAILS_END +} + +void testNotEqualHex32sIfSigned(void) +{ + _US32 v0, v1; + + v0 = -900000; + v1 = 900001; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32(v0, v1); + VERIFY_FAILS_END +} + +void testEqualInts(void) +{ + int v0, v1; + int *p0, *p1; + + v0 = 19467; + v1 = 19467; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT(1837, 1837); + TEST_ASSERT_EQUAL_INT(-27365, -27365); + TEST_ASSERT_EQUAL_INT(v0, v1); + TEST_ASSERT_EQUAL_INT(19467, v1); + TEST_ASSERT_EQUAL_INT(v0, 19467); + TEST_ASSERT_EQUAL_INT(*p0, v1); + TEST_ASSERT_EQUAL_INT(*p0, *p1); + TEST_ASSERT_EQUAL_INT(*p0, 19467); +} + +void testEqualInt8s(void) +{ + _US8 v0, v1; + _US8 *p0, *p1; + + v0 = 0x22; + v1 = 0x22; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT8(0x22, 0x22); + TEST_ASSERT_EQUAL_INT8(v0, v1); + TEST_ASSERT_EQUAL_INT8(0x22, v1); + TEST_ASSERT_EQUAL_INT8(v0, 0x22); + TEST_ASSERT_EQUAL_INT8(*p0, v1); + TEST_ASSERT_EQUAL_INT8(*p0, *p1); + TEST_ASSERT_EQUAL_INT8(*p0, 0x22); +} + +void testEqualInt8sWhenThereAreDifferencesOutside8Bits(void) +{ + TEST_ASSERT_EQUAL_INT8(0x321,0x421); + TEST_ASSERT_EQUAL_INT8(0xFF21,0x0021); +} + +void testEqualInt16s(void) +{ + _US16 v0, v1; + _US16 *p0, *p1; + + v0 = 0x7876; + v1 = 0x7876; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT16(0x7876, 0x7876); + TEST_ASSERT_EQUAL_INT16(v0, v1); + TEST_ASSERT_EQUAL_INT16(0x7876, v1); + TEST_ASSERT_EQUAL_INT16(v0, 0x7876); + TEST_ASSERT_EQUAL_INT16(*p0, v1); + TEST_ASSERT_EQUAL_INT16(*p0, *p1); + TEST_ASSERT_EQUAL_INT16(*p0, 0x7876); +} + +void testEqualInt16sNegatives(void) +{ + _US16 v0, v1; + _US16 *p0, *p1; + + v0 = -7876; + v1 = -7876; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT16(-7876, -7876); + TEST_ASSERT_EQUAL_INT16(v0, v1); + TEST_ASSERT_EQUAL_INT16(-7876, v1); + TEST_ASSERT_EQUAL_INT16(v0, -7876); + TEST_ASSERT_EQUAL_INT16(*p0, v1); + TEST_ASSERT_EQUAL_INT16(*p0, *p1); + TEST_ASSERT_EQUAL_INT16(*p0, -7876); +} + +void testEqualInt16sWhenThereAreDifferencesOutside16Bits(void) +{ + TEST_ASSERT_EQUAL_INT16(0x54321,0x64321); + TEST_ASSERT_EQUAL_INT16(0xFFFF4321,0x00004321); +} + +void testEqualInt32s(void) +{ + _US32 v0, v1; + _US32 *p0, *p1; + + v0 = 0x78760000; + v1 = 0x78760000; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT32(0x78760000, 0x78760000); + TEST_ASSERT_EQUAL_INT32(v0, v1); + TEST_ASSERT_EQUAL_INT32(0x78760000, v1); + TEST_ASSERT_EQUAL_INT32(v0, 0x78760000); + TEST_ASSERT_EQUAL_INT32(*p0, v1); + TEST_ASSERT_EQUAL_INT32(*p0, *p1); + TEST_ASSERT_EQUAL_INT32(*p0, 0x78760000); +} + +void testEqualInt32sNegatives(void) +{ + _US32 v0, v1; + _US32 *p0, *p1; + + v0 = -123456789; + v1 = -123456789; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT32(-123456789, -123456789); + TEST_ASSERT_EQUAL_INT32(v0, v1); + TEST_ASSERT_EQUAL_INT32(-123456789, v1); + TEST_ASSERT_EQUAL_INT32(v0, -123456789); + TEST_ASSERT_EQUAL_INT32(*p0, v1); + TEST_ASSERT_EQUAL_INT32(*p0, *p1); + TEST_ASSERT_EQUAL_INT32(*p0, -123456789); +} + + +void testEqualUints(void) +{ + unsigned int v0, v1; + unsigned int *p0, *p1; + + v0 = 19467; + v1 = 19467; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT(1837, 1837); + TEST_ASSERT_EQUAL_UINT(v0, v1); + TEST_ASSERT_EQUAL_UINT(19467, v1); + TEST_ASSERT_EQUAL_UINT(v0, 19467); + TEST_ASSERT_EQUAL_UINT(*p0, v1); + TEST_ASSERT_EQUAL_UINT(*p0, *p1); + TEST_ASSERT_EQUAL_UINT(*p0, 19467); + TEST_ASSERT_EQUAL_UINT(60872u, 60872u); +} + + +void testEqualUint8s(void) +{ + _UU8 v0, v1; + _UU8 *p0, *p1; + + v0 = 0x22; + v1 = 0x22; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT8(0x22, 0x22); + TEST_ASSERT_EQUAL_UINT8(v0, v1); + TEST_ASSERT_EQUAL_UINT8(0x22, v1); + TEST_ASSERT_EQUAL_UINT8(v0, 0x22); + TEST_ASSERT_EQUAL_UINT8(*p0, v1); + TEST_ASSERT_EQUAL_UINT8(*p0, *p1); + TEST_ASSERT_EQUAL_UINT8(*p0, 0x22); +} + +void testEqualUint8sWhenThereAreDifferencesOutside8Bits(void) +{ + TEST_ASSERT_EQUAL_UINT8(0x321,0x421); + TEST_ASSERT_EQUAL_UINT8(0xFF21,0x0021); +} + +void testEqualUint16s(void) +{ + _UU16 v0, v1; + _UU16 *p0, *p1; + + v0 = 0x9876; + v1 = 0x9876; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT16(0x9876, 0x9876); + TEST_ASSERT_EQUAL_UINT16(v0, v1); + TEST_ASSERT_EQUAL_UINT16(0x9876, v1); + TEST_ASSERT_EQUAL_UINT16(v0, 0x9876); + TEST_ASSERT_EQUAL_UINT16(*p0, v1); + TEST_ASSERT_EQUAL_UINT16(*p0, *p1); + TEST_ASSERT_EQUAL_UINT16(*p0, 0x9876); +} + +void testEqualUint16sWhenThereAreDifferencesOutside16Bits(void) +{ + TEST_ASSERT_EQUAL_UINT16(0x54321,0x64321); + TEST_ASSERT_EQUAL_UINT16(0xFFFF4321,0x00004321); +} + +void testEqualUint32s(void) +{ + _UU32 v0, v1; + _UU32 *p0, *p1; + + v0 = 0x98760000; + v1 = 0x98760000; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT32(0x98760000, 0x98760000); + TEST_ASSERT_EQUAL_UINT32(v0, v1); + TEST_ASSERT_EQUAL_UINT32(0x98760000, v1); + TEST_ASSERT_EQUAL_UINT32(v0, 0x98760000); + TEST_ASSERT_EQUAL_UINT32(*p0, v1); + TEST_ASSERT_EQUAL_UINT32(*p0, *p1); + TEST_ASSERT_EQUAL_UINT32(*p0, 0x98760000); +} + +void testNotEqual(void) +{ + TEST_ASSERT_NOT_EQUAL(0, 1); + TEST_ASSERT_NOT_EQUAL(1, 0); + TEST_ASSERT_NOT_EQUAL(100, 101); + TEST_ASSERT_NOT_EQUAL(0, -1); + TEST_ASSERT_NOT_EQUAL(65535, -65535); + TEST_ASSERT_NOT_EQUAL(75, 900); + TEST_ASSERT_NOT_EQUAL(-100, -101); +} + +void testEqualHex8s(void) +{ + _UU8 v0, v1; + _UU8 *p0, *p1; + + v0 = 0x22; + v1 = 0x22; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_HEX8(0x22, 0x22); + TEST_ASSERT_EQUAL_HEX8(v0, v1); + TEST_ASSERT_EQUAL_HEX8(0x22, v1); + TEST_ASSERT_EQUAL_HEX8(v0, 0x22); + TEST_ASSERT_EQUAL_HEX8(*p0, v1); + TEST_ASSERT_EQUAL_HEX8(*p0, *p1); + TEST_ASSERT_EQUAL_HEX8(*p0, 0x22); +} + +void testEqualHex8sWhenThereAreDifferencesOutside8Bits(void) +{ + TEST_ASSERT_EQUAL_HEX8(0x321,0x421); + TEST_ASSERT_EQUAL_HEX8(0xFF21,0x0021); +} + +void testEqualHex8sNegatives(void) +{ + _UU8 v0, v1; + _UU8 *p0, *p1; + + v0 = 0xDD; + v1 = 0xDD; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_HEX8(0xDD, 0xDD); + TEST_ASSERT_EQUAL_HEX8(v0, v1); + TEST_ASSERT_EQUAL_HEX8(0xDD, v1); + TEST_ASSERT_EQUAL_HEX8(v0, 0xDD); + TEST_ASSERT_EQUAL_HEX8(*p0, v1); + TEST_ASSERT_EQUAL_HEX8(*p0, *p1); + TEST_ASSERT_EQUAL_HEX8(*p0, 0xDD); +} + +void testEqualHex16s(void) +{ + _UU16 v0, v1; + _UU16 *p0, *p1; + + v0 = 0x9876; + v1 = 0x9876; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_HEX16(0x9876, 0x9876); + TEST_ASSERT_EQUAL_HEX16(v0, v1); + TEST_ASSERT_EQUAL_HEX16(0x9876, v1); + TEST_ASSERT_EQUAL_HEX16(v0, 0x9876); + TEST_ASSERT_EQUAL_HEX16(*p0, v1); + TEST_ASSERT_EQUAL_HEX16(*p0, *p1); + TEST_ASSERT_EQUAL_HEX16(*p0, 0x9876); +} + +void testEqualHex16sWhenThereAreDifferencesOutside16Bits(void) +{ + TEST_ASSERT_EQUAL_HEX16(0x54321,0x64321); + TEST_ASSERT_EQUAL_HEX16(0xFFFF4321,0x00004321); +} + +void testEqualHex32s(void) +{ + _UU32 v0, v1; + _UU32 *p0, *p1; + + v0 = 0x98765432ul; + v1 = 0x98765432ul; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_HEX32(0x98765432ul, 0x98765432ul); + TEST_ASSERT_EQUAL_HEX32(v0, v1); + TEST_ASSERT_EQUAL_HEX32(0x98765432ul, v1); + TEST_ASSERT_EQUAL_HEX32(v0, 0x98765432ul); + TEST_ASSERT_EQUAL_HEX32(*p0, v1); + TEST_ASSERT_EQUAL_HEX32(*p0, *p1); + TEST_ASSERT_EQUAL_HEX32(*p0, 0x98765432ul); +} + +void testEqualBits(void) +{ + _UU32 v0 = 0xFF55AA00; + _UU32 v1 = 0x55550000; + + TEST_ASSERT_BITS(v1, v0, 0x55550000); + TEST_ASSERT_BITS(v1, v0, 0xFF55CC00); + TEST_ASSERT_BITS(0xFFFFFFFF, v0, 0xFF55AA00); + TEST_ASSERT_BITS(0xFFFFFFFF, v0, v0); + TEST_ASSERT_BITS(0xF0F0F0F0, v0, 0xFC5DAE0F); + TEST_ASSERT_BITS_HIGH(v1, v0); + TEST_ASSERT_BITS_LOW(0x000055FF, v0); + TEST_ASSERT_BIT_HIGH(30, v0); + TEST_ASSERT_BIT_LOW(5, v0); +} + +void testNotEqualBitHigh(void) +{ + _UU32 v0 = 0x7F55AA00; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BIT_HIGH(31, v0); + VERIFY_FAILS_END +} + +void testNotEqualBitLow(void) +{ + _UU32 v0 = 0xFF55AA00; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BIT_LOW(30, v0); + VERIFY_FAILS_END +} + +void testNotEqualBitsHigh(void) +{ + _UU32 v0 = 0xFF55AA00; + _UU32 v1 = 0x55550000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BITS_HIGH(v0, v1); + VERIFY_FAILS_END + +} + +void testNotEqualBitsLow(void) +{ + _UU32 v0 = 0xFF55AA00; + _UU32 v1 = 0x55550000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_BITS_LOW(v0, v1); + VERIFY_FAILS_END + +} +void testEqualShorts(void) +{ + short v0, v1; + short *p0, *p1; + + v0 = 19467; + v1 = 19467; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT(1837, 1837); + TEST_ASSERT_EQUAL_INT(-2987, -2987); + TEST_ASSERT_EQUAL_INT(v0, v1); + TEST_ASSERT_EQUAL_INT(19467, v1); + TEST_ASSERT_EQUAL_INT(v0, 19467); + TEST_ASSERT_EQUAL_INT(*p0, v1); + TEST_ASSERT_EQUAL_INT(*p0, *p1); + TEST_ASSERT_EQUAL_INT(*p0, 19467); +} + +void testEqualUShorts(void) +{ + unsigned short v0, v1; + unsigned short *p0, *p1; + + v0 = 19467; + v1 = 19467; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT(1837, 1837); + TEST_ASSERT_EQUAL_UINT(2987, 2987); + TEST_ASSERT_EQUAL_UINT(v0, v1); + TEST_ASSERT_EQUAL_UINT(19467, v1); + TEST_ASSERT_EQUAL_UINT(v0, 19467); + TEST_ASSERT_EQUAL_UINT(*p0, v1); + TEST_ASSERT_EQUAL_UINT(*p0, *p1); + TEST_ASSERT_EQUAL_UINT(*p0, 19467); +} + +void testEqualChars(void) +{ + signed char v0, v1; + signed char *p0, *p1; + + v0 = 109; + v1 = 109; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT(42, 42); + TEST_ASSERT_EQUAL_INT(-116, -116); + TEST_ASSERT_EQUAL_INT(v0, v1); + TEST_ASSERT_EQUAL_INT(109, v1); + TEST_ASSERT_EQUAL_INT(v0, 109); + TEST_ASSERT_EQUAL_INT(*p0, v1); + TEST_ASSERT_EQUAL_INT(*p0, *p1); + TEST_ASSERT_EQUAL_INT(*p0, 109); +} + +void testEqualUChars(void) +{ + unsigned char v0, v1; + unsigned char *p0, *p1; + + v0 = 251; + v1 = 251; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT(42, 42); + TEST_ASSERT_EQUAL_INT(v0, v1); + TEST_ASSERT_EQUAL_INT(251, v1); + TEST_ASSERT_EQUAL_INT(v0, 251); + TEST_ASSERT_EQUAL_INT(*p0, v1); + TEST_ASSERT_EQUAL_INT(*p0, *p1); + TEST_ASSERT_EQUAL_INT(*p0, 251); +} + +void testEqualPointers(void) +{ + int v0, v1; + int *p0, *p1, *p2; + + v0 = 19467; + v1 = 18271; + p0 = &v0; + p1 = &v1; + p2 = &v1; + + TEST_ASSERT_EQUAL_PTR(p0, &v0); + TEST_ASSERT_EQUAL_PTR(&v1, p1); + TEST_ASSERT_EQUAL_PTR(p2, p1); + TEST_ASSERT_EQUAL_PTR(&v0, &v0); +} + +void testNotEqualPointers(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_PTR(0x12345678, 0x12345677); + VERIFY_FAILS_END +} + +void testIntsWithinDelta(void) +{ + TEST_ASSERT_INT_WITHIN(1, 5000, 5001); + TEST_ASSERT_INT_WITHIN(5, 5000, 4996); + TEST_ASSERT_INT_WITHIN(5, 5000, 5005); + TEST_ASSERT_INT_WITHIN(500, 50, -440); + + TEST_ASSERT_INT_WITHIN(2, -1, -1); + TEST_ASSERT_INT_WITHIN(5, 1, -1); + TEST_ASSERT_INT_WITHIN(5, -1, 1); +} + +void testIntsWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_INT_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); + TEST_ASSERT_INT_WITHIN_MESSAGE(5, 5000, 4996, "Custom Message."); + TEST_ASSERT_INT_WITHIN_MESSAGE(5, 5000, 5005, "Custom Message."); + TEST_ASSERT_INT_WITHIN_MESSAGE(500, 50, -440, "Custom Message."); + + TEST_ASSERT_INT_WITHIN_MESSAGE(2, -1, -1, "Custom Message."); + TEST_ASSERT_INT_WITHIN_MESSAGE(5, 1, -1, "Custom Message."); + TEST_ASSERT_INT_WITHIN_MESSAGE(5, -1, 1, "Custom Message."); +} + +void testIntsNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT_WITHIN(5, 5000, 5006); + VERIFY_FAILS_END +} + +void testIntsNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT_WITHIN_MESSAGE(5, 5000, 5006, "Custom Message."); + VERIFY_FAILS_END +} + +void testUIntsWithinDelta(void) +{ + TEST_ASSERT_UINT_WITHIN(1, 5000, 5001); + TEST_ASSERT_UINT_WITHIN(5, 5000, 4996); + TEST_ASSERT_UINT_WITHIN(5, 5000, 5005); +} + +void testUIntsWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_UINT_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); + TEST_ASSERT_UINT_WITHIN_MESSAGE(5, 5000, 4996, "Custom Message."); + TEST_ASSERT_UINT_WITHIN_MESSAGE(5, 5000, 5005, "Custom Message."); +} + +void testUIntsNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT_WITHIN(1, 2147483647u, 2147483649u); + VERIFY_FAILS_END +} + +void testUIntsNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT_WITHIN_MESSAGE(1, 2147483647u, 2147483649u, "Custom Message."); + VERIFY_FAILS_END +} + +void testUIntsNotWithinDeltaEvenThoughASignedIntWouldPassSmallFirst(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT_WITHIN(5, 1, -1); + VERIFY_FAILS_END +} + +void testUIntsNotWithinDeltaEvenThoughASignedIntWouldPassSmallFirstAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT_WITHIN_MESSAGE(5, 1, -1, "Custom Message."); + VERIFY_FAILS_END +} + +void testUIntsNotWithinDeltaEvenThoughASignedIntWouldPassBigFirst(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT_WITHIN(5, -1, 1); + VERIFY_FAILS_END +} + +void testUIntsNotWithinDeltaEvenThoughASignedIntWouldPassBigFirstAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT_WITHIN_MESSAGE(5, -1, 1, "Custom Message."); + VERIFY_FAILS_END +} + +void testHEX32sWithinDelta(void) +{ + TEST_ASSERT_HEX32_WITHIN(1, 5000, 5001); + TEST_ASSERT_HEX32_WITHIN(5, 5000, 4996); + TEST_ASSERT_HEX32_WITHIN(5, 5000, 5005); +} + +void testHEX32sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_HEX32_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); + TEST_ASSERT_HEX32_WITHIN_MESSAGE(5, 5000, 4996, "Custom Message."); + TEST_ASSERT_HEX32_WITHIN_MESSAGE(5, 5000, 5005, "Custom Message."); +} + +void testHEX32sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX32_WITHIN(1, 2147483647u, 2147483649u); + VERIFY_FAILS_END +} + +void testHEX32sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX32_WITHIN_MESSAGE(1, 2147483647u, 2147483649u, "Custom Message."); + VERIFY_FAILS_END +} + +void testHEX32sNotWithinDeltaEvenThoughASignedIntWouldPass(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX32_WITHIN(5, 1, -1); + VERIFY_FAILS_END +} + +void testHEX32sNotWithinDeltaEvenThoughASignedIntWouldPassAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX32_WITHIN_MESSAGE(5, 1, -1, "Custom Message."); + VERIFY_FAILS_END +} + +void testHEX16sWithinDelta(void) +{ + TEST_ASSERT_HEX16_WITHIN(1, 5000, 5001); + TEST_ASSERT_HEX16_WITHIN(5, 5000, 4996); + TEST_ASSERT_HEX16_WITHIN(5, 5000, 5005); +} + +void testHEX16sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_HEX16_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); + TEST_ASSERT_HEX16_WITHIN_MESSAGE(5, 5000, 4996, "Custom Message."); + TEST_ASSERT_HEX16_WITHIN_MESSAGE(5, 5000, 5005, "Custom Message."); +} + +void testHEX16sWithinDeltaWhenThereAreDifferenceOutsideOf16Bits(void) +{ + TEST_ASSERT_HEX16_WITHIN(5, 0x54321, 0x44321); +} + +void testHEX16sWithinDeltaWhenThereAreDifferenceOutsideOf16BitsAndCustomMessage(void) +{ + TEST_ASSERT_HEX16_WITHIN_MESSAGE(5, 0x54321, 0x44321, "Custom Message."); +} + +void testHEX16sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX16_WITHIN(2, 65535, 0); + VERIFY_FAILS_END +} + +void testHEX16sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX16_WITHIN_MESSAGE(2, 65535, 0, "Custom Message."); + VERIFY_FAILS_END +} + +void testHEX8sWithinDelta(void) +{ + TEST_ASSERT_HEX8_WITHIN(1, 254, 255); + TEST_ASSERT_HEX8_WITHIN(5, 251, 255); + TEST_ASSERT_HEX8_WITHIN(5, 1, 4); +} + +void testHEX8sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_HEX8_WITHIN_MESSAGE(1, 254, 255, "Custom Message."); + TEST_ASSERT_HEX8_WITHIN_MESSAGE(5, 251, 255, "Custom Message."); + TEST_ASSERT_HEX8_WITHIN_MESSAGE(5, 1, 4, "Custom Message."); +} + +void testHEX8sWithinDeltaWhenThereAreDifferenceOutsideOf8Bits(void) +{ + TEST_ASSERT_HEX8_WITHIN(5, 0x123, 0xF23); +} + +void testHEX8sWithinDeltaWhenThereAreDifferenceOutsideOf8BitsAndCustomMessage(void) +{ + TEST_ASSERT_HEX8_WITHIN_MESSAGE(5, 0x123, 0xF23, "Custom Message."); +} + +void testHEX8sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX8_WITHIN(2, 255, 0); + VERIFY_FAILS_END +} + +void testHEX8sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX8_WITHIN_MESSAGE(2, 255, 0, "Custom Message."); + VERIFY_FAILS_END +} + +//----------------- + +void testUINT32sWithinDelta(void) +{ + TEST_ASSERT_UINT32_WITHIN(1, 5000, 5001); + TEST_ASSERT_UINT32_WITHIN(5, 5000, 4996); + TEST_ASSERT_UINT32_WITHIN(5, 5000, 5005); +} + +void testUINT32sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_UINT32_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); + TEST_ASSERT_UINT32_WITHIN_MESSAGE(5, 5000, 4996, "Custom Message."); + TEST_ASSERT_UINT32_WITHIN_MESSAGE(5, 5000, 5005, "Custom Message."); +} + +void testUINT32sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT32_WITHIN(1, 2147483647u, 2147483649u); + VERIFY_FAILS_END +} + +void testUINT32sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT32_WITHIN_MESSAGE(1, 2147483647u, 2147483649u, "Custom Message."); + VERIFY_FAILS_END +} + +void testUINT32sNotWithinDeltaEvenThoughASignedIntWouldPass(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT32_WITHIN(5, 1, -1); + VERIFY_FAILS_END +} + +void testUINT32sNotWithinDeltaEvenThoughASignedIntWouldPassAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT32_WITHIN_MESSAGE(5, 1, -1, "Custom Message."); + VERIFY_FAILS_END +} + +void testUINT16sWithinDelta(void) +{ + TEST_ASSERT_UINT16_WITHIN(1, 5000, 5001); + TEST_ASSERT_UINT16_WITHIN(5, 5000, 4996); + TEST_ASSERT_UINT16_WITHIN(5, 5000, 5005); +} + +void testUINT16sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_UINT16_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); + TEST_ASSERT_UINT16_WITHIN_MESSAGE(5, 5000, 4996, "Custom Message."); + TEST_ASSERT_UINT16_WITHIN_MESSAGE(5, 5000, 5005, "Custom Message."); +} + +void testUINT16sWithinDeltaWhenThereAreDifferenceOutsideOf16Bits(void) +{ + TEST_ASSERT_UINT16_WITHIN(5, 0x54321, 0x44321); +} + +void testUINT16sWithinDeltaWhenThereAreDifferenceOutsideOf16BitsAndCustomMessage(void) +{ + TEST_ASSERT_UINT16_WITHIN_MESSAGE(5, 0x54321, 0x44321, "Custom Message."); +} + +void testUINT16sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT16_WITHIN(2, 65535, 0); + VERIFY_FAILS_END +} + +void testUINT16sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT16_WITHIN_MESSAGE(2, 65535, 0, "Custom Message."); + VERIFY_FAILS_END +} + +void testUINT8sWithinDelta(void) +{ + TEST_ASSERT_UINT8_WITHIN(1, 254, 255); + TEST_ASSERT_UINT8_WITHIN(5, 251, 255); + TEST_ASSERT_UINT8_WITHIN(5, 1, 4); +} + +void testUINT8sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_UINT8_WITHIN_MESSAGE(1, 254, 255, "Custom Message."); + TEST_ASSERT_UINT8_WITHIN_MESSAGE(5, 251, 255, "Custom Message."); + TEST_ASSERT_UINT8_WITHIN_MESSAGE(5, 1, 4, "Custom Message."); +} + +void testUINT8sWithinDeltaWhenThereAreDifferenceOutsideOf8Bits(void) +{ + TEST_ASSERT_UINT8_WITHIN(5, 0x123, 0xF23); +} + +void testUINT8sWithinDeltaWhenThereAreDifferenceOutsideOf8BitsAndCustomMessage(void) +{ + TEST_ASSERT_UINT8_WITHIN_MESSAGE(5, 0x123, 0xF23, "Custom Message."); +} + +void testUINT8sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT8_WITHIN(2, 255, 0); + VERIFY_FAILS_END +} + +void testUINT8sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT8_WITHIN_MESSAGE(2, 255, 0, "Custom Message."); + VERIFY_FAILS_END +} + +void testINT32sWithinDelta(void) +{ + TEST_ASSERT_INT32_WITHIN(1, 5000, 5001); + TEST_ASSERT_INT32_WITHIN(5, 1, -2); + TEST_ASSERT_INT32_WITHIN(5, -2, 1); +} + +void testINT32sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_INT32_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); +} + +void testINT32sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT32_WITHIN(1, -3, 1); + VERIFY_FAILS_END +} + +void testINT32sNotWithinDeltaAndDifferenceOverflows(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT32_WITHIN(1, -1, 0x7FFFFFFF); + VERIFY_FAILS_END +} +void testINT32sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT32_WITHIN_MESSAGE(1, -2, 1, "Custom Message."); + VERIFY_FAILS_END +} + +void testINT16sWithinDelta(void) +{ + TEST_ASSERT_INT16_WITHIN(1, 5000, 5001); + TEST_ASSERT_INT16_WITHIN(5, 2, -2); + TEST_ASSERT_INT16_WITHIN(5, -2, 2); +} + +void testINT16sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_INT16_WITHIN_MESSAGE(1, 5000, 5001, "Custom Message."); +} + +void testINT16sWithinDeltaWhenThereAreDifferenceOutsideOf16Bits(void) +{ + TEST_ASSERT_INT16_WITHIN(5, 0x54321, 0x44321); +} + +void testINT16sWithinDeltaWhenThereAreDifferenceOutsideOf16BitsAndCustomMessage(void) +{ + TEST_ASSERT_INT16_WITHIN_MESSAGE(5, 0x54321, 0x44321, "Custom Message."); +} + +void testINT16sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT16_WITHIN(2, 4, -2); + VERIFY_FAILS_END +} + +void testINT16sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT16_WITHIN_MESSAGE(2, 3, 0, "Custom Message."); + VERIFY_FAILS_END +} + +void testINT8sWithinDelta(void) +{ + TEST_ASSERT_INT8_WITHIN(1, 127, 126); + TEST_ASSERT_INT8_WITHIN(5, -2, 2); + TEST_ASSERT_INT8_WITHIN(5, 2, -2); +} + +void testINT8sWithinDeltaAndCustomMessage(void) +{ + TEST_ASSERT_INT8_WITHIN_MESSAGE(5, 1, 4, "Custom Message."); +} + +void testINT8sWithinDeltaWhenThereAreDifferenceOutsideOf8Bits(void) +{ + TEST_ASSERT_INT8_WITHIN(5, 0x123, 0xF23); +} + +void testINT8sWithinDeltaWhenThereAreDifferenceOutsideOf8BitsAndCustomMessage(void) +{ + TEST_ASSERT_INT8_WITHIN_MESSAGE(5, 0x123, 0xF23, "Custom Message."); +} + +void testINT8sNotWithinDelta(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT8_WITHIN(2, -3, 0); + VERIFY_FAILS_END +} + +void testINT8sNotWithinDeltaAndCustomMessage(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT8_WITHIN_MESSAGE(2, -4, 0, "Custom Message."); + VERIFY_FAILS_END +} + +void testEqualStrings(void) +{ + const char *testString = "foo"; + + TEST_ASSERT_EQUAL_STRING(testString, testString); + TEST_ASSERT_EQUAL_STRING_MESSAGE("foo", "foo", "foo isn't foo"); + TEST_ASSERT_EQUAL_STRING("foo", testString); + TEST_ASSERT_EQUAL_STRING(testString, "foo"); + TEST_ASSERT_EQUAL_STRING("", ""); +} + +void testEqualStringsLen(void) +{ + const char *testString = "foobar"; + TEST_ASSERT_EQUAL_STRING_LEN(testString, testString, strlen(testString)); + TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE("foobar", "foobaz", 5, "fooba isn't fooba"); + TEST_ASSERT_EQUAL_STRING_LEN("foo", testString, 3); + TEST_ASSERT_EQUAL_STRING_LEN(testString, "foo", 3); + TEST_ASSERT_EQUAL_STRING_LEN("", "", 3); +} + +void testEqualStringsWithCarriageReturnsAndLineFeeds(void) +{ + const char *testString = "foo\r\nbar"; + + TEST_ASSERT_EQUAL_STRING(testString, testString); + TEST_ASSERT_EQUAL_STRING("foo\r\nbar", "foo\r\nbar"); + TEST_ASSERT_EQUAL_STRING("foo\r\nbar", testString); + TEST_ASSERT_EQUAL_STRING(testString, "foo\r\nbar"); + TEST_ASSERT_EQUAL_STRING("", ""); +} + +void testNotEqualString1(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING("foo", "bar"); + VERIFY_FAILS_END +} + +void testNotEqualStringLen1(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_LEN("foobar", "foobaz", 6); + VERIFY_FAILS_END +} + +void testNotEqualString2(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING("foo", ""); + VERIFY_FAILS_END +} + +void testNotEqualStringLen2(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_LEN("foo", "", 3); + VERIFY_FAILS_END +} + +void testNotEqualString3(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING("", "bar"); + VERIFY_FAILS_END +} + +void testNotEqualStringLen3(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_LEN("", "bar", 3); + VERIFY_FAILS_END +} + +void testNotEqualString4(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING("bar\r", "bar\n"); + VERIFY_FAILS_END +} + +void testNotEqualStringLen4(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_LEN("\r\x16", "bar\n", 4); + VERIFY_FAILS_END +} + +void testNotEqualString5(void) +{ + const char str1[] = { 0x41, 0x42, 0x03, 0x00 }; + const char str2[] = { 0x41, 0x42, 0x04, 0x00 }; + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING(str1, str2); + VERIFY_FAILS_END +} + +void testNotEqualString_ExpectedStringIsNull(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING(NULL, "bar"); + VERIFY_FAILS_END +} + +void testNotEqualStringLen_ExpectedStringIsNull(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_LEN(NULL, "bar", 1); + VERIFY_FAILS_END +} + +void testNotEqualString_ActualStringIsNull(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING("foo", NULL); + VERIFY_FAILS_END +} + +void testNotEqualStringLen_ActualStringIsNull(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_LEN("foo", NULL, 1); + VERIFY_FAILS_END +} + +void testEqualStringArrays(void) +{ + const char *testStrings[] = { "foo", "boo", "woo", "moo" }; + const char *expStrings[] = { "foo", "boo", "woo", "zoo" }; + + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, expStrings, 3); + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 3); + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 2); + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 1); +} + +void testNotEqualStringArray1(void) +{ + const char *testStrings[] = { "foo", "boo", "woo", "moo" }; + const char *expStrings[] = { "foo", "boo", "woo", "zoo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringArray2(void) +{ + const char *testStrings[] = { "zoo", "boo", "woo", "moo" }; + const char *expStrings[] = { "foo", "boo", "woo", "moo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringArray3(void) +{ + const char *testStrings[] = { "foo", "boo", "woo", NULL }; + const char *expStrings[] = { "foo", "boo", "woo", "zoo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringArray4(void) +{ + const char *testStrings[] = { "foo", "boo", "woo", "moo" }; + const char *expStrings[] = { "foo", NULL, "woo", "moo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringArray5(void) +{ + const char **testStrings = NULL; + const char *expStrings[] = { "foo", "boo", "woo", "zoo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringArray6(void) +{ + const char *testStrings[] = { "foo", "boo", "woo", "zoo" }; + const char **expStrings = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 4); + VERIFY_FAILS_END +} + +void testEqualStringArrayIfBothNulls(void) +{ + const char **testStrings = NULL; + const char **expStrings = NULL; + + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 4); +} + +void testNotEqualStringArrayLengthZero(void) +{ + const char *testStrings[] = {NULL}; + const char **expStrings = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_ARRAY(expStrings, testStrings, 0); + VERIFY_FAILS_END +} + +void testEqualMemory(void) +{ + const char *testString = "whatever"; + + TEST_ASSERT_EQUAL_MEMORY(testString, testString, 8); + TEST_ASSERT_EQUAL_MEMORY("whatever", "whatever", 8); + TEST_ASSERT_EQUAL_MEMORY("whatever", testString, 8); + TEST_ASSERT_EQUAL_MEMORY(testString, "whatever", 8); + TEST_ASSERT_EQUAL_MEMORY(testString, "whatever", 2); + TEST_ASSERT_EQUAL_MEMORY(NULL, NULL, 1); +} + +void testNotEqualMemory1(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY("foo", "bar", 3); + VERIFY_FAILS_END +} + +void testNotEqualMemory2(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY("fool", "food", 4); + VERIFY_FAILS_END +} + +void testNotEqualMemory3(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY(NULL, "food", 4); + VERIFY_FAILS_END +} + +void testNotEqualMemory4(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY("fool", NULL, 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryLengthZero(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY(NULL, NULL, 0); + VERIFY_FAILS_END +} + +void testEqualIntArrays(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2}; + int p2[] = {1, 8, 987, 2}; + int p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p3, 1); + TEST_ASSERT_EQUAL_INT_ARRAY(NULL, NULL, 1); +} + +void testNotEqualIntArraysNullExpected(void) +{ + int* p0 = NULL; + int p1[] = {1, 8, 987, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntArraysNullActual(void) +{ + int* p1 = NULL; + int p0[] = {1, 8, 987, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntArrays1(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntArrays2(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {2, 8, 987, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntArrays3(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 986, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntArraysLengthZero(void) +{ + _UU32 p0[1] = {1}; + _UU32 p1[1] = {1}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 0); + VERIFY_FAILS_END +} + +void testEqualPtrArrays(void) +{ + char A = 1; + char B = 2; + char C = 3; + char* p0[] = {&A, &B, &C}; + char* p1[] = {&A, &B, &C, &A}; + char* p2[] = {&A, &B}; + char* p3[] = {&A}; + + TEST_ASSERT_EQUAL_PTR_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_PTR_ARRAY(p0, p0, 3); + TEST_ASSERT_EQUAL_PTR_ARRAY(p0, p1, 3); + TEST_ASSERT_EQUAL_PTR_ARRAY(p1, p2, 2); + TEST_ASSERT_EQUAL_PTR_ARRAY(p3, p0, 1); +} + +void testNotEqualPtrArraysNullExpected(void) +{ + char A = 1; + char B = 2; + char** p0 = NULL; + char* p1[] = {&A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_PTR_ARRAY(p0, p1, 2); + VERIFY_FAILS_END +} + +void testNotEqualPtrArraysNullActual(void) +{ + char A = 1; + char B = 2; + char** p0 = NULL; + char* p1[] = {&A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_PTR_ARRAY(p1, p0, 2); + VERIFY_FAILS_END +} + +void testNotEqualPtrArrays1(void) +{ + char A = 1; + char B = 2; + char C = 3; + char* p0[] = {&A, &B, &C, &B}; + char* p1[] = {&A, &B, &C, &A}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_PTR_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualPtrArrays2(void) +{ + char A = 1; + char B = 2; + char C = 3; + char* p0[] = {&B, &B, &C, &A}; + char* p1[] = {&A, &B, &C, &A}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_PTR_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualPtrArrays3(void) +{ + char A = 1; + char B = 2; + char C = 3; + char* p0[] = {&A, &B, &B, &A}; + char* p1[] = {&A, &B, &C, &A}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_PTR_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualInt8Arrays(void) +{ + _US8 p0[] = {1, 8, 117, -2}; + _US8 p1[] = {1, 8, 117, -2}; + _US8 p2[] = {1, 8, 117, 2}; + _US8 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p3, 1); +} + +void testNotEqualInt8Arrays(void) +{ + _US8 p0[] = {1, 8, 36, -2}; + _US8 p1[] = {1, 8, 36, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualUIntArrays(void) +{ + unsigned int p0[] = {1, 8, 987, 65132u}; + unsigned int p1[] = {1, 8, 987, 65132u}; + unsigned int p2[] = {1, 8, 987, 2}; + unsigned int p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p3, 1); +} + +void testNotEqualUIntArrays1(void) +{ + unsigned int p0[] = {1, 8, 987, 65132u}; + unsigned int p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUIntArrays2(void) +{ + unsigned int p0[] = {1, 8, 987, 65132u}; + unsigned int p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUIntArrays3(void) +{ + unsigned int p0[] = {1, 8, 987, 65132u}; + unsigned int p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualInt16Arrays(void) +{ + _US16 p0[] = {1, 8, 117, 3}; + _US16 p1[] = {1, 8, 117, 3}; + _US16 p2[] = {1, 8, 117, 2}; + _US16 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p3, 1); +} + +void testNotEqualInt16Arrays(void) +{ + _US16 p0[] = {1, 8, 127, 3}; + _US16 p1[] = {1, 8, 127, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualInt32Arrays(void) +{ + _US32 p0[] = {1, 8, 117, 3}; + _US32 p1[] = {1, 8, 117, 3}; + _US32 p2[] = {1, 8, 117, 2}; + _US32 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p3, 1); +} + +void testNotEqualInt32Arrays(void) +{ + _US32 p0[] = {1, 8, 127, 3}; + _US32 p1[] = {1, 8, 127, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualUINT8Arrays(void) +{ + _UU8 p0[] = {1, 8, 100, 127}; + _UU8 p1[] = {1, 8, 100, 127}; + _UU8 p2[] = {1, 8, 100, 2}; + _UU8 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p3, 1); +} + +void testNotEqualUINT8Arrays1(void) +{ + unsigned char p0[] = {1, 8, 100, 127u}; + unsigned char p1[] = {1, 8, 100, 255u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8Arrays2(void) +{ + unsigned char p0[] = {1, 8, 100, 127u}; + unsigned char p1[] = {1, 8, 100, 255u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8Arrays3(void) +{ + unsigned char p0[] = {1, 8, 100, 127u}; + unsigned char p1[] = {1, 8, 100, 255u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + + +void testEqualUINT16Arrays(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {1, 8, 987, 65132u}; + unsigned short p2[] = {1, 8, 987, 2}; + unsigned short p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p3, 1); +} + +void testNotEqualUINT16Arrays1(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT16Arrays2(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT16Arrays3(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT16_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualUINT32Arrays(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65132u}; + _UU32 p2[] = {1, 8, 987, 2}; + _UU32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p3, 1); +} + +void testNotEqualUINT32Arrays1(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32Arrays2(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32Arrays3(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualHEXArrays(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65132u}; + _UU32 p2[] = {1, 8, 987, 2}; + _UU32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_HEX_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_HEX_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_HEX_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p3, 1); +} + +void testNotEqualHEXArrays1(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEXArrays2(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEXArrays3(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualHEX32Arrays(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65132u}; + _UU32 p2[] = {1, 8, 987, 2}; + _UU32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p3, 1); +} + +void testNotEqualHEX32Arrays1(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32Arrays2(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32Arrays3(void) +{ + _UU32 p0[] = {1, 8, 987, 65132u}; + _UU32 p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualHEX16Arrays(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {1, 8, 987, 65132u}; + unsigned short p2[] = {1, 8, 987, 2}; + unsigned short p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p3, 1); +} + +void testNotEqualHEX16Arrays1(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX16Arrays2(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX16Arrays3(void) +{ + unsigned short p0[] = {1, 8, 987, 65132u}; + unsigned short p1[] = {1, 8, 986, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX16_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualHEX8Arrays(void) +{ + unsigned short p0[] = {1, 8, 254u, 123}; + unsigned short p1[] = {1, 8, 254u, 123}; + unsigned short p2[] = {1, 8, 254u, 2}; + unsigned short p3[] = {1, 23, 25, 26}; + + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p3, 1); +} + +void testNotEqualHEX8Arrays1(void) +{ + unsigned char p0[] = {1, 8, 254u, 253u}; + unsigned char p1[] = {1, 8, 254u, 252u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX8Arrays2(void) +{ + unsigned char p0[] = {1, 8, 254u, 253u}; + unsigned char p1[] = {2, 8, 254u, 253u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX8Arrays3(void) +{ + unsigned char p0[] = {1, 8, 254u, 253u}; + unsigned char p1[] = {1, 8, 255u, 253u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +} + +void testEqualMemoryArrays(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2}; + int p2[] = {1, 8, 987, 2}; + int p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p0, sizeof(int), 1); + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p0, sizeof(int), 4); + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p1, sizeof(int), 4); + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p2, sizeof(int), 3); + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p3, sizeof(int), 1); +} + +void testNotEqualMemoryArraysExpectedNull(void) +{ + int* p0 = NULL; + int p1[] = {1, 8, 987, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryArraysActualNull(void) +{ + int p0[] = {1, 8, 987, -2}; + int* p1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryArrays1(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryArrays2(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {2, 8, 987, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryArrays3(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 986, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_MEMORY_ARRAY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testProtection(void) +{ + volatile int mask = 0; + + if (TEST_PROTECT()) + { + mask |= 1; + TEST_ABORT(); + } + else + { + Unity.CurrentTestFailed = 0; + mask |= 2; + } + + TEST_ASSERT_EQUAL(3, mask); +} + +void testIgnoredAndThenFailInTearDown(void) +{ + SetToOneToFailInTearDown = 1; + TEST_IGNORE(); +} + +// Tricky series of macros to set USING_OUTPUT_SPY +#define USING_SPY_AS(a) EXPAND_AND_USE_2ND(ASSIGN_VALUE(a), 0) +#define ASSIGN_VALUE(a) VAL_##a +#define VAL_putcharSpy 0, 1 +#define EXPAND_AND_USE_2ND(a, b) SECOND_PARAM(a, b, throwaway) +#define SECOND_PARAM(a, b, ...) b +#if USING_SPY_AS(UNITY_OUTPUT_CHAR) + #define USING_OUTPUT_SPY // true only if UNITY_OUTPUT_CHAR = putcharSpy +#endif + +#ifdef USING_OUTPUT_SPY +#include <stdio.h> +#define SPY_BUFFER_MAX 40 +static char putcharSpyBuffer[SPY_BUFFER_MAX]; +#endif +static int indexSpyBuffer; +static int putcharSpyEnabled; + +void startPutcharSpy(void) {indexSpyBuffer = 0; putcharSpyEnabled = 1;} + +void endPutcharSpy(void) {putcharSpyEnabled = 0;} + +char* getBufferPutcharSpy(void) +{ +#ifdef USING_OUTPUT_SPY + putcharSpyBuffer[indexSpyBuffer] = '\0'; + return putcharSpyBuffer; +#else + return NULL; +#endif +} + +void putcharSpy(int c) +{ +#ifdef USING_OUTPUT_SPY + if (putcharSpyEnabled) + { + if (indexSpyBuffer < SPY_BUFFER_MAX - 1) + putcharSpyBuffer[indexSpyBuffer++] = (char)c; + } else + c = putchar(c); +#endif +} + +void testFailureCountIncrementsAndIsReturnedAtEnd(void) +{ + Unity.CurrentTestFailed = 1; + startPutcharSpy(); // Suppress output + UnityConcludeTest(); + TEST_ASSERT_EQUAL(1, Unity.TestFailures); + + int failures = UnityEnd(); + Unity.TestFailures--; + endPutcharSpy(); + TEST_ASSERT_EQUAL(1, failures); +} + +#define TEST_ASSERT_EQUAL_PRINT_NUMBERS(expected, actual) { \ + startPutcharSpy(); UnityPrintNumber((actual)); endPutcharSpy(); \ + TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ + } + +#define TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS(expected, actual) { \ + startPutcharSpy(); UnityPrintNumberUnsigned((actual)); endPutcharSpy(); \ + TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ + } + +void testPrintNumbers32(void) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE_MESSAGE("Compile with '-D UNITY_OUTPUT_CHAR=putcharSpy' to enable print testing"); +#else + TEST_ASSERT_EQUAL_PRINT_NUMBERS("0", 0); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("1", 1); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", -1); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("2000000000", 2000000000); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-2147483648", (_US32)0x80000000); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", (_US32)0xFFFFFFFF); +#endif +} + +void testPrintNumbersUnsigned32(void) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("0", 0); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("1", 1); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("1500000000", 1500000000); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("2147483648", (_UU32)0x80000000); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("4294967295", (_UU32)0xFFFFFFFF); +#endif +} + +// ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES 64 BIT SUPPORT ================== + +void testPrintNumbersInt64(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + #ifndef USING_OUTPUT_SPY + TEST_IGNORE(); + #else + TEST_ASSERT_EQUAL_PRINT_NUMBERS("0", 0); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("10000000000", 10000000000); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-9223372036854775808", (_U_SINT)0x8000000000000000); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", (_U_SINT)0xFFFFFFFFFFFFFFFF); + #endif +#endif +} + +void testPrintNumbersUInt64(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + #ifndef USING_OUTPUT_SPY + TEST_IGNORE(); + #else + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("0", 0); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("70000000000", 70000000000); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("9223372036854775808", (_U_UINT)0x8000000000000000); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("18446744073709551615", (_U_UINT)0xFFFFFFFFFFFFFFFF); + #endif +#endif +} + +void testEqualHex64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 v0, v1; + _UU64 *p0, *p1; + + v0 = 0x9876543201234567; + v1 = 0x9876543201234567; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_HEX64(0x9876543201234567, 0x9876543201234567); + TEST_ASSERT_EQUAL_HEX64(v0, v1); + TEST_ASSERT_EQUAL_HEX64(0x9876543201234567, v1); + TEST_ASSERT_EQUAL_HEX64(v0, 0x9876543201234567); + TEST_ASSERT_EQUAL_HEX64(*p0, v1); + TEST_ASSERT_EQUAL_HEX64(*p0, *p1); + TEST_ASSERT_EQUAL_HEX64(*p0, 0x9876543201234567); +#endif +} + +void testEqualUint64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 v0, v1; + _UU64 *p0, *p1; + + v0 = 0x9876543201234567; + v1 = 0x9876543201234567; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_UINT64(0x9876543201234567, 0x9876543201234567); + TEST_ASSERT_EQUAL_UINT64(v0, v1); + TEST_ASSERT_EQUAL_UINT64(0x9876543201234567, v1); + TEST_ASSERT_EQUAL_UINT64(v0, 0x9876543201234567); + TEST_ASSERT_EQUAL_UINT64(*p0, v1); + TEST_ASSERT_EQUAL_UINT64(*p0, *p1); + TEST_ASSERT_EQUAL_UINT64(*p0, 0x9876543201234567); +#endif +} + +void testEqualInt64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 v0, v1; + _US64 *p0, *p1; + + v0 = (_US64)0x9876543201234567; + v1 = (_US64)0x9876543201234567; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_EQUAL_INT64(0x9876543201234567, 0x9876543201234567); + TEST_ASSERT_EQUAL_INT64(v0, v1); + TEST_ASSERT_EQUAL_INT64(0x9876543201234567, v1); + TEST_ASSERT_EQUAL_INT64(v0, 0x9876543201234567); + TEST_ASSERT_EQUAL_INT64(*p0, v1); + TEST_ASSERT_EQUAL_INT64(*p0, *p1); + TEST_ASSERT_EQUAL_INT64(*p0, 0x9876543201234567); +#endif +} + + +void testNotEqualHex64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 v0, v1; + + v0 = 9000000000; + v1 = 9100000000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX64(v0, v1); + VERIFY_FAILS_END +#endif +} + +void testNotEqualUint64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 v0, v1; + + v0 = 9000000000; + v1 = 9100000000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT64(v0, v1); + VERIFY_FAILS_END +#endif +} + +void testNotEqualInt64s(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 v0, v1; + + v0 = -9000000000; + v1 = 9100000000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT64(v0, v1); + VERIFY_FAILS_END +#endif +} + +void testNotEqualHex64sIfSigned(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 v0, v1; + + v0 = -9000000000; + v1 = 9000000000; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX64(v0, v1); + VERIFY_FAILS_END +#endif +} + +void testHEX64sWithinDelta(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + TEST_ASSERT_HEX64_WITHIN(1, 0x7FFFFFFFFFFFFFFF,0x7FFFFFFFFFFFFFFE); + TEST_ASSERT_HEX64_WITHIN(5, 5000, 4996); + TEST_ASSERT_HEX64_WITHIN(5, 5000, 5005); +#endif +} + +void testHEX64sNotWithinDelta(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX64_WITHIN(1, 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFC); + VERIFY_FAILS_END +#endif +} + +void testHEX64sNotWithinDeltaEvenThoughASignedIntWouldPass(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_HEX64_WITHIN(5, 1, -1); + VERIFY_FAILS_END +#endif +} + +void testUINT64sWithinDelta(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + TEST_ASSERT_UINT64_WITHIN(1, 0x7FFFFFFFFFFFFFFF,0x7FFFFFFFFFFFFFFE); + TEST_ASSERT_UINT64_WITHIN(5, 5000, 4996); + TEST_ASSERT_UINT64_WITHIN(5, 5000, 5005); +#endif +} + +void testUINT64sNotWithinDelta(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT64_WITHIN(1, 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFC); + VERIFY_FAILS_END +#endif +} + +void testUINT64sNotWithinDeltaEvenThoughASignedIntWouldPass(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_UINT64_WITHIN(5, 1, -1); + VERIFY_FAILS_END +#endif +} + +void testINT64sWithinDelta(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + TEST_ASSERT_INT64_WITHIN(1, 0x7FFFFFFFFFFFFFFF,0x7FFFFFFFFFFFFFFE); + TEST_ASSERT_INT64_WITHIN(5, 5000, 4996); + TEST_ASSERT_INT64_WITHIN(5, 5000, 5005); +#endif +} + +void testINT64sNotWithinDelta(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT64_WITHIN(1, 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFC); + VERIFY_FAILS_END +#endif +} + +void testINT64sNotWithinDeltaAndDifferenceOverflows(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_INT64_WITHIN(1, 0x8000000000000000, 0x7FFFFFFFFFFFFFFF); + VERIFY_FAILS_END +#endif +} + +void testEqualHEX64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 p0[] = {1, 8, 987, 65132u}; + _UU64 p1[] = {1, 8, 987, 65132u}; + _UU64 p2[] = {1, 8, 987, 2}; + _UU64 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p3, 1); +#endif +} + +void testEqualUint64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 p0[] = {1, 8, 987, 65132u}; + _UU64 p1[] = {1, 8, 987, 65132u}; + _UU64 p2[] = {1, 8, 987, 2}; + _UU64 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p3, 1); +#endif +} + +void testEqualInt64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 p0[] = {1, 8, 987, -65132}; + _US64 p1[] = {1, 8, 987, -65132}; + _US64 p2[] = {1, 8, 987, -2}; + _US64 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p3, 1); +#endif +} + + +void testNotEqualHEX64Arrays1(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 p0[] = {1, 8, 987, 65132u}; + _UU64 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualHEX64Arrays2(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 p0[] = {1, 8, 987, 65132u}; + _UU64 p1[] = {2, 8, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualUint64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _UU64 p0[] = {1, 8, 987, 65132u}; + _UU64 p1[] = {1, 8, 987, 65131u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualInt64Arrays(void) +{ +#ifndef UNITY_SUPPORT_64 + TEST_IGNORE(); +#else + _US64 p0[] = {1, 8, 987, -65132}; + _US64 p1[] = {1, 8, 987, -65131}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} +// ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES FLOAT SUPPORT ================== + +void testFloatsWithinDelta(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_WITHIN(0.00003f, 187245.03485f, 187245.03488f); + TEST_ASSERT_FLOAT_WITHIN(1.0f, 187245.0f, 187246.0f); + TEST_ASSERT_FLOAT_WITHIN(0.05f, 9273.2549f, 9273.2049f); + TEST_ASSERT_FLOAT_WITHIN(0.007f, -726.93724f, -726.94424f); +#endif +} + +void testFloatsNotWithinDelta(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_WITHIN(0.05f, 9273.2649f, 9273.2049f); + VERIFY_FAILS_END +#endif +} + +void testFloatsEqual(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_EQUAL_FLOAT(187245.0f, 187246.0f); + TEST_ASSERT_EQUAL_FLOAT(18724.5f, 18724.6f); + TEST_ASSERT_EQUAL_FLOAT(9273.2549f, 9273.2599f); + TEST_ASSERT_EQUAL_FLOAT(-726.93724f, -726.9374f); +#endif +} + +void testFloatsNotEqual(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(9273.9649f, 9273.0049f); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualNegative1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(-9273.9649f, -9273.0049f); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualNegative2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(-9273.0049f, -9273.9649f); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualActualNaN(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(85.963f, 0.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualExpectedNaN(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(0.0f / f_zero, 85.963f); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualBothNaN(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(0.0f / f_zero, 0.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualInfNaN(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, 0.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualNaNInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(0.0f / f_zero, 1.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualActualInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(321.642f, 1.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualExpectedInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, 321.642f); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualBothInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, 1.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatsNotEqualPlusMinusInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, -1.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatIsPosInf1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_IS_INF(2.0f / f_zero); +#endif +} + +void testFloatIsPosInf2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_NOT_INF(2.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatIsNegInf1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_IS_NEG_INF(-3.0f / f_zero); +#endif +} + +void testFloatIsNegInf2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(-3.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatIsNotPosInf1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_INF(2.0f); + VERIFY_FAILS_END +#endif +} + +void testFloatIsNotPosInf2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_IS_NOT_INF(2.0f); +#endif +} + +void testFloatIsNotNegInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_NEG_INF(-999.876f); + VERIFY_FAILS_END +#endif +} + +void testFloatIsNan1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_IS_NAN(0.0f / f_zero); +#endif +} + +void testFloatIsNan2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_NOT_NAN(0.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatIsNotNan1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_NAN(234.9f); + VERIFY_FAILS_END +#endif +} + +void testFloatIsNotNan2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_IS_NOT_NAN(234.9f); +#endif +} + +void testFloatInfIsNotNan(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_NAN(1.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatNanIsNotInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_INF(0.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatIsDeterminate1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_IS_DETERMINATE(0.0f); + TEST_ASSERT_FLOAT_IS_DETERMINATE(123.3f); + TEST_ASSERT_FLOAT_IS_DETERMINATE(-88.3f); +#endif +} + +void testFloatIsDeterminate2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(-88.3f); + VERIFY_FAILS_END +#endif +} + +void testFloatIsNotDeterminate1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(1.0f / f_zero); + TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(-1.0f / f_zero); + TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(0.0f / f_zero); +#endif +} + +void testFloatIsNotDeterminate2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_FLOAT_IS_DETERMINATE(-1.0f / f_zero); + VERIFY_FAILS_END +#endif +} + +void testFloatTraitFailsOnInvalidTrait(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + UnityAssertFloatSpecial(1.0f, NULL, __LINE__, UNITY_FLOAT_INVALID_TRAIT); + VERIFY_FAILS_END +#endif +} + + +void testEqualFloatArrays(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, -8.0f, 25.4f, -0.123f}; + float p1[] = {1.0f, -8.0f, 25.4f, -0.123f}; + float p2[] = {1.0f, -8.0f, 25.4f, -0.2f}; + float p3[] = {1.0f, -23.0f, 25.0f, -0.26f}; + + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p3, 1); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(NULL, NULL, 1); +#endif +} + +void testNotEqualFloatArraysExpectedNull(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float* p0 = NULL; + float p1[] = {1.0f, 8.0f, 25.4f, 0.252f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArraysActualNull(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 8.0f, 25.4f, 0.253f}; + float* p1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArrays1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 8.0f, 25.4f, 0.253f}; + float p1[] = {1.0f, 8.0f, 25.4f, 0.252f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArrays2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 8.0f, 25.4f, 0.253f}; + float p1[] = {2.0f, 8.0f, 25.4f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArrays3(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 8.0f, 25.4f, 0.253f}; + float p1[] = {1.0f, 8.0f, 25.5f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArraysNegative1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-1.0f, -8.0f, -25.4f, -0.253f}; + float p1[] = {-1.0f, -8.0f, -25.4f, -0.252f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArraysNegative2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-1.0f, -8.0f, -25.4f, -0.253f}; + float p1[] = {-2.0f, -8.0f, -25.4f, -0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArraysNegative3(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-1.0f, -8.0f, -25.4f, -0.253f}; + float p1[] = {-1.0f, -8.0f, -25.5f, -0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArraysNaN(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 0.0f / f_zero, 25.4f, 0.253f}; + float p1[] = {1.0f, 0.0f / f_zero, 25.4f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArraysInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 1.0f / f_zero, 25.4f, 0.253f}; + float p1[] = {1.0f, 1.0f / f_zero, 25.4f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatArraysLengthZero(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[1] = {0.0f}; + float p1[1] = {0.0f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 0); + VERIFY_FAILS_END +#endif +} + +// ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES DOUBLE SUPPORT ================== + +void testDoublesWithinDelta(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_WITHIN(0.00003, 187245.03485, 187245.03488); + TEST_ASSERT_DOUBLE_WITHIN(1.0, 187245.0, 187246.0); + TEST_ASSERT_DOUBLE_WITHIN(0.05, 9273.2549, 9273.2049); + TEST_ASSERT_DOUBLE_WITHIN(0.007, -726.93725, -726.94424); +#endif +} + +void testDoublesNotWithinDelta(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_WITHIN(0.05, 9273.2649, 9273.2049); + VERIFY_FAILS_END +#endif +} + + +void testDoublesEqual(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_EQUAL_DOUBLE(187245123456.0, 187245123456.0); + TEST_ASSERT_EQUAL_DOUBLE(187241234567.5, 187241234567.6); + TEST_ASSERT_EQUAL_DOUBLE(9273.2512345649, 9273.25123455699); + TEST_ASSERT_EQUAL_DOUBLE(-726.12345693724, -726.1234569374); +#endif +} + +void testDoublesNotEqual(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(9273.9649, 9273.0049); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualNegative1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(-9273.9649, -9273.0049); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualNegative2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(-9273.0049, -9273.9649); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualActualNaN(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(85.963, 0.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualExpectedNaN(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(0.0 / d_zero, 85.963); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualBothNaN(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(0.0 / d_zero, 0.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualInfNaN(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(1.0 / d_zero, 0.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualNaNInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(0.0 / d_zero, 1.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualActualInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(321.642, 1.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualExpectedInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(1.0 / d_zero, 321.642); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualBothInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(1.0 / d_zero, 1.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoublesNotEqualPlusMinusInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE(1.0 / d_zero, -1.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsPosInf1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_IS_INF(2.0 / d_zero); +#endif +} + +void testDoubleIsPosInf2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_NOT_INF(2.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsNegInf1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_IS_NEG_INF(-3.0 / d_zero); +#endif +} + +void testDoubleIsNegInf2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(-3.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsNotPosInf1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_INF(2.0); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsNotPosInf2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_IS_NOT_INF(2.0); +#endif +} + +void testDoubleIsNotNegInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_NEG_INF(-999.876); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsNan1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_IS_NAN(0.0 / d_zero); +#endif +} + +void testDoubleIsNan2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_NOT_NAN(0.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsNotNan1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_NAN(234.9); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsNotNan2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_IS_NOT_NAN(234.9); +#endif +} + +void testDoubleInfIsNotNan(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_NAN(1.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoubleNanIsNotInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_INF(0.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsDeterminate1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_IS_DETERMINATE(0.0); + TEST_ASSERT_DOUBLE_IS_DETERMINATE(123.3); + TEST_ASSERT_DOUBLE_IS_DETERMINATE(-88.3); +#endif +} + +void testDoubleIsDeterminate2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(-88.3); + VERIFY_FAILS_END +#endif +} + +void testDoubleIsNotDeterminate1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(1.0 / d_zero); + TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(-1.0 / d_zero); + TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(0.0 / d_zero); +#endif +} + +void testDoubleIsNotDeterminate2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + TEST_ASSERT_DOUBLE_IS_DETERMINATE(-1.0 / d_zero); + VERIFY_FAILS_END +#endif +} + +void testDoubleTraitFailsOnInvalidTrait(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + EXPECT_ABORT_BEGIN + UnityAssertDoubleSpecial(1.0, NULL, __LINE__, UNITY_FLOAT_INVALID_TRAIT); + VERIFY_FAILS_END +#endif +} + +void testEqualDoubleArrays(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, -8.0, 25.4, -0.123}; + double p1[] = {1.0, -8.0, 25.4, -0.123}; + double p2[] = {1.0, -8.0, 25.4, -0.2}; + double p3[] = {1.0, -23.0, 25.0, -0.26}; + + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p0, 1); + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p0, 4); + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p2, 3); + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p3, 1); + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(NULL, NULL, 1); +#endif +} + +void testNotEqualDoubleArraysExpectedNull(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double* p0 = NULL; + double p1[] = {1.0, 8.0, 25.4, 0.252}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArraysActualNull(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 8.0, 25.4, 0.253}; + double* p1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArrays1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 8.0, 25.4, 0.25666666667}; + double p1[] = {1.0, 8.0, 25.4, 0.25666666666}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArrays2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 8.0, 25.4, 0.253}; + double p1[] = {2.0, 8.0, 25.4, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArrays3(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 8.0, 25.4, 0.253}; + double p1[] = {1.0, 8.0, 25.5, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArraysNegative1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-1.0, -8.0, -25.4, -0.2566666667}; + double p1[] = {-1.0, -8.0, -25.4, -0.2566666666}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArraysNegative2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-1.0, -8.0, -25.4, -0.253}; + double p1[] = {-2.0, -8.0, -25.4, -0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArraysNegative3(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-1.0, -8.0, -25.4, -0.253}; + double p1[] = {-1.0, -8.0, -25.5, -0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArraysNaN(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 0.0 / d_zero, 25.4, 0.253}; + double p1[] = {1.0, 0.0 / d_zero, 25.4, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArraysInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 1.0 / d_zero, 25.4, 0.253}; + double p1[] = {1.0, 1.0 / d_zero, 25.4, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleArraysLengthZero(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[1] = {0.0}; + double p1[1] = {0.0}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_DOUBLE_ARRAY(p0, p1, 0); + VERIFY_FAILS_END +#endif +} + +// ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES DETAIL SUPPORT ================== + +void testThatDetailsCanBeHandleOneDetail(void) +{ +#ifdef UNITY_EXCLUDE_DETAILS + TEST_IGNORE(); +#else + UNITY_SET_DETAIL("Detail1"); + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_INT_MESSAGE(5, 6, "Should Fail And Say Detail1"); + VERIFY_FAILS_END +#endif +} + +void testThatDetailsCanHandleTestFail(void) +{ +#ifdef UNITY_EXCLUDE_DETAILS + TEST_IGNORE(); +#else + UNITY_SET_DETAILS("Detail1","Detail2"); + + EXPECT_ABORT_BEGIN + TEST_FAIL_MESSAGE("Should Fail And Say Detail1 and Detail2"); + VERIFY_FAILS_END +#endif +} + +void testThatDetailsCanBeHandleTwoDetails(void) +{ +#ifdef UNITY_EXCLUDE_DETAILS + TEST_IGNORE(); +#else + UNITY_SET_DETAILS("Detail1","Detail2"); + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_HEX8_MESSAGE(7, 8, "Should Fail And Say Detail1 and Detail2"); + VERIFY_FAILS_END +#endif +} + +void testThatDetailsCanBeHandleSingleDetailClearingTwoDetails(void) +{ +#ifdef UNITY_EXCLUDE_DETAILS + TEST_IGNORE(); +#else + UNITY_SET_DETAILS("Detail1","Detail2"); + UNITY_SET_DETAIL("DetailNew"); + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EQUAL_STRING_MESSAGE("MEH", "GUH", "Should Fail And Say DetailNew"); + VERIFY_FAILS_END +#endif +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/all_tests.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,102 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + + +########################################################################### +# Define test targets based on PROJECT +# Make files that include this must define TARGET_PLATFORM and TARGET_CONFIGURATION_DEFINES +# +# Clive Bluston +########################################################################### + +# The root of PAL. All sources should be relative to this. +#PAL_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) +PAL_ROOT=.. +$(info PAL_ROOT=$(PAL_ROOT)) + +# output folder: +OUT:=$(PAL_ROOT)/out/$(TARGET_PLATFORM) +OUTOBJ:=$(OUT)/obj +$(OUTOBJ): + $(MKDIR_QUIET) $@ + + +INIT_SRC = $(PAL_ROOT)/Source/PAL-Impl/pal_init.c + +RTOS_SRC = $(PAL_ROOT)/Source/PAL-Impl/Modules/RTOS/pal_rtos.c \ + $(PAL_ROOT)/Source/Port/Reference-Impl/$(TARGET_PLATFORM)/RTOS/pal_plat_rtos.c \ + +SOCKET_SRC = $(PAL_ROOT)/Source/PAL-Impl/Modules/Networking/pal_network.c \ + $(PAL_ROOT)/Source/Port/Reference-Impl/$(TARGET_PLATFORM)/Networking/pal_plat_network.cpp + +UPDATE_SRC = + + + +ALL_SRC = $(INIT_SRC) $(RTOS_SRC) $(SOCKET_SRC) $(UPDATE_SRC) + + + +#======================================================================== +ifeq ($(findstring HAS_ALL,$(TARGET_CONFIGURATION_DEFINES)),HAS_ALL) +PROJECT=pal_all +TYPE=Unitest + +$(PROJECT)_ADDITIONAL_SOURCES:= $(ALL_SRC) \ + $(PAL_ROOT)/Test/$(TYPE)/pal_socket_test.c \ + $(PAL_ROOT)/Test/$(TYPE)/pal_socket_test_runner.c \ + $(PAL_ROOT)/Test/$(TYPE)/pal_rtos_test.c \ + $(PAL_ROOT)/Test/$(TYPE)/pal_rtos_test_runner.c \ + + +include BUILD_TEST_$(TARGET_PLATFORM).mk +else +#======================================================================== +#======================================================================= +ifeq ($(findstring HAS_SOCKET,$(TARGET_CONFIGURATION_DEFINES)),HAS_SOCKET) +PROJECT=pal_socket +TYPE=Unitest + +$(PROJECT)_ADDITIONAL_SOURCES:= $(ALL_SRC) + + + +include BUILD_TEST_$(TARGET_PLATFORM).mk +endif +#======================================================================== +ifeq ($(findstring HAS_RTOS,$(TARGET_CONFIGURATION_DEFINES)),HAS_RTOS) +PROJECT=pal_rtos +TYPE=Unitest + +$(PROJECT)_ADDITIONAL_SOURCES:= $(ALL_SRC) + +include BUILD_TEST_$(TARGET_PLATFORM).mk +endif + +#======================================================================== + +#======================================================================== +ifeq ($(findstring HAS_UPDATE,$(TARGET_CONFIGURATION_DEFINES)),HAS_UPDATE) +PROJECT=pal_update +TYPE=Unitest + +$(PROJECT)_ADDITIONAL_SOURCES:= $(ALL_SRC) + +include BUILD_TEST_$(TARGET_PLATFORM).mk +endif +#======================================================================== + +endif \ No newline at end of file
Binary file pal/Test/eclipseBuildDialog.png has changed
Binary file pal/Test/eclipseBuildDialog2.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/make_platform.mk Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,40 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + +########################################################################### +# Platform detection +# All make platform dependent definitions shoud go here. +# +# Clive Bluston +########################################################################### + +# Define shell commands for each platform +OS:=$(strip $(shell uname)) +ifeq ($(OS),Linux) + $(info OS = $(OS)) + $(info PATH = $(PATH)) + SHELL=/bin/bash + MKDIR_QUIET = mkdir -p + RM = rm -f -r + CAT = cat + ECHO = echo +else + $(info OS = Windows) + MKDIR_QUIET = mkdir + RM = del + CAT = type + ECHO = echo +endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Test/makefile Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,38 @@ +# ----------------------------------------------------------------------- +# Copyright (c) 2016 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# 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 +# 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. +# ----------------------------------------------------------------------- + + +############################################################### +# make all target platforms +# +# +############################################################### +# Make platform detection and definitions +include make_platform.mk + + +.PHONY: all clean check + +#==================================================== +# Platform morpheus +TARGET_PLATFORM:=mbedOS +TARGET_CONFIGURATION_DEFINES:= HAS_RTOS HAS_SOCKET +all: mbedOS_all +check: mbedOS_check +clean: mbedOS_clean +include all_tests.mk +#==================================================== +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/Utils/Scripts/Readme.md Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,2 @@ +# PAL +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal/apache-2.0.txt Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,56 @@ + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/security.h Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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 + * 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. + */ +#ifndef __SECURITY_H__ +#define __SECURITY_H__ + +#include <inttypes.h> + +#define MBED_DOMAIN "2a7bde8c-76ea-42e0-b202-5d48e76da06e" +#define MBED_ENDPOINT_NAME "59bfc602-7591-4914-b942-6010a1785ee2" + +const uint8_t SERVER_CERT[] = "-----BEGIN CERTIFICATE-----\r\n" +"MIIBmDCCAT6gAwIBAgIEVUCA0jAKBggqhkjOPQQDAjBLMQswCQYDVQQGEwJGSTEN\r\n" +"MAsGA1UEBwwET3VsdTEMMAoGA1UECgwDQVJNMQwwCgYDVQQLDANJb1QxETAPBgNV\r\n" +"BAMMCEFSTSBtYmVkMB4XDTE1MDQyOTA2NTc0OFoXDTE4MDQyOTA2NTc0OFowSzEL\r\n" +"MAkGA1UEBhMCRkkxDTALBgNVBAcMBE91bHUxDDAKBgNVBAoMA0FSTTEMMAoGA1UE\r\n" +"CwwDSW9UMREwDwYDVQQDDAhBUk0gbWJlZDBZMBMGByqGSM49AgEGCCqGSM49AwEH\r\n" +"A0IABLuAyLSk0mA3awgFR5mw2RHth47tRUO44q/RdzFZnLsAsd18Esxd5LCpcT9w\r\n" +"0tvNfBv4xJxGw0wcYrPDDb8/rjujEDAOMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0E\r\n" +"AwIDSAAwRQIhAPAonEAkwixlJiyYRQQWpXtkMZax+VlEiS201BG0PpAzAiBh2RsD\r\n" +"NxLKWwf4O7D6JasGBYf9+ZLwl0iaRjTjytO+Kw==\r\n" +"-----END CERTIFICATE-----\r\n"; + +const uint8_t CERT[] = "-----BEGIN CERTIFICATE-----\r\n" +"MIIBzzCCAXOgAwIBAgIEPNG8WzAMBggqhkjOPQQDAgUAMDkxCzAJBgNVBAYTAkZ\r\n" +"JMQwwCgYDVQQKDANBUk0xHDAaBgNVBAMME21iZWQtY29ubmVjdG9yLTIwMTgwHh\r\n" +"cNMTcwMjE1MjAyNzA2WhcNMTgxMjMxMDYwMDAwWjCBoTFSMFAGA1UEAxNJMmE3Y\r\n" +"mRlOGMtNzZlYS00MmUwLWIyMDItNWQ0OGU3NmRhMDZlLzU5YmZjNjAyLTc1OTEt\r\n" +"NDkxNC1iOTQyLTYwMTBhMTc4NWVlMjEMMAoGA1UECxMDQVJNMRIwEAYDVQQKEwl\r\n" +"tYmVkIHVzZXIxDTALBgNVBAcTBE91bHUxDTALBgNVBAgTBE91bHUxCzAJBgNVBA\r\n" +"YTAkZJMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEV9hMW8+N0D18oRfR9eiqe\r\n" +"J/7S9NbxHnkjsOwbXYzSdHN/f+O2K51hD3c1HsGk7mmOqVwgvSQa2Q+dJffT4cz\r\n" +"7TAMBggqhkjOPQQDAgUAA0gAMEUCIG3idEgFuWNqnx1J474mpDpGMMdVMl8illM\r\n" +"wVztPBdcbAiEAtNAsJTLYSZiMmTd8OuCXYKb9MUv87R/wJZf/a4i4+nQ=\r\n" +"-----END CERTIFICATE-----\r\n"; + +const uint8_t KEY[] = "-----BEGIN PRIVATE KEY-----\r\n" +"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgrIyISx70k9vVg1tT\r\n" +"mxB6qBQTLOTnTXlFO7a/WCAvzLyhRANCAARX2Exbz43QPXyhF9H16Kp4n/tL01vE\r\n" +"eeSOw7BtdjNJ0c39/47YrnWEPdzUewaTuaY6pXCC9JBrZD50l99PhzPt\r\n" +"-----END PRIVATE KEY-----\r\n"; + +#endif //__SECURITY_H__ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utils.hpp Sun May 14 18:40:18 2017 +0000 @@ -0,0 +1,26 @@ +#pragma once + +#include "mbed.h" +#include "mbedtls/entropy_poll.h" + +namespace utils +{ + unsigned entropy_seed() + { + unsigned seed; + size_t length; + + unsigned char* seed_bytes = reinterpret_cast<unsigned char*>(&seed); + mbedtls_hardware_poll(NULL, seed_bytes, sizeof(unsigned), &length); + + return seed; + } + + // Default time of 0.2 seconds is fine for this lab + void pulse(DigitalOut& led, float t = 0.2f) + { + led = false; + wait(t); + led = true; + } +}