mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-10-13 16:27:43 -04:00
Use CI-CD-Github-Actions for spelling and formatting, add in the bot formatting action, update the CI-CD workflow files. Fix incorrect spelling and formatting on files. (#1083)
* Use new version of CI-CD Actions, checkout@v3 instead of checkout@v2 on all jobs * Use cSpell spell check, and use ubuntu-20.04 for formatting check * Add in bot formatting action * Update freertos_demo.yml and freertos_plus_demo.yml files to increase github log readability * Add in a Qemu demo onto the workflows.
This commit is contained in:
parent
537007d96c
commit
3a2f6646f0
1036 changed files with 134568 additions and 127281 deletions
6150
.github/.cSpellWords.txt
vendored
Normal file
6150
.github/.cSpellWords.txt
vendored
Normal file
File diff suppressed because it is too large
Load diff
2
.github/scripts/common/header_checker.py
vendored
2
.github/scripts/common/header_checker.py
vendored
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# /*
|
# /*
|
||||||
# * FreeRTOS V202212.00
|
# * FreeRTOS V202212.00
|
||||||
# * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
# * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
# *
|
# *
|
||||||
# * Permission is hereby granted, free of charge, to any person obtaining a copy of
|
# * 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
|
# * this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
24
.github/scripts/common/requirements.txt
vendored
24
.github/scripts/common/requirements.txt
vendored
|
@ -1,14 +1,14 @@
|
||||||
certifi==2023.7.22
|
Deprecated
|
||||||
chardet==4.0.0
|
GitPython
|
||||||
|
PyGithub
|
||||||
|
PyJWT
|
||||||
|
PyYAML
|
||||||
|
certifi
|
||||||
|
chardet
|
||||||
colorama
|
colorama
|
||||||
Deprecated==1.2.10
|
gitdb
|
||||||
gitdb==4.0.5
|
idna
|
||||||
GitPython==3.1.32
|
|
||||||
idna==2.10
|
|
||||||
PyGithub==1.55
|
|
||||||
PyJWT==2.4.0
|
|
||||||
PyYAML==5.4
|
|
||||||
requests
|
requests
|
||||||
smmap==3.0.4
|
smmap
|
||||||
urllib3==1.26.5
|
urllib3
|
||||||
wrapt==1.12.1
|
wrapt
|
||||||
|
|
62
.github/scripts/core_checker.py
vendored
62
.github/scripts/core_checker.py
vendored
|
@ -119,6 +119,7 @@ FREERTOS_IGNORED_EXTENSIONS = [
|
||||||
'.ipcf',
|
'.ipcf',
|
||||||
'.ise',
|
'.ise',
|
||||||
'.jlink',
|
'.jlink',
|
||||||
|
'.js',
|
||||||
'.json',
|
'.json',
|
||||||
'.la',
|
'.la',
|
||||||
'.launch',
|
'.launch',
|
||||||
|
@ -172,6 +173,7 @@ FREERTOS_IGNORED_EXTENSIONS = [
|
||||||
'.pl',
|
'.pl',
|
||||||
'.plg',
|
'.plg',
|
||||||
'.png',
|
'.png',
|
||||||
|
'.props',
|
||||||
'.prc',
|
'.prc',
|
||||||
'.pref',
|
'.pref',
|
||||||
'.prefs',
|
'.prefs',
|
||||||
|
@ -216,6 +218,7 @@ FREERTOS_IGNORED_EXTENSIONS = [
|
||||||
'.tags',
|
'.tags',
|
||||||
'.tcl',
|
'.tcl',
|
||||||
'.tdt',
|
'.tdt',
|
||||||
|
'.templ',
|
||||||
'.template',
|
'.template',
|
||||||
'.tgt',
|
'.tgt',
|
||||||
'.tps',
|
'.tps',
|
||||||
|
@ -250,14 +253,12 @@ FREERTOS_IGNORED_EXTENSIONS = [
|
||||||
'.xmsgs',
|
'.xmsgs',
|
||||||
'.xsl',
|
'.xsl',
|
||||||
'.yml',
|
'.yml',
|
||||||
'.md',
|
|
||||||
'.zip'
|
'.zip'
|
||||||
]
|
]
|
||||||
|
|
||||||
FREERTOS_IGNORED_PATTERNS = [
|
FREERTOS_IGNORED_PATTERNS = [
|
||||||
r'.*\.git.*',
|
r'.*\.git.*',
|
||||||
r'.*mbedtls_config\.h.*',
|
r'.*mbedtls_config\.h.*',
|
||||||
r'.*mbedtls_config\.h.*',
|
|
||||||
r'.*CMSIS.*',
|
r'.*CMSIS.*',
|
||||||
r'.*/Nordic_Code/*',
|
r'.*/Nordic_Code/*',
|
||||||
r'.*/Nuvoton_Code/*',
|
r'.*/Nuvoton_Code/*',
|
||||||
|
@ -275,8 +276,40 @@ FREERTOS_IGNORED_PATTERNS = [
|
||||||
r'.*/trcKernelPortSnapshotConfig\.h.*',
|
r'.*/trcKernelPortSnapshotConfig\.h.*',
|
||||||
r'.*/MicroZed_hw_platform.*',
|
r'.*/MicroZed_hw_platform.*',
|
||||||
r'.*/ThirdParty/.*',
|
r'.*/ThirdParty/.*',
|
||||||
r'FreeRTOS\-Plus/Demo/Common/WinPCap/.*',
|
r'.*/WinPCap/.*',
|
||||||
r'FreeRTOS\-Plus/Source/FreeRTOS-Plus-Trace/.*',
|
r'.*/DRIVERS/.*',
|
||||||
|
r'.*/FreeRTOS-Plus-Trace/.*',
|
||||||
|
r'.*/Reliance-Edge/.*',
|
||||||
|
r'.*/HCS12_CodeWarrior_banked/.*',
|
||||||
|
r'.*/ARM7_STR75x_GCC/.*',
|
||||||
|
r'.*/ARM7_STR75x_IAR/.*',
|
||||||
|
r'.*/lwip-1.4.0/.*',
|
||||||
|
r'.*/lwip-1.1.0/.*',
|
||||||
|
r'.*/MSP430X_MSP430F5438_CCS/.*',
|
||||||
|
r'.*/Atmel/.*',
|
||||||
|
r'.*/drivers/.*',
|
||||||
|
r'.*/lwIP/.*',
|
||||||
|
r'.*/ARM7_AT91FR40008_GCC/.*',
|
||||||
|
r'.*/ARM7_AT91SAM7S64_IAR/.*',
|
||||||
|
r'.*/ARM7_LPC2106_GCC/.*',
|
||||||
|
r'.*/CORTEX_A9_Cyclone_V_SoC_DK/.*',
|
||||||
|
r'.*/CORTEX_A9_Zynq_ZC702/.*',
|
||||||
|
r'.*/FreeRTOS-Plus/Demo/FreeRTOS_Plus_Reliance_Edge_and_CLI_Windows_Simulator/ConfigurationFiles//.*',
|
||||||
|
r'.*/ARM7_AT91FR40008_GCC/.*',
|
||||||
|
r'.*/ARM7_STR71x_IAR/.*',
|
||||||
|
r'FreeRTOS/Demo/HCS12_GCC_banked/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_STM32L152_Discovery_IAR/include/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_M4F_Infineon_XMC4000_Keil/.*',
|
||||||
|
r'FreeRTOS/Demo/AVR_ATMega4809_Atmel_Studio/RTOSDemo/.*',
|
||||||
|
r'FreeRTOS/Demo/AVR32_UC3/.*',
|
||||||
|
r'FreeRTOS/Demo/ARM7_STR75x_GCC/STLibrary/inc/.*',
|
||||||
|
r'FreeRTOS/Demo/ARM7_STR75x_IAR/STLibrary/inc/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_R4F_RZ_T_GCC_IAR/System/GCC/inc/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_A5_SAMA5D2x_Xplained_IAR/AtmelFiles/drivers/misc/.*',
|
||||||
|
r'FreeRTOS/Demo/CORTEX_ATSAM3X_Atmel_Studio/src/.*',
|
||||||
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Trace_Recorder_Configuration/.*',
|
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_CLI_with_Trace_Windows_Simulator/Trace_Recorder_Configuration/.*',
|
||||||
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/.*',
|
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/.*',
|
||||||
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/pcap/.*',
|
r'FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_IPv6_Demo/common/WinPCap/pcap/.*',
|
||||||
|
@ -291,6 +324,7 @@ FREERTOS_IGNORED_PATTERNS = [
|
||||||
]
|
]
|
||||||
|
|
||||||
FREERTOS_IGNORED_FILES = [
|
FREERTOS_IGNORED_FILES = [
|
||||||
|
'cspell.config.yaml',
|
||||||
'.cproject',
|
'.cproject',
|
||||||
'.project',
|
'.project',
|
||||||
'fyi-another-way-to-ignore-file.txt',
|
'fyi-another-way-to-ignore-file.txt',
|
||||||
|
@ -310,12 +344,28 @@ FREERTOS_IGNORED_FILES = [
|
||||||
'reg_test.S',
|
'reg_test.S',
|
||||||
'gdbinit',
|
'gdbinit',
|
||||||
'libslirp-version.h',
|
'libslirp-version.h',
|
||||||
|
'LPC21xx.h',
|
||||||
|
'lpc221x.h',
|
||||||
|
'winbase.h',
|
||||||
|
'windows.h',
|
||||||
|
'direct.h',
|
||||||
|
'stm32f10x_conf.h',
|
||||||
|
'lwipopts.h',
|
||||||
|
'lwipopts.h',
|
||||||
|
'xil_assert.h',
|
||||||
|
'alt_i2c.h',
|
||||||
|
'alt_clkmgr.h',
|
||||||
|
'hal_lcd.c',
|
||||||
|
'adc.h',
|
||||||
|
'redconf.c',
|
||||||
|
'redconf.h',
|
||||||
|
'redtypes.h',
|
||||||
]
|
]
|
||||||
|
|
||||||
FREERTOS_HEADER = [
|
FREERTOS_HEADER = [
|
||||||
'/*\n',
|
'/*\n',
|
||||||
' * FreeRTOS V202212.00\n',
|
' * FreeRTOS V202212.00\n',
|
||||||
' * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n',
|
' * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n',
|
||||||
' *\n',
|
' *\n',
|
||||||
' * Permission is hereby granted, free of charge, to any person obtaining a copy of\n',
|
' * Permission is hereby granted, free of charge, to any person obtaining a copy of\n',
|
||||||
' * this software and associated documentation files (the "Software"), to deal in\n',
|
' * this software and associated documentation files (the "Software"), to deal in\n',
|
||||||
|
@ -340,7 +390,7 @@ FREERTOS_HEADER = [
|
||||||
' */\n',
|
' */\n',
|
||||||
]
|
]
|
||||||
|
|
||||||
FREERTOS_COPYRIGHT_REGEX = r"^( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$"
|
FREERTOS_COPYRIGHT_REGEX = r"^( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$"
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = HeaderChecker.configArgParser()
|
parser = HeaderChecker.configArgParser()
|
||||||
|
|
38
.github/scripts/qemu_reader.c
vendored
Normal file
38
.github/scripts/qemu_reader.c
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main( int argc, char * argv[] )
|
||||||
|
{
|
||||||
|
setvbuf( stdout, NULL, _IONBF, 0 );
|
||||||
|
FILE * fp;
|
||||||
|
char path[ 256 ];
|
||||||
|
char cmd[ 256 ];
|
||||||
|
|
||||||
|
/* Open the command for reading. */
|
||||||
|
fp = popen("find . -name RTOSDemo.out", "r");
|
||||||
|
/* Read the output a line at a time - output it. */
|
||||||
|
while( fgets( path, sizeof( path ), fp ) != NULL )
|
||||||
|
{
|
||||||
|
printf( "Path: %s\n", path );
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(cmd, "qemu-system-arm -machine mps2-an385 -monitor null -semihosting --semihosting-config enable=on,target=native -serial stdio -nographic -kernel %s", path);
|
||||||
|
printf("cmd= %s\n", cmd);
|
||||||
|
fp = popen( cmd, "r" );
|
||||||
|
if( fp == NULL )
|
||||||
|
{
|
||||||
|
printf( "Failed to run command\n" );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the output a line at a time - output it. */
|
||||||
|
while( fgets( path, sizeof( path ), fp ) != NULL )
|
||||||
|
{
|
||||||
|
printf( "%s", path );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close */
|
||||||
|
pclose( fp );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
27
.github/scripts/release-requirements.txt
vendored
27
.github/scripts/release-requirements.txt
vendored
|
@ -1,13 +1,14 @@
|
||||||
certifi>=2020.12.5
|
Deprecated
|
||||||
chardet>=3.0.4
|
GitPython
|
||||||
Deprecated>=1.2.10
|
PyGithub
|
||||||
gitdb>=4.0.5
|
PyJWT
|
||||||
GitPython>=3.1.11
|
PyYAML
|
||||||
idna>=2.10
|
certifi
|
||||||
PyGithub>=1.54
|
chardet
|
||||||
PyJWT>=1.7.1
|
colorama
|
||||||
PyYAML>=5.3.1
|
gitdb
|
||||||
requests>=2.24.0
|
idna
|
||||||
smmap>=3.0.4
|
requests
|
||||||
urllib3>=1.25.11
|
smmap
|
||||||
wrapt>=1.12.1
|
urllib3
|
||||||
|
wrapt
|
||||||
|
|
4
.github/workflows/auto-release.yml
vendored
4
.github/workflows/auto-release.yml
vendored
|
@ -26,13 +26,13 @@ jobs:
|
||||||
|
|
||||||
# Source the release tools from FreeRTOS/FreeRTOS
|
# Source the release tools from FreeRTOS/FreeRTOS
|
||||||
- name: Checkout FreeRTOS Release Tools
|
- name: Checkout FreeRTOS Release Tools
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
path: tools
|
path: tools
|
||||||
|
|
||||||
# Simpler git auth if we use checkout action and forward the repo to release script
|
# Simpler git auth if we use checkout action and forward the repo to release script
|
||||||
- name: Checkout FreeRTOS
|
- name: Checkout FreeRTOS
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
path: local_core
|
path: local_core
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
198
.github/workflows/ci.yml
vendored
198
.github/workflows/ci.yml
vendored
|
@ -1,93 +1,80 @@
|
||||||
name: CI Checks
|
name: CI Checks
|
||||||
|
|
||||||
|
env:
|
||||||
|
bashPass: \033[32;1mPASSED -
|
||||||
|
bashWarn: \033[33;1mWARNING -
|
||||||
|
bashFail: \033[31;1mFAILED -
|
||||||
|
bashEnd: \033[0m
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
git-secrets:
|
git-secrets:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Checkout awslabs/git-secrets
|
- name: Checkout awslabs/git-secrets
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
repository: awslabs/git-secrets
|
repository: awslabs/git-secrets
|
||||||
ref: master
|
ref: master
|
||||||
path: git-secrets
|
path: git-secrets
|
||||||
- name: Install git-secrets
|
- name: Install git-secrets
|
||||||
run: cd git-secrets && sudo make install && cd ..
|
run: cd git-secrets && sudo make install && cd ..
|
||||||
- name: Run git-secrets
|
- name: Run git-secrets
|
||||||
run: |
|
run: |
|
||||||
git-secrets --register-aws
|
git-secrets --register-aws
|
||||||
git-secrets --scan
|
git-secrets --scan
|
||||||
|
|
||||||
formatting:
|
formatting:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Install Uncrustify
|
|
||||||
run: sudo apt-get install uncrustify=0.69.0+dfsg1-1build1
|
|
||||||
- name: Run Uncrustify
|
|
||||||
run: |
|
|
||||||
# Uncrustify on C files while ignoring symlinks.
|
|
||||||
# Make a collapsible section in the log to run uncrustify
|
|
||||||
echo "::group::Uncrustify Check"
|
|
||||||
# GitHub automtically use "set -e" which causes scripts to fail on the first exit code
|
|
||||||
# This would mean the first time a file fails the check that we exit without formatting all files.
|
|
||||||
set +e
|
|
||||||
uncrustify --version
|
|
||||||
find FreeRTOS/Demo/Common FreeRTOS/Test \( -name ethernet -o -name drivers -o -path 'FreeRTOS/Test/CMock/CMock' \) -prune -false -o -name "*.[hc]" | xargs uncrustify --no-backup --replace --if-changed -c tools/uncrustify.cfg -l C
|
|
||||||
echo "::endgroup::"
|
|
||||||
# Run a git diff to print the differences if any exist, return an error code if there are any
|
|
||||||
git diff --exit-code
|
|
||||||
if [ "$?" = "0" ]; then
|
|
||||||
echo -e "\033[32;3mUncrustify check passed\033[0m"
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo -e "\033[32;31mFormatting check (using Uncrustify) failed...\033[0m"
|
|
||||||
# If there is an error, set this flag high again so the exit 1 fails the run
|
|
||||||
set -e
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
- name: Check For Trailing Whitespace
|
|
||||||
run: |
|
|
||||||
# Trailing Whitespace Check
|
|
||||||
set +e
|
|
||||||
ERROR=0
|
|
||||||
find . \( -name '.git' -o -path "./FreeRTOS/Test/CBMC/patches" -o -path "./FreeRTOS-Plus" -o -path "./FreeRTOS/Source" -o -path "./FreeRTOS/Test/CMock/CMock" -o -path "./FreeRTOS/Demo" \) -prune -false -o -type f -a -name "*" -exec grep -In -e "[[:blank:]]$" {} +
|
|
||||||
if [ "$?" = "0" ]; then
|
|
||||||
ERROR=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
find FreeRTOS/Demo/Common \( -name "ethernet" \) -prune -o -false -o -type f -a -name "*" -exec grep --color=yes -In -e "[[:blank:]]$" {} +
|
- name: Check Formatting of Common Demo Files
|
||||||
if [ "$?" = "0" ]; then
|
uses: FreeRTOS/CI-CD-Github-Actions/formatting@main
|
||||||
echo -e "\033[32;31mFiles have trailing whitespace.\033[0m"
|
with:
|
||||||
exit 1
|
path: FreeRTOS/Demo/Common
|
||||||
else
|
exclude-dirs: ethernet, drivers
|
||||||
if [ "$ERROR" -eq "1" ]; then
|
|
||||||
echo -e "\033[32;31mFiles have trailing whitespace.\033[0m"
|
- name: Check Formatting
|
||||||
exit 1
|
uses: FreeRTOS/CI-CD-Github-Actions/formatting@main
|
||||||
fi
|
with:
|
||||||
echo -e "\033[32;3mTrailing whitespace check passed\033[0m"
|
exclude-dirs: ethernet, drivers, FreeRTOS/Demo
|
||||||
exit 0
|
|
||||||
fi
|
spell-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Parent Repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Check Spelling of Common Demo Files
|
||||||
|
uses: FreeRTOS/CI-CD-GitHub-Actions/spellings@main
|
||||||
|
with:
|
||||||
|
path: FreeRTOS/Demo/Common
|
||||||
|
exclude-dirs: ethernet, drivers
|
||||||
|
|
||||||
|
- name: Check Spelling
|
||||||
|
uses: FreeRTOS/CI-CD-GitHub-Actions/spellings@main
|
||||||
|
with:
|
||||||
|
exclude-dirs: ethernet, drivers, FreeRTOS/Demo
|
||||||
|
|
||||||
doxygen:
|
doxygen:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Clone repository
|
- name: Clone repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
path: freertos
|
path: freertos
|
||||||
- name: Install Python3
|
- name: Install Python3
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v3
|
||||||
with:
|
|
||||||
python-version: '3.8'
|
|
||||||
- name: Download tag dependency of coreMQTT-Agent
|
- name: Download tag dependency of coreMQTT-Agent
|
||||||
run: |
|
run: |
|
||||||
# We don't need to generate the coreMQTT docs, we only need the tag file.
|
# We don't need to generate the coreMQTT docs, we only need the tag file.
|
||||||
|
@ -95,8 +82,9 @@ jobs:
|
||||||
mkdir -p freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output
|
mkdir -p freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output
|
||||||
wget -O freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output/mqtt.tag \
|
wget -O freertos/FreeRTOS-Plus/Source/Application-Protocols/coreMQTT-Agent/source/dependency/coreMQTT/docs/doxygen/output/mqtt.tag \
|
||||||
"https://freertos.org/Documentation/api-ref/coreMQTT/docs/doxygen/output/mqtt.tag"
|
"https://freertos.org/Documentation/api-ref/coreMQTT/docs/doxygen/output/mqtt.tag"
|
||||||
|
|
||||||
- name: Generate doxygen ZIP
|
- name: Generate doxygen ZIP
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/doxygen@main
|
uses: FreeRTOS/CI-CD-Github-Actions/doxygen@main
|
||||||
with:
|
with:
|
||||||
path: ./freertos
|
path: ./freertos
|
||||||
# List of directories containing libraries whose doxygen output will be generated.
|
# List of directories containing libraries whose doxygen output will be generated.
|
||||||
|
@ -112,77 +100,49 @@ jobs:
|
||||||
path: ./freertos/doxygen.zip
|
path: ./freertos/doxygen.zip
|
||||||
retention-days: 2
|
retention-days: 2
|
||||||
|
|
||||||
spell-check:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
steps:
|
|
||||||
- name: Checkout Parent Repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
ref: main
|
|
||||||
repository: FreeRTOS/CI-CD-Github-Actions
|
|
||||||
path: commonCI
|
|
||||||
- name: Clone This Repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: ./FreeRTOS
|
|
||||||
- name: Install spell
|
|
||||||
run: |
|
|
||||||
sudo apt-get install spell
|
|
||||||
sudo apt-get install util-linux
|
|
||||||
- name: Check spelling
|
|
||||||
run: |
|
|
||||||
# Add path to the tool to the environment variable.
|
|
||||||
PATH=$PATH:commonCI/spellings/tools
|
|
||||||
# Make sure that only Amazon licenced files are checked.
|
|
||||||
sed -i 's/`find $DIRNAME \\( -iname \\\*\.\[ch\] -o -iname \\\*\.dox \\) -type f`/`grep -ril "copyright \(c\) \[0-9\]\[0-9\]\[0-9\]\[0-9\] amazon.com" | grep "\\.\[ch\]" | grep -v "FreeRTOS\/FreeRTOS\/Test\/VeriFast"`/g' commonCI/spellings/tools/find-unknown-comment-words
|
|
||||||
# Run the spell check script.
|
|
||||||
find-unknown-comment-words --directory FreeRTOS/ --lexicon FreeRTOS/lexicon.txt
|
|
||||||
# Check the exit status.
|
|
||||||
if [ "$?" = "0" ]; then
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
verify-manifest:
|
verify-manifest:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Install Python3
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: '3.x'
|
|
||||||
- name: Run manifest verifier
|
- name: Run manifest verifier
|
||||||
uses: FreeRTOS/CI-CD-Github-Actions/manifest-verifier@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/manifest-verifier@v2
|
||||||
with:
|
with:
|
||||||
path: ./
|
path: ./
|
||||||
exclude-submodules: FreeRTOS-Plus/Test/CMock,FreeRTOS/Test/CMock/CMock,FreeRTOS/Test/litani
|
|
||||||
fail-on-incorrect-version: true
|
fail-on-incorrect-version: true
|
||||||
|
|
||||||
memory-statistics:
|
memory-statistics:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
ARM_GCC_TOOLCHAIN_URL: "https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2?revision=05382cca-1721-44e1-ae19-1e7c3dc96118&la=en&hash=D7C9D18FCA2DD9F894FD9F3C3DC9228498FA281A"
|
ARM_GCC_TOOLCHAIN_URL: "https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2?revision=05382cca-1721-44e1-ae19-1e7c3dc96118&la=en&hash=D7C9D18FCA2DD9F894FD9F3C3DC9228498FA281A"
|
||||||
steps:
|
steps:
|
||||||
- name: Install ARM GCC
|
- name: Install ARM GCC
|
||||||
run: wget -qO- "${{ env.ARM_GCC_TOOLCHAIN_URL }}" | sudo tar --strip-components=1 -xj -C /usr/local
|
run:
|
||||||
|
wget -qO- "${{ env.ARM_GCC_TOOLCHAIN_URL }}" | sudo tar
|
||||||
|
--strip-components=1 -xj -C /usr/local
|
||||||
- name: Clone FreeRTOS Repository with submodules
|
- name: Clone FreeRTOS Repository with submodules
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Clone mbedTLS submodule from corePKCS11
|
- name: Clone mbedTLS submodule from corePKCS11
|
||||||
run: git submodule update --init --recursive --checkout -- FreeRTOS-Plus/Source/corePKCS11
|
run:
|
||||||
|
git submodule update --init --recursive --checkout --
|
||||||
|
FreeRTOS-Plus/Source/corePKCS11
|
||||||
- name: Clone CI-CD-Github-Actions repository
|
- name: Clone CI-CD-Github-Actions repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
repository: FreeRTOS/CI-CD-Github-Actions
|
repository: FreeRTOS/CI-CD-GitHub-Actions
|
||||||
path: tools
|
path: tools
|
||||||
- name: Run script to generate JSON memory statistics
|
- name: Run script to generate JSON memory statistics
|
||||||
run: tools/memory_statistics/memory_statistics.py --json_report --config tools/memory_statistics/paths.json --output freertos_lts_memory_estimates.json
|
run:
|
||||||
- name: Upload memory size report as artifact (for main and release-candidate ONLY)
|
tools/memory_statistics/memory_statistics.py --json_report
|
||||||
|
--config tools/memory_statistics/paths.json --output
|
||||||
|
freertos_lts_memory_estimates.json
|
||||||
|
- name:
|
||||||
|
Upload memory size report as artifact (for main and
|
||||||
|
release-candidate ONLY)
|
||||||
if: success() && ( github.ref == 'refs/heads/main' || github.ref == 'refs/heads/release-candidate' )
|
if: success() && ( github.ref == 'refs/heads/main' || github.ref == 'refs/heads/release-candidate' )
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
|
@ -191,16 +151,24 @@ jobs:
|
||||||
retention-days: 2
|
retention-days: 2
|
||||||
|
|
||||||
proof_ci:
|
proof_ci:
|
||||||
|
if: ${{ github.event.pull_request }}
|
||||||
runs-on: cbmc_ubuntu-latest_16-core
|
runs-on: cbmc_ubuntu-latest_16-core
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- run: |
|
- env:
|
||||||
|
stepName: Install Dependencies
|
||||||
|
run: |
|
||||||
|
echo -e "::group::${{ env.stepName }}"
|
||||||
git submodule update --init --checkout --recursive --depth 1
|
git submodule update --init --checkout --recursive --depth 1
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install --yes --no-install-recommends gcc-multilib
|
sudo apt-get install --yes --no-install-recommends gcc-multilib
|
||||||
|
echo -e "::endgroup::"
|
||||||
|
echo -e "${{ env.bashPass }} ${{env.stepName}} ${{ env.bashEnd }}"
|
||||||
|
|
||||||
- name: Set up CBMC runner
|
- name: Set up CBMC runner
|
||||||
uses: FreeRTOS/CI-CD-Github-Actions/set_up_cbmc_runner@main
|
uses: FreeRTOS/CI-CD-Github-Actions/set_up_cbmc_runner@main
|
||||||
|
|
||||||
- name: Run CBMC
|
- name: Run CBMC
|
||||||
uses: FreeRTOS/CI-CD-Github-Actions/run_cbmc@main
|
uses: FreeRTOS/CI-CD-Github-Actions/run_cbmc@main
|
||||||
with:
|
with:
|
||||||
proofs_dir: FreeRTOS/Test/CBMC/proofs
|
proofs_dir: FreeRTOS/Test/CBMC/proofs
|
||||||
|
|
4
.github/workflows/core-checks.yml
vendored
4
.github/workflows/core-checks.yml
vendored
|
@ -18,14 +18,14 @@ jobs:
|
||||||
|
|
||||||
# Use the checks as defined by the user, so they can locally adjust as needed
|
# Use the checks as defined by the user, so they can locally adjust as needed
|
||||||
- name: Checkout FreeRTOS Tools
|
- name: Checkout FreeRTOS Tools
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
path: tools
|
path: tools
|
||||||
|
|
||||||
# Checkout user pull request changes
|
# Checkout user pull request changes
|
||||||
- name: Checkout Pull Request
|
- name: Checkout Pull Request
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
path: inspect
|
path: inspect
|
||||||
|
|
23
.github/workflows/formatting.yml
vendored
Normal file
23
.github/workflows/formatting.yml
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
name: Format Pull Request Files
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
env:
|
||||||
|
bashPass: \033[32;1mPASSED -
|
||||||
|
bashInfo: \033[33;1mINFO -
|
||||||
|
bashFail: \033[31;1mFAILED -
|
||||||
|
bashEnd: \033[0m
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Formatting:
|
||||||
|
name: Run Formatting Check
|
||||||
|
if: ${{ github.event.issue.pull_request }} &&
|
||||||
|
( ( github.event.comment.body == '/bot run uncrustify' ) ||
|
||||||
|
( github.event.comment.body == '/bot run formatting' ) )
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Apply Formatting Fix
|
||||||
|
uses: FreeRTOS/CI-CD-Github-Actions/formatting-bot@main
|
||||||
|
id: check-formatting
|
656
.github/workflows/freertos_demos.yml
vendored
656
.github/workflows/freertos_demos.yml
vendored
|
@ -1,195 +1,230 @@
|
||||||
name: FreeRTOS Demos
|
name: FreeRTOS Demos
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
bashPass: \033[32;1mPASSED -
|
||||||
|
bashWarn: \033[33;1mWARNING -
|
||||||
|
bashFail: \033[31;1mFAILED -
|
||||||
|
bashEnd: \033[0m
|
||||||
|
|
||||||
|
pwshPass: "`e[32;1mPASSED -"
|
||||||
|
pwshWarn: "`e[33;1mWARNING -"
|
||||||
|
pwshFail: "`e[31;1mFAILED -"
|
||||||
|
pwshEnd: "`e[0m"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
WIN32-MSVC:
|
WIN32-MSVC:
|
||||||
name: WIN32 MSVC
|
name: WIN32 MSVC
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- env:
|
||||||
uses: actions/checkout@v2
|
stepName: Checkout Repository
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Fetch Kernel Submodule
|
- env:
|
||||||
|
stepName: Fetch Kernel Submodule
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Fetch Kernel Submodule
|
# ${{ env.stepName }}
|
||||||
echo "::group::Fetch Kernel Submodule"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [[ "$?" = "0" ]]
|
set -e
|
||||||
then
|
echo -e "::endgroup::"
|
||||||
echo -e "\033[32;3mCloned the Kernel\033[0m"
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{env.stepName}} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mKernel Clone Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{env.stepName}} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Add msbuild to PATH
|
- env:
|
||||||
|
stepName: Add msbuild to PATH
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: microsoft/setup-msbuild@v1.1
|
uses: microsoft/setup-msbuild@v1.1
|
||||||
|
|
||||||
- name: Build WIN32-MSVC Full Demo
|
- env:
|
||||||
|
stepName: Build WIN32-MSVC Full Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
id: build-win32-msvs-full-demo
|
id: build-win32-msvs-full-demo
|
||||||
working-directory: FreeRTOS/Demo/WIN32-MSVC
|
working-directory: FreeRTOS/Demo/WIN32-MSVC
|
||||||
run: |
|
run: |
|
||||||
# Build WIN32-MSVC Full Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build WIN32-MSVC Full Demo"
|
echo "::group::${{ env.stepName }}"
|
||||||
$content = Get-Content -Path 'main.c' -Raw
|
$content = Get-Content -Path 'main.c' -Raw
|
||||||
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
|
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
|
||||||
$newContent | Set-Content -Path 'main.c'
|
$newContent | Set-Content -Path 'main.c'
|
||||||
msbuild WIN32.sln -t:rebuild
|
msbuild WIN32.sln -t:rebuild
|
||||||
|
$exitStatus = $?
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
if($? -eq 1) {
|
if($exitStatus -eq 1) {
|
||||||
Write-Host -ForegroundColor green "Built the WIN32-MSVC Full Demo"
|
echo "${{ env.pwshPass }} ${{env.stepName}} ${{ env.pwshEnd }}"
|
||||||
}else {
|
}else {
|
||||||
Write-Host -ForegroundColor red "Build WIN32-MSVC Full Demo Failed..."
|
echo "${{ env.pwshFail }} ${{env.stepName}} ${{ env.pwshEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
- name: Run and monitor WIN32-MSVC Full Demo
|
- env:
|
||||||
if: success() || failure() && steps.build-win32-msvs-full-demo.outcome == 'success'
|
stepName: Run and monitor WIN32-MSVC Full Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
with:
|
with:
|
||||||
exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe
|
exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe
|
||||||
log-dir: demo_run_logs
|
|
||||||
timeout-seconds: 60
|
timeout-seconds: 60
|
||||||
success-line: "No errors - tick count"
|
success-line: "No errors - tick count"
|
||||||
|
retry-attempts: 3
|
||||||
|
|
||||||
- name: Build WIN32-MSVC Blinky Demo
|
- env:
|
||||||
|
stepName: Build WIN32-MSVC Blinky Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
id: build-win32-msvs-blinky-demo
|
id: build-win32-msvs-blinky-demo
|
||||||
working-directory: FreeRTOS/Demo/WIN32-MSVC
|
working-directory: FreeRTOS/Demo/WIN32-MSVC
|
||||||
run: |
|
run: |
|
||||||
# Build WIN32-MSVC Blinky Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::MSBuild of WIN32-MSVC Blinky Demo"
|
echo "::group::${{ env.stepName }}"
|
||||||
$content = Get-Content -Path 'main.c' -Raw
|
$content = Get-Content -Path 'main.c' -Raw
|
||||||
$newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1'
|
$newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1'
|
||||||
$newContent | Set-Content -Path 'main.c'
|
$newContent | Set-Content -Path 'main.c'
|
||||||
# Perform MSBuild of WIN32-MSVC Blinky Demo
|
|
||||||
msbuild WIN32.sln -t:rebuild
|
msbuild WIN32.sln -t:rebuild
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
if($? -eq 1) {
|
$exitStatus = $?
|
||||||
Write-Host -ForegroundColor green "Built the WIN32-MSVC Blinky Demo"
|
if($exitStatus -eq 1) {
|
||||||
|
echo "${{ env.pwshPass }} ${{ env.stepName }} ${{ env.pwshEnd }}"
|
||||||
}else {
|
}else {
|
||||||
Write-Host -ForegroundColor red "Build WIN32-MSVC Blinky Demo Failed..."
|
echo "${{ env.pwshFail }} ${{ env.stepName }} ${{ env.pwshEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
- name: Run and monitor WIN32-MSVC Blinky Demo
|
- env:
|
||||||
if: success() || failure() && steps.build-win32-msvs-blinky-demo.outcome == 'success'
|
stepName: Run and monitor WIN32-MSVC Blinky Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
with:
|
with:
|
||||||
exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe
|
exe-path: FreeRTOS/Demo/WIN32-MSVC/Debug/RTOSDemo.exe
|
||||||
log-dir: demo_run_logs
|
timeout-seconds: 60
|
||||||
timeout-seconds: 60
|
success-line: "Message received from software timer"
|
||||||
success-line: "Message received from software timer"
|
retry-attempts: 3
|
||||||
|
|
||||||
- name: Build WIN32-MSVC-Static-Allocation-Only Demo
|
- env:
|
||||||
|
stepName: Build WIN32-MSVC-Static-Allocation-Only Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
id: build-win32-msvs-static-allocation-only-demo
|
id: build-win32-msvs-static-allocation-only-demo
|
||||||
working-directory: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only
|
working-directory: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only
|
||||||
run: |
|
run: |
|
||||||
# Build WIN32-MSVC-Static-Allocation-Only Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build WIN32-MSVC-Static-Allocation-Only Demo"
|
echo "::group::${{ env.stepName }}"
|
||||||
$content = Get-Content -Path 'main.c' -Raw
|
$content = Get-Content -Path 'main.c' -Raw
|
||||||
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
|
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
|
||||||
$newContent | Set-Content -Path 'main.c'
|
$newContent | Set-Content -Path 'main.c'
|
||||||
msbuild WIN32.sln -t:rebuild
|
msbuild WIN32.sln -t:rebuild
|
||||||
|
$exitStatus = $?
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
if($? -eq 1) {
|
if($exitStatus -eq 1) {
|
||||||
Write-Host -ForegroundColor green "Built the WIN32-MSVC-Static-Allocation-Only Demo"
|
echo "${{ env.pwshPass }} ${{ env.stepName }} ${{ env.pwshEnd }}"
|
||||||
}else {
|
}else {
|
||||||
Write-Host -ForegroundColor red "Build WIN32-MSVC-Static-Allocation-Only Demo Failed..."
|
echo "${{ env.pwshFail }} ${{ env.stepName }} ${{ env.pwshEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
- name: Run and monitor WIN32-MSVC-Static-Allocation-Only Demo
|
- env:
|
||||||
if: success() || failure() && steps.build-win32-msvs-static-allocation-only-demo.outcome == 'success'
|
stepName:
|
||||||
|
Run and monitor WIN32-MSVC-Static-Allocation-Only Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
with:
|
with:
|
||||||
exe-path: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only/Debug/RTOSDemo.exe
|
exe-path: FreeRTOS/Demo/WIN32-MSVC-Static-Allocation-Only/Debug/RTOSDemo.exe
|
||||||
log-dir: demo_run_logs
|
timeout-seconds: 60
|
||||||
timeout-seconds: 60
|
success-line: "No errors - tick count"
|
||||||
success-line: "No errors - tick count"
|
retry-attempts: 3
|
||||||
|
|
||||||
WIN32-MingW:
|
WIN32-MingW:
|
||||||
name: WIN32 MingW
|
name: WIN32 MingW
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- env:
|
||||||
uses: actions/checkout@v2
|
stepName: Checkout Repository
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Fetch Kernel Submodule
|
- env:
|
||||||
|
stepName: Fetch Kernel Submodule
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Fetch Kernel Submodule
|
# ${{ env.stepName }}
|
||||||
echo "::group::Fetch Kernel Submodule"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
||||||
echo "::endgroup::"
|
echo -e "::endgroup::"
|
||||||
if [[ "$?" = "0" ]]
|
echo -e "${{ env.bashPass }} ${{env.stepName}} ${{ env.bashEnd }}"
|
||||||
then
|
|
||||||
echo -e "\033[32;3mCloned the Kernel\033[0m"
|
|
||||||
else
|
|
||||||
echo -e "\033[32;31mKernel Clone Failed...\033[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
- env:
|
||||||
- name: Build WIN32-MingW Full Demo
|
stepName: Build WIN32-MingW Full Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
id: build-win32-mingw-full-demo
|
id: build-win32-mingw-full-demo
|
||||||
working-directory: FreeRTOS/Demo/WIN32-MingW
|
working-directory: FreeRTOS/Demo/WIN32-MingW
|
||||||
run: |
|
run: |
|
||||||
# Build WIN32-MingW Full Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build WIN32-MingW Full Demo"
|
echo "::group::${{ env.stepName }}"
|
||||||
$content = Get-Content -Path 'main.c' -Raw
|
$content = Get-Content -Path 'main.c' -Raw
|
||||||
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
|
$newContent = $content -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
|
||||||
$newContent | Set-Content -Path 'main.c'
|
$newContent | Set-Content -Path 'main.c'
|
||||||
gcc --version
|
gcc --version
|
||||||
make --version
|
make --version
|
||||||
make
|
make
|
||||||
|
$exitStatus = $?
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
if($? -eq 1) {
|
if($exitStatus -eq 1) {
|
||||||
Write-Host -ForegroundColor green "Built the WIN32-MingW Full Demo"
|
echo "${{ env.pwshPass }} ${{ env.stepName }} ${{env.pwshEnd}}"
|
||||||
}else {
|
}else {
|
||||||
Write-Host -ForegroundColor red "Build WIN32-MingW Full Demo Failed..."
|
echo "${{ env.pwshFail }} ${{ env.stepName }} ${{env.pwshEnd}}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
- name: Run and monitor WIN32-MingW Full Demo
|
- env:
|
||||||
if: success() || failure() && steps.build-win32-mingw-full-demo.outcome == 'success'
|
stepName: Run and monitor WIN32-MingW Full Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
with:
|
with:
|
||||||
exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe
|
exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe
|
||||||
log-dir: demo_run_logs
|
|
||||||
timeout-seconds: 60
|
timeout-seconds: 60
|
||||||
success-line: "No errors - tick count"
|
success-line: "No errors - tick count"
|
||||||
|
|
||||||
- name: Build WIN32-MingW Blinky Demo
|
- env:
|
||||||
|
stepName: Build WIN32-MingW Blinky Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
id: build-win32-mingw-blinky-demo
|
id: build-win32-mingw-blinky-demo
|
||||||
working-directory: FreeRTOS/Demo/WIN32-MingW
|
working-directory: FreeRTOS/Demo/WIN32-MingW
|
||||||
run: |
|
run: |
|
||||||
# Build WIN32-MingW Blinky Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build WIN32-MingW Blinky Demo"
|
echo "::group::${{ env.stepName }}"
|
||||||
$content = Get-Content -Path 'main.c' -Raw
|
$content = Get-Content -Path 'main.c' -Raw
|
||||||
$newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1'
|
$newContent = $content -replace '#define\s+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\s+0', '#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1'
|
||||||
|
$newContent = $newContent -replace 'int\s+main(.*?)void(.*?)\r?\n\s*{', 'int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );'
|
||||||
$newContent | Set-Content -Path 'main.c'
|
$newContent | Set-Content -Path 'main.c'
|
||||||
gcc --version
|
gcc --version
|
||||||
make --version
|
make --version
|
||||||
make
|
make
|
||||||
|
$exitStatus = $?
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
if($? -eq 1) {
|
if($exitStatus -eq 1) {
|
||||||
Write-Host -ForegroundColor green "Built the WIN32-MingW Blinky Demo"
|
echo "${{ env.pwshPass }} ${{ env.stepName }} ${{ env.pwshEnd }}"
|
||||||
}else {
|
}else {
|
||||||
Write-Host -ForegroundColor red "Build WIN32-MingW Blinky Demo Failed..."
|
echo "${{ env.pwshFail }} ${{ env.stepName }} ${{ env.pwshEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
- name: Run and monitor WIN32-MingW Blinky Demo
|
- env:
|
||||||
if: success() || failure() && steps.build-win32-mingw-blinky-demo.outcome == 'success'
|
stepName: Run and monitor WIN32-MingW Blinky Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
with:
|
with:
|
||||||
exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe
|
exe-path: FreeRTOS/Demo/WIN32-MingW/build/RTOSDemo.exe
|
||||||
log-dir: demo_run_logs
|
|
||||||
timeout-seconds: 60
|
timeout-seconds: 60
|
||||||
success-line: "Message received from software timer"
|
success-line: "Message received from software timer"
|
||||||
|
|
||||||
|
@ -197,96 +232,111 @@ jobs:
|
||||||
name: Posix GCC
|
name: Posix GCC
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- env:
|
||||||
uses: actions/checkout@v2
|
stepName: Checkout Repository
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Fetch Kernel Submodule
|
- env:
|
||||||
|
stepName: Fetch Kernel Submodule
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Fetch Kernel Submodule
|
# ${{ env.stepName }}
|
||||||
echo "::group::Fetch Kernel Submodule"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
||||||
echo "::endgroup::"
|
set -e
|
||||||
if [ "$?" = "0" ]; then
|
exitStatus=$?
|
||||||
echo -e "\033[32;3mCloned the Kernel\033[0m"
|
set -e
|
||||||
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mKernel Clone Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Install GCC
|
- env:
|
||||||
|
stepName: Install GCC
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Install GCC
|
# ${{ env.stepName }}
|
||||||
echo "::group::Install GCC"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
sudo apt-get -y install build-essential
|
sudo apt-get -y install build-essential
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\e[0;32mInstall GCC Passed\e[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\e[0;32mInstall GCC Failed\e[0m"
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
# If there is an error, set this flag high again so the exit 1 fails the run
|
|
||||||
set -e
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build Posix_GCC Demo for Coverage Test
|
- env:
|
||||||
shell: bash
|
stepName: Build Posix_GCC Full Demo
|
||||||
working-directory: FreeRTOS/Demo/Posix_GCC
|
name: ${{ env.stepName }}
|
||||||
run: make -j COVERAGE_TEST=1
|
|
||||||
|
|
||||||
- name: Build Posix_GCC Full Demo
|
|
||||||
id: build-posix-gcc-full-demo
|
id: build-posix-gcc-full-demo
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/Posix_GCC
|
working-directory: FreeRTOS/Demo/Posix_GCC
|
||||||
run: |
|
run: |
|
||||||
# Build Posix_GCC Full Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build Posix_GCC Full Demo"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
sed -i -z "s/int[[:space:]]*main[[:space:]]*([[:space:]]*void[[:space:]]*)\n{/int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );/g" main.c
|
sed -i -z "s/int[[:space:]]*main[[:space:]]*([[:space:]]*void[[:space:]]*)\n{/int main( void ){setvbuf( stdout, NULL, _IONBF, 0 );/g" main.c
|
||||||
make clean
|
|
||||||
make -j
|
make -j
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\033[32;3mBuild Posix_GCC Full Demo Passed\033[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild Posix_GCC Full Demo Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Run and monitor Posix_GCC Full Demo
|
- env:
|
||||||
if: success() || failure() && steps.build-posix-gcc-full-demo.outcome == 'success'
|
stepName: Run and monitor Posix_GCC Full Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
with:
|
with:
|
||||||
exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo
|
exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo
|
||||||
log-dir: demo_run_logs
|
timeout-seconds: 60
|
||||||
timeout-seconds: 60
|
success-line: "OK: No errors"
|
||||||
success-line: "OK: No errors"
|
retry-attempts: 3
|
||||||
|
|
||||||
- name: Build Posix_GCC Blinky Demo
|
- env:
|
||||||
|
stepName: Build Posix_GCC Blinky Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
id: build-posix-gcc-blinky-demo
|
id: build-posix-gcc-blinky-demo
|
||||||
if: success() || failure()
|
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/Posix_GCC
|
working-directory: FreeRTOS/Demo/Posix_GCC
|
||||||
run: |
|
run: |
|
||||||
# Build Posix_GCC Blinky Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build Posix_GCC Blinky Demo"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
set +e
|
||||||
make -j USER_DEMO=BLINKY_DEMO
|
make -j USER_DEMO=BLINKY_DEMO
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\033[32;3mBuilt the Posix_GCC Blinky Demo\033[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild Posix_GCC Blinky Demo Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{env.stepName}} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Run and monitor Posix_GCC Blinky Demo
|
- env:
|
||||||
if: success() || failure() && steps.build-posix-gcc-blinky-demo.outcome == 'success'
|
stepName: Run and monitor Posix_GCC Blinky Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
with:
|
with:
|
||||||
exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo
|
exe-path: FreeRTOS/Demo/Posix_GCC/build/posix_demo
|
||||||
log-dir: demo_run_logs
|
|
||||||
timeout-seconds: 60
|
timeout-seconds: 60
|
||||||
success-line: "Message received from software timer"
|
success-line: "Message received from software timer"
|
||||||
|
|
||||||
|
@ -294,208 +344,290 @@ jobs:
|
||||||
name: GNU MSP430 Toolchain
|
name: GNU MSP430 Toolchain
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- env:
|
||||||
uses: actions/checkout@v2
|
stepName: Checkout Repository
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
- name: Fetch Kernel Submodule
|
- env:
|
||||||
shell: bash
|
stepName: Fetch Kernel Submodule
|
||||||
run: |
|
name: ${{ env.stepName }}
|
||||||
# Fetch Kernel Submodule
|
shell: bash
|
||||||
echo "::group::Fetch Kernel Submodule"
|
run: |
|
||||||
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
# ${{ env.stepName }}
|
||||||
echo "::endgroup::"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
if [ "$?" = "0" ]; then
|
set +e
|
||||||
echo -e "\033[32;3mCloned the Kernel\033[0m"
|
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
||||||
else
|
exitStatus=$?
|
||||||
echo -e "\033[32;31mKernel Clone Failed...\033[0m"
|
set -e
|
||||||
exit 1
|
echo -e "::endgroup::"
|
||||||
fi
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
else
|
||||||
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Install MSP430 Toolchain
|
- env:
|
||||||
shell: bash
|
stepName: Install MSP430 Toolchain
|
||||||
run: |
|
name: ${{ env.stepName }}
|
||||||
# Install MSP430 Toolchain
|
shell: bash
|
||||||
echo "::group::Install MSP430 Toolchain"
|
run: |
|
||||||
sudo apt-get -y update
|
# ${{ env.stepName }}
|
||||||
sudo apt-get -y install gcc-msp430 build-essential
|
echo -e "::group::${{ env.stepName }}"
|
||||||
echo "::endgroup::"
|
set +e
|
||||||
if [ "$?" = "0" ]; then
|
sudo apt-get -y update
|
||||||
echo -e "\033[32;3mInstalled the MSP430 Toolchain\033[0m"
|
sudo apt-get -y install gcc-msp430 build-essential
|
||||||
else
|
exitStatus=$?
|
||||||
echo -e "\033[32;31mInstalling the MSP430 ToolchainFailed...\033[0m"
|
set -e
|
||||||
exit 1
|
echo -e "::endgroup::"
|
||||||
fi
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
else
|
||||||
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Build msp430_GCC Demo
|
- env:
|
||||||
shell: bash
|
stepName: Build msp430_GCC Demo
|
||||||
working-directory: FreeRTOS/Demo/msp430_GCC
|
name: ${{ env.stepName }}
|
||||||
run: |
|
shell: bash
|
||||||
# Build msp430_GCC Demo
|
working-directory: FreeRTOS/Demo/msp430_GCC
|
||||||
echo "::group::Build msp430_GCC Demo"
|
run: |
|
||||||
make -j
|
# ${{ env.stepName }}
|
||||||
echo "::endgroup::"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
if [ "$?" = "0" ]; then
|
set +e
|
||||||
echo -e "\033[32;3mBuilt the msp430_GCC Demo\033[0m"
|
make -j
|
||||||
else
|
exitStatus=$?
|
||||||
echo -e "\033[32;31mBuilding the msp430_GCC Demo Failed...\033[0m"
|
set -e
|
||||||
exit 1
|
echo -e "::endgroup::"
|
||||||
fi
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
else
|
||||||
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
ARM-GCC:
|
ARM-GCC:
|
||||||
name: GNU ARM Toolchain
|
name: GNU ARM Toolchain
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- env:
|
||||||
uses: actions/checkout@v2
|
stepName: Checkout Repository
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Fetch Kernel Submodule
|
- env:
|
||||||
|
stepName: Fetch Kernel Submodule
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Fetch Kernel Submodule
|
# ${{ env.stepName }}
|
||||||
echo "::group::Fetch Kernel Submodule"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
git submodule update --checkout --init --depth 1 FreeRTOS/Source
|
set +e
|
||||||
echo "::endgroup::"
|
git submodule update --checkout --init --depth 1 FreeRTOS/Source FreeRTOS/Demo/ThirdParty/Community-Supported-Demos
|
||||||
if [ "$?" = "0" ]; then
|
exitStatus=$?
|
||||||
echo -e "\033[32;3mCloned the Kernel\033[0m"
|
set -e
|
||||||
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mKernel Clone Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Fetch Community-Supported-Demos Submodule
|
- env:
|
||||||
|
stepName: Install GNU ARM Toolchain
|
||||||
|
name: Install GNU ARM Toolchain
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Fetch Community-Supported-Demos Submodule
|
# ${{ env.stepName }}
|
||||||
echo "::group::Fetch Community-Supported-Demos Submodule"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
git submodule update --checkout --init --depth 1 FreeRTOS/Demo/ThirdParty/Community-Supported-Demos
|
set +e
|
||||||
echo "::engdroup::"
|
|
||||||
if [ "$?" = "0" ]; then
|
|
||||||
echo -e "\033[32;3mCloned the Community-Supported-Demos\033[0m"
|
|
||||||
else
|
|
||||||
echo -e "\033[32;31mCommunity-Supported-Demos Clone Failed...\033[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Install GNU ARM Toolchain
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
# Install GNU ARM Toolchain
|
|
||||||
echo "::group::Install GNU ARM Toolchain"
|
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
sudo apt-get -y install gcc-arm-none-eabi build-essential cmake git ninja-build python3-minimal
|
sudo apt-get -y install gcc-arm-none-eabi build-essential cmake git ninja-build python3-minimal
|
||||||
echo "::endgroup::"
|
sudo apt-get -y install qemu-system-arm qemu-efi
|
||||||
if [ "$?" = "0" ]; then
|
exitStatus=$?
|
||||||
echo -e "\033[32;3mInstalled the GNU ARM Toolchain\033[0m"
|
set -e
|
||||||
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mInstalling GNU ARM Toolchain Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo
|
- env:
|
||||||
|
stepName: Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/CORTEX_MPU_M3_MPS2_QEMU_GCC
|
working-directory: FreeRTOS/Demo/CORTEX_MPU_M3_MPS2_QEMU_GCC
|
||||||
run: |
|
run: |
|
||||||
# Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build CORTEX_MPU_M3_MPS2_QEMU_GCC Demo"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
make -j
|
make -j
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\033[32;3mBuild CORTEX_MPU_M3_MPS2_QEMU_GCC Demo\033[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild CORTEX_MPU_M3_MPS2_QEMU_GCC Demo Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build CORTEX_LM3S102_GCC Demo
|
- env:
|
||||||
|
stepName: Build CORTEX_LM3S102_GCC Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/CORTEX_LM3S102_GCC
|
working-directory: FreeRTOS/Demo/CORTEX_LM3S102_GCC
|
||||||
run: |
|
run: |
|
||||||
# Build CORTEX_LM3S102_GCC Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build CORTEX_LM3S102_GCC Demo"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
make -j
|
set +e
|
||||||
echo "::endgroup::"
|
|
||||||
if [ "$?" = "0" ]; then
|
|
||||||
echo -e "\033[32;3mBuilt the CORTEX_LM3S102_GCC Demo Kernel\033[0m"
|
|
||||||
else
|
|
||||||
echo -e "\033[32;31mBuild CORTEX_LM3S102_GCC Demo Failed...\033[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build CORTEX_M3_MPS2_QEMU_GCC Demo
|
|
||||||
shell: bash
|
|
||||||
working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC
|
|
||||||
run: |
|
|
||||||
# Build CORTEX_M3_MPS2_QEMU_GCC Demo
|
|
||||||
echo "::group::Build CORTEX_M3_MPS2_QEMU_GCC Demo"
|
|
||||||
make clean
|
make clean
|
||||||
make -j
|
make -j
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\033[32;3mBuilt the CORTEX_M3_MPS2_QEMU_GCC Demo\033[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild CORTEX_M3_MPS2_QEMU_GCC Demo Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build CORTEX_M3_MPS2_QEMU_GCC Full Demo
|
- env:
|
||||||
|
stepName: Build CORTEX_M3_MPS2_QEMU_GCC Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC
|
working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC
|
||||||
run: |
|
run: |
|
||||||
# Build CORTEX_M3_MPS2_QEMU_GCC Full Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build CORTEX_M3_MPS2_QEMU_GCC Full Demo"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
|
make clean
|
||||||
|
make -j
|
||||||
|
exitStatus=$?
|
||||||
|
set -e
|
||||||
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
else
|
||||||
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- env:
|
||||||
|
stepName: Build CORTEX_M3_MPS2_QEMU_GCC Full Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
shell: bash
|
||||||
|
working-directory: FreeRTOS/Demo/CORTEX_M3_MPS2_QEMU_GCC
|
||||||
|
run: |
|
||||||
|
# ${{ env.stepName }}
|
||||||
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
make clean
|
make clean
|
||||||
make FULL_DEMO=1 -j
|
make FULL_DEMO=1 -j
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\033[32;3mBuilt the CORTEX_M3_MPS2_QEMU_GCC Full Demo\033[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild CORTEX_M3_MPS2_QEMU_GCC Full Demo Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build CORTEX_LM3S811_GCC Demo
|
- env:
|
||||||
|
stepName: Build CORTEX_LM3S811_GCC Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/CORTEX_LM3S811_GCC
|
working-directory: FreeRTOS/Demo/CORTEX_LM3S811_GCC
|
||||||
run: |
|
run: |
|
||||||
# Build CORTEX_LM3S811_GCC Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build CORTEX_LM3S811_GCC Demo"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
make -j
|
make -j
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\033[32;3mBuilt the CORTEX_LM3S811_GCC Demo\033[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild CORTEX_LM3S811_GCC Demo Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build CORTEX_M0+_RP2040 Demos
|
- env:
|
||||||
|
stepName: Build CORTEX_M0+_RP2040 Demos
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/CORTEX_M0+_RP2040
|
working-directory: FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/CORTEX_M0+_RP2040
|
||||||
run: |
|
run: |
|
||||||
# Build CORTEX_M0+_RP2040 Demos
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build CORTEX_M0+_RP2040 Demos"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
git clone https://github.com/raspberrypi/pico-sdk.git
|
set +e
|
||||||
cmake -B build -DPICO_SDK_PATH=pico-sdk -GNinja
|
git clone https://github.com/raspberrypi/pico-sdk.git
|
||||||
ninja -C build --verbose
|
cmake -B build -DPICO_SDK_PATH=pico-sdk -GNinja
|
||||||
echo "::endgroup::"
|
ninja -C build --verbose
|
||||||
if [ "$?" = "0" ]; then
|
exitStatus=$?
|
||||||
echo -e "\033[32;3mBuilt CORTEX_M0+_RP2040 Demos\033[0m"
|
set -e
|
||||||
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
else
|
||||||
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- env:
|
||||||
|
stepName: Build Qemu Runner File
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
shell: bash
|
||||||
|
working-directory: .github/scripts
|
||||||
|
run: |
|
||||||
|
# ${{ env.stepName }}
|
||||||
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
gcc qemu_reader.c -o ../../FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/qemu_reader.out
|
||||||
|
exitStatus=$?
|
||||||
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild CORTEX_M0+_RP2040 Demos Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build CORTEX_MPS2_QEMU_IAR_GCC Demo
|
- env:
|
||||||
|
stepName: Build CORTEX_MPS2_QEMU_IAR_GCC Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC
|
working-directory: FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC
|
||||||
run: |
|
run: |
|
||||||
# Build CORTEX_MPS2_QEMU_IAR_GCC Demo
|
# ${{ env.stepName }}
|
||||||
echo "::group::Build CORTEX_MPS2_QEMU_IAR_GCC Demo"
|
echo -e "::group::${{ env.stepName }}"
|
||||||
|
set +e
|
||||||
make -C build/gcc -j
|
make -C build/gcc -j
|
||||||
echo "::endgroup::"
|
exitStatus=$?
|
||||||
if [ "$?" = "0" ]; then
|
set -e
|
||||||
echo -e "\033[32;3mBuilt the CORTEX_MPS2_QEMU_IAR_GCC Demo\033[0m"
|
echo -e "::endgroup::"
|
||||||
|
if [ $exitStatus -eq 0 ]; then
|
||||||
|
echo -e "${{ env.bashPass }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
else
|
else
|
||||||
echo -e "\033[32;31mBuild CORTEX_MPS2_QEMU_IAR_GCC Demo Failed...\033[0m"
|
echo -e "${{ env.bashFail }} ${{ env.stepName }} ${{ env.bashEnd }}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- env:
|
||||||
|
stepName: Run and monitor CORTEX_MPS2_QEMU_IAR_GCC Demo
|
||||||
|
name: ${{ env.stepName }}
|
||||||
|
uses: FreeRTOS/CI-CD-GitHub-Actions/executable-monitor@main
|
||||||
|
with:
|
||||||
|
exe-path: FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/qemu_reader.out
|
||||||
|
timeout-seconds: 20
|
||||||
|
success-line: "Message received from software timer"
|
||||||
|
retry-attempts: 1
|
||||||
|
|
1189
.github/workflows/freertos_plus_demos.yml
vendored
1189
.github/workflows/freertos_plus_demos.yml
vendored
File diff suppressed because it is too large
Load diff
6
.github/workflows/kernel-unit-tests.yml
vendored
6
.github/workflows/kernel-unit-tests.yml
vendored
|
@ -7,7 +7,7 @@ jobs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
fetch-depth: 5
|
fetch-depth: 5
|
||||||
|
@ -42,12 +42,12 @@ jobs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
fetch-depth: 5
|
fetch-depth: 5
|
||||||
- name: Checkout the main branch from the FreeRTOS-Kernel repository
|
- name: Checkout the main branch from the FreeRTOS-Kernel repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
path: ./FreeRTOS/Source
|
path: ./FreeRTOS/Source
|
||||||
ref: main
|
ref: main
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[{000214A0-0000-0000-C000-000000000046}]
|
[{000214A0-0000-0000-C000-000000000046}]
|
||||||
Prop3=19,2
|
Prop3=19,2
|
||||||
[InternetShortcut]
|
[InternetShortcut]
|
||||||
URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html
|
URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html
|
||||||
IDList=
|
IDList=
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Source Files">
|
<Filter Include="Source Files">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.31205.134
|
VisualStudioVersion = 16.0.31205.134
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -160,8 +160,8 @@ static eReportBuilderStatus prvWritePortsArray( char * pcBuffer,
|
||||||
lCharactersWritten = snprintf( pcCurrentWritePos,
|
lCharactersWritten = snprintf( pcCurrentWritePos,
|
||||||
xRemainingBufferLength,
|
xRemainingBufferLength,
|
||||||
"{"
|
"{"
|
||||||
"\"" DEFENDER_REPORT_PORT_KEY "\":%u"
|
"\"" DEFENDER_REPORT_PORT_KEY "\":%u"
|
||||||
"},",
|
"},",
|
||||||
( unsigned int ) pusOpenPortsArray[ uxIdx ] );
|
( unsigned int ) pusOpenPortsArray[ uxIdx ] );
|
||||||
|
|
||||||
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
|
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
|
||||||
|
@ -238,9 +238,9 @@ static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
|
||||||
lCharactersWritten = snprintf( pcCurrentWritePos,
|
lCharactersWritten = snprintf( pcCurrentWritePos,
|
||||||
xRemainingBufferLength,
|
xRemainingBufferLength,
|
||||||
"{"
|
"{"
|
||||||
"\""DEFENDER_REPORT_LOCAL_PORT_KEY"\": %u,"
|
"\""DEFENDER_REPORT_LOCAL_PORT_KEY "\": %u,"
|
||||||
"\""DEFENDER_REPORT_REMOTE_ADDR_KEY"\": \"%u.%u.%u.%u:%u\""
|
"\""DEFENDER_REPORT_REMOTE_ADDR_KEY "\": \"%u.%u.%u.%u:%u\""
|
||||||
"},",
|
"},",
|
||||||
( unsigned int ) pxConn->usLocalPort,
|
( unsigned int ) pxConn->usLocalPort,
|
||||||
( unsigned int ) ( pxConn->ulRemoteIp >> 24 ) & 0xFF,
|
( unsigned int ) ( pxConn->ulRemoteIp >> 24 ) & 0xFF,
|
||||||
( unsigned int ) ( pxConn->ulRemoteIp >> 16 ) & 0xFF,
|
( unsigned int ) ( pxConn->ulRemoteIp >> 16 ) & 0xFF,
|
||||||
|
@ -399,13 +399,13 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
|
||||||
lCharactersWritten = snprintf( pcCurrentWritePos,
|
lCharactersWritten = snprintf( pcCurrentWritePos,
|
||||||
xRemainingBufferLength,
|
xRemainingBufferLength,
|
||||||
"{"
|
"{"
|
||||||
"\""DEFENDER_REPORT_HEADER_KEY"\": {"
|
"\""DEFENDER_REPORT_HEADER_KEY "\": {"
|
||||||
"\""DEFENDER_REPORT_ID_KEY"\": %u,"
|
"\""DEFENDER_REPORT_ID_KEY "\": %u,"
|
||||||
"\""DEFENDER_REPORT_VERSION_KEY"\": \"%u.%u\""
|
"\""DEFENDER_REPORT_VERSION_KEY "\": \"%u.%u\""
|
||||||
"},"
|
"},"
|
||||||
"\""DEFENDER_REPORT_METRICS_KEY"\": {"
|
"\""DEFENDER_REPORT_METRICS_KEY "\": {"
|
||||||
"\""DEFENDER_REPORT_TCP_LISTENING_PORTS_KEY"\": {"
|
"\""DEFENDER_REPORT_TCP_LISTENING_PORTS_KEY "\": {"
|
||||||
"\""DEFENDER_REPORT_PORTS_KEY"\": ",
|
"\""DEFENDER_REPORT_PORTS_KEY "\": ",
|
||||||
( unsigned int ) ulReportId,
|
( unsigned int ) ulReportId,
|
||||||
( unsigned int ) ulMajorReportVersion,
|
( unsigned int ) ulMajorReportVersion,
|
||||||
( unsigned int ) ulMinorReportVersion );
|
( unsigned int ) ulMinorReportVersion );
|
||||||
|
@ -447,11 +447,11 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
|
||||||
{
|
{
|
||||||
lCharactersWritten = snprintf( pcCurrentWritePos,
|
lCharactersWritten = snprintf( pcCurrentWritePos,
|
||||||
xRemainingBufferLength,
|
xRemainingBufferLength,
|
||||||
","
|
","
|
||||||
"\""DEFENDER_REPORT_TOTAL_KEY"\": %u"
|
"\""DEFENDER_REPORT_TOTAL_KEY "\": %u"
|
||||||
"},"
|
"},"
|
||||||
"\""DEFENDER_REPORT_UDP_LISTENING_PORTS_KEY"\": {"
|
"\""DEFENDER_REPORT_UDP_LISTENING_PORTS_KEY "\": {"
|
||||||
"\""DEFENDER_REPORT_PORTS_KEY"\": ",
|
"\""DEFENDER_REPORT_PORTS_KEY "\": ",
|
||||||
( unsigned int ) pxMetrics->xOpenTcpPortsArrayLength );
|
( unsigned int ) pxMetrics->xOpenTcpPortsArrayLength );
|
||||||
|
|
||||||
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
|
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
|
||||||
|
@ -491,18 +491,18 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
|
||||||
{
|
{
|
||||||
lCharactersWritten = snprintf( pcCurrentWritePos,
|
lCharactersWritten = snprintf( pcCurrentWritePos,
|
||||||
xRemainingBufferLength,
|
xRemainingBufferLength,
|
||||||
","
|
","
|
||||||
"\""DEFENDER_REPORT_TOTAL_KEY"\": %u"
|
"\""DEFENDER_REPORT_TOTAL_KEY "\": %u"
|
||||||
"},"
|
"},"
|
||||||
"\""DEFENDER_REPORT_NETWORK_STATS_KEY"\": {"
|
"\""DEFENDER_REPORT_NETWORK_STATS_KEY "\": {"
|
||||||
"\""DEFENDER_REPORT_BYTES_IN_KEY"\": %u,"
|
"\""DEFENDER_REPORT_BYTES_IN_KEY "\": %u,"
|
||||||
"\""DEFENDER_REPORT_BYTES_OUT_KEY"\": %u,"
|
"\""DEFENDER_REPORT_BYTES_OUT_KEY "\": %u,"
|
||||||
"\""DEFENDER_REPORT_PKTS_IN_KEY"\": %u,"
|
"\""DEFENDER_REPORT_PKTS_IN_KEY "\": %u,"
|
||||||
"\""DEFENDER_REPORT_PKTS_OUT_KEY"\": %u"
|
"\""DEFENDER_REPORT_PKTS_OUT_KEY "\": %u"
|
||||||
"},"
|
"},"
|
||||||
"\""DEFENDER_REPORT_TCP_CONNECTIONS_KEY"\": {"
|
"\""DEFENDER_REPORT_TCP_CONNECTIONS_KEY "\": {"
|
||||||
"\""DEFENDER_REPORT_ESTABLISHED_CONNECTIONS_KEY"\": {"
|
"\""DEFENDER_REPORT_ESTABLISHED_CONNECTIONS_KEY "\": {"
|
||||||
"\""DEFENDER_REPORT_CONNECTIONS_KEY"\": ",
|
"\""DEFENDER_REPORT_CONNECTIONS_KEY "\": ",
|
||||||
( unsigned int ) pxMetrics->xOpenUdpPortsArrayLength,
|
( unsigned int ) pxMetrics->xOpenUdpPortsArrayLength,
|
||||||
( unsigned int ) pxMetrics->pxNetworkStats->uxBytesReceived,
|
( unsigned int ) pxMetrics->pxNetworkStats->uxBytesReceived,
|
||||||
( unsigned int ) pxMetrics->pxNetworkStats->uxBytesSent,
|
( unsigned int ) pxMetrics->pxNetworkStats->uxBytesSent,
|
||||||
|
@ -546,20 +546,20 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
|
||||||
{
|
{
|
||||||
lCharactersWritten = snprintf( pcCurrentWritePos,
|
lCharactersWritten = snprintf( pcCurrentWritePos,
|
||||||
xRemainingBufferLength,
|
xRemainingBufferLength,
|
||||||
","
|
","
|
||||||
"\""DEFENDER_REPORT_TOTAL_KEY"\": %u"
|
"\""DEFENDER_REPORT_TOTAL_KEY "\": %u"
|
||||||
"}"
|
"}"
|
||||||
"}"
|
"}"
|
||||||
"},"
|
"},"
|
||||||
"\""DEFENDER_REPORT_CUSTOM_METRICS_KEY"\": {"
|
"\""DEFENDER_REPORT_CUSTOM_METRICS_KEY "\": {"
|
||||||
"\"stack_high_water_mark\": ["
|
"\"stack_high_water_mark\": ["
|
||||||
"{"
|
"{"
|
||||||
"\""DEFENDER_REPORT_NUMBER_KEY"\": %u"
|
"\""DEFENDER_REPORT_NUMBER_KEY "\": %u"
|
||||||
"}"
|
"}"
|
||||||
"],"
|
"],"
|
||||||
"\"task_numbers\": ["
|
"\"task_numbers\": ["
|
||||||
"{"
|
"{"
|
||||||
"\""DEFENDER_REPORT_NUMBER_LIST_KEY"\": ",
|
"\""DEFENDER_REPORT_NUMBER_LIST_KEY "\": ",
|
||||||
( unsigned int ) pxMetrics->xEstablishedConnectionsArrayLength,
|
( unsigned int ) pxMetrics->xEstablishedConnectionsArrayLength,
|
||||||
( unsigned int ) pxMetrics->ulStackHighWaterMark );
|
( unsigned int ) pxMetrics->ulStackHighWaterMark );
|
||||||
|
|
||||||
|
@ -600,9 +600,9 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
|
||||||
{
|
{
|
||||||
lCharactersWritten = snprintf( pcCurrentWritePos,
|
lCharactersWritten = snprintf( pcCurrentWritePos,
|
||||||
xRemainingBufferLength,
|
xRemainingBufferLength,
|
||||||
"}"
|
"}"
|
||||||
"]"
|
"]"
|
||||||
"}"
|
"}"
|
||||||
"}" );
|
"}" );
|
||||||
|
|
||||||
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
|
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, xRemainingBufferLength ) )
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Source Files">
|
<Filter Include="Source Files">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -20,8 +20,10 @@
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CORE_MQTT_CONFIG_H
|
#ifndef CORE_MQTT_CONFIG_H
|
||||||
#define CORE_MQTT_CONFIG_H
|
#define CORE_MQTT_CONFIG_H
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -220,7 +220,7 @@ extern void vLoggingPrintf( const char * pcFormatString,
|
||||||
* @brief The name of the MQTT library used and its version, following an "@"
|
* @brief The name of the MQTT library used and its version, following an "@"
|
||||||
* symbol.
|
* symbol.
|
||||||
*/
|
*/
|
||||||
#include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */
|
#include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */
|
||||||
#define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION
|
#define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* AWS IoT Device SDK for Embedded C V202009.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -18,6 +18,10 @@
|
||||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* https://www.FreeRTOS.org
|
||||||
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SHADOW_CONFIG_H
|
#ifndef SHADOW_CONFIG_H
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.31205.134
|
VisualStudioVersion = 16.0.31205.134
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -316,11 +316,11 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
|
||||||
configASSERT( pxDeserializedInfo->pPublishInfo != NULL );
|
configASSERT( pxDeserializedInfo->pPublishInfo != NULL );
|
||||||
pxPublishInfo = pxDeserializedInfo->pPublishInfo;
|
pxPublishInfo = pxDeserializedInfo->pPublishInfo;
|
||||||
|
|
||||||
xStatus = FleetProvisioning_MatchTopic(pxPublishInfo->pTopicName,
|
xStatus = FleetProvisioning_MatchTopic( pxPublishInfo->pTopicName,
|
||||||
pxPublishInfo->topicNameLength,
|
pxPublishInfo->topicNameLength,
|
||||||
&xApi);
|
&xApi );
|
||||||
|
|
||||||
if (xStatus != FleetProvisioningSuccess)
|
if( xStatus != FleetProvisioningSuccess )
|
||||||
{
|
{
|
||||||
LogWarn( ( "Unexpected publish message received. Topic: %.*s.",
|
LogWarn( ( "Unexpected publish message received. Topic: %.*s.",
|
||||||
( int ) pxPublishInfo->topicNameLength,
|
( int ) pxPublishInfo->topicNameLength,
|
||||||
|
@ -328,7 +328,7 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (xApi == FleetProvCborCreateCertFromCsrAccepted)
|
if( xApi == FleetProvCborCreateCertFromCsrAccepted )
|
||||||
{
|
{
|
||||||
LogInfo( ( "Received accepted response from Fleet Provisioning CreateCertificateFromCsr API." ) );
|
LogInfo( ( "Received accepted response from Fleet Provisioning CreateCertificateFromCsr API." ) );
|
||||||
|
|
||||||
|
@ -341,13 +341,13 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
|
||||||
|
|
||||||
xPayloadLength = pxPublishInfo->payloadLength;
|
xPayloadLength = pxPublishInfo->payloadLength;
|
||||||
}
|
}
|
||||||
else if (xApi == FleetProvCborCreateCertFromCsrRejected)
|
else if( xApi == FleetProvCborCreateCertFromCsrRejected )
|
||||||
{
|
{
|
||||||
LogError( ( "Received rejected response from Fleet Provisioning CreateCertificateFromCsr API." ) );
|
LogError( ( "Received rejected response from Fleet Provisioning CreateCertificateFromCsr API." ) );
|
||||||
|
|
||||||
xResponseStatus = ResponseRejected;
|
xResponseStatus = ResponseRejected;
|
||||||
}
|
}
|
||||||
else if (xApi == FleetProvCborRegisterThingAccepted)
|
else if( xApi == FleetProvCborRegisterThingAccepted )
|
||||||
{
|
{
|
||||||
LogInfo( ( "Received accepted response from Fleet Provisioning RegisterThing API." ) );
|
LogInfo( ( "Received accepted response from Fleet Provisioning RegisterThing API." ) );
|
||||||
|
|
||||||
|
@ -360,7 +360,7 @@ static void prvProvisioningPublishCallback( MQTTContext_t * pxMqttContext,
|
||||||
|
|
||||||
xPayloadLength = pxPublishInfo->payloadLength;
|
xPayloadLength = pxPublishInfo->payloadLength;
|
||||||
}
|
}
|
||||||
else if (xApi == FleetProvCborRegisterThingRejected)
|
else if( xApi == FleetProvCborRegisterThingRejected )
|
||||||
{
|
{
|
||||||
LogError( ( "Received rejected response from Fleet Provisioning RegisterThing API." ) );
|
LogError( ( "Received rejected response from Fleet Provisioning RegisterThing API." ) );
|
||||||
|
|
||||||
|
@ -804,7 +804,7 @@ int prvFleetProvisioningTask( void * pvParameters )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogInfo( ( "Sucessfully established connection with provisioned credentials." ) );
|
LogInfo( ( "Successfully established connection with provisioned credentials." ) );
|
||||||
xConnectionEstablished = true;
|
xConnectionEstablished = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.33027.164
|
VisualStudioVersion = 16.0.33027.164
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Source">
|
<Filter Include="Source">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Source Files">
|
<Filter Include="Source Files">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -20,8 +20,10 @@
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CORE_MQTT_CONFIG_H
|
#ifndef CORE_MQTT_CONFIG_H
|
||||||
#define CORE_MQTT_CONFIG_H
|
#define CORE_MQTT_CONFIG_H
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -213,7 +213,7 @@ extern void vLoggingPrintf( const char * pcFormatString,
|
||||||
* @brief The name of the MQTT library used and its version, following an "@"
|
* @brief The name of the MQTT library used and its version, following an "@"
|
||||||
* symbol.
|
* symbol.
|
||||||
*/
|
*/
|
||||||
#include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */
|
#include "core_mqtt.h" /* Include coreMQTT header for MQTT_LIBRARY_VERSION macro. */
|
||||||
#define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION
|
#define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.31205.134
|
VisualStudioVersion = 16.0.31205.134
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -379,26 +379,28 @@ static TlsTransportStatus_t prvConnectToServerWithBackoffRetries( NetworkContext
|
||||||
uint16_t usNextRetryBackOff = 0U;
|
uint16_t usNextRetryBackOff = 0U;
|
||||||
|
|
||||||
#if defined( democonfigCLIENT_USERNAME )
|
#if defined( democonfigCLIENT_USERNAME )
|
||||||
/*
|
|
||||||
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
/*
|
||||||
* to AWS IoT Core with Custom Authentication on port 443.
|
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
||||||
*
|
* to AWS IoT Core with Custom Authentication on port 443.
|
||||||
* Custom Authentication uses the contents of the username and password
|
*
|
||||||
* fields of the MQTT CONNECT packet to authenticate the client.
|
* Custom Authentication uses the contents of the username and password
|
||||||
*
|
* fields of the MQTT CONNECT packet to authenticate the client.
|
||||||
* For more information, refer to the documentation at:
|
*
|
||||||
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
* For more information, refer to the documentation at:
|
||||||
*/
|
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
||||||
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
*/
|
||||||
#if democonfigMQTT_BROKER_PORT != 443U
|
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
||||||
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
#if democonfigMQTT_BROKER_PORT != 443U
|
||||||
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
||||||
|
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
||||||
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
||||||
/*
|
|
||||||
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
/*
|
||||||
* x509 Certificate Authentication.
|
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
||||||
*/
|
* x509 Certificate Authentication.
|
||||||
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
*/
|
||||||
|
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
||||||
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -377,26 +377,28 @@ static TlsTransportStatus_t prvConnectToServerWithBackoffRetries( NetworkContext
|
||||||
uint16_t usNextRetryBackOff = 0U;
|
uint16_t usNextRetryBackOff = 0U;
|
||||||
|
|
||||||
#if defined( democonfigCLIENT_USERNAME )
|
#if defined( democonfigCLIENT_USERNAME )
|
||||||
/*
|
|
||||||
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
/*
|
||||||
* to AWS IoT Core with Custom Authentication on port 443.
|
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
||||||
*
|
* to AWS IoT Core with Custom Authentication on port 443.
|
||||||
* Custom Authentication uses the contents of the username and password
|
*
|
||||||
* fields of the MQTT CONNECT packet to authenticate the client.
|
* Custom Authentication uses the contents of the username and password
|
||||||
*
|
* fields of the MQTT CONNECT packet to authenticate the client.
|
||||||
* For more information, refer to the documentation at:
|
*
|
||||||
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
* For more information, refer to the documentation at:
|
||||||
*/
|
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
||||||
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
*/
|
||||||
#if democonfigMQTT_BROKER_PORT != 443U
|
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
||||||
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
#if democonfigMQTT_BROKER_PORT != 443U
|
||||||
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
||||||
|
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
||||||
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
||||||
/*
|
|
||||||
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
/*
|
||||||
* x509 Certificate Authentication.
|
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
||||||
*/
|
* x509 Certificate Authentication.
|
||||||
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
*/
|
||||||
|
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
||||||
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -63,8 +63,8 @@
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Each compilation unit that consumes the NetworkContext must define it.
|
* @brief Each compilation unit that consumes the NetworkContext must define it.
|
||||||
* It should contain a single pointer to the type of your desired transport.
|
* It should contain a single pointer to the type of your desired transport.
|
||||||
* This utility is used by both TLS and plaintext HTTP demos, so define this pointer as void *.
|
* This utility is used by both TLS and plaintext HTTP demos, so define this pointer as void *.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -24,14 +24,14 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file aws_ota_codesigner_certificate.h
|
* @file aws_ota_codesigner_certificate.h
|
||||||
* @brief Code signer certificate as char array.
|
* @brief Code signer certificate as char array.
|
||||||
*
|
*
|
||||||
* Define this char array containing the PEM encode signing certificate.
|
* Define this char array containing the PEM encode signing certificate.
|
||||||
* Note - It is highly recommended to use this for demo purpose and store
|
* Note - It is highly recommended to use this for demo purpose and store
|
||||||
* certificates in secure location in production devices.
|
* certificates in secure location in production devices.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CODESIGNER_CERTIFICATE__H__
|
#ifndef __CODESIGNER_CERTIFICATE__H__
|
||||||
#define __CODESIGNER_CERTIFICATE__H__
|
#define __CODESIGNER_CERTIFICATE__H__
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -24,22 +24,22 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file code_signature_verification.h
|
* @file code_signature_verification.h
|
||||||
* @brief Interface for code signature verification functions.
|
* @brief Interface for code signature verification functions.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CODE_SIGNATURE_VERIFICATION_H
|
#ifndef CODE_SIGNATURE_VERIFICATION_H
|
||||||
#define CODE_SIGNATURE_VERIFICATION_H
|
#define CODE_SIGNATURE_VERIFICATION_H
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Validate the integrity of the new image to be activated.
|
* @brief Validate the integrity of the new image to be activated.
|
||||||
* @param[in] pFileContext pointer to File context
|
* @param[in] pFileContext pointer to File context
|
||||||
* @return OtaPalMainStatus_t , OtaPalSuccess if the signature of the image is valid.
|
* @return OtaPalMainStatus_t , OtaPalSuccess if the signature of the image is valid.
|
||||||
*/
|
*/
|
||||||
OtaPalMainStatus_t xValidateImageSignature( OtaFileContext_t* const pFileContext );
|
OtaPalMainStatus_t xValidateImageSignature( OtaFileContext_t * const pFileContext );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -24,25 +24,25 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file code_signature_verification_mbedtls.c
|
* @file code_signature_verification_mbedtls.c
|
||||||
* @brief Code signature verification using mbedtls crypto.
|
* @brief Code signature verification using mbedtls crypto.
|
||||||
*
|
*
|
||||||
* The file demonstrates implements the code signature verification functionality on
|
* The file demonstrates implements the code signature verification functionality on
|
||||||
* the specified file using mbedtls for SHA256 ECDSA.
|
* the specified file using mbedtls for SHA256 ECDSA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* C runtime includes. */
|
/* C runtime includes. */
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
/* mbedTLS includes. */
|
/* mbedTLS includes. */
|
||||||
#if !defined( MBEDTLS_CONFIG_FILE )
|
#if !defined( MBEDTLS_CONFIG_FILE )
|
||||||
#include "mbedtls_config_v3.2.1.h"
|
#include "mbedtls_config_v3.2.1.h"
|
||||||
#else
|
#else
|
||||||
#include MBEDTLS_CONFIG_FILE
|
#include MBEDTLS_CONFIG_FILE
|
||||||
#endif
|
#endif
|
||||||
#include "mbedtls/platform.h"
|
#include "mbedtls/platform.h"
|
||||||
#include "mbedtls/sha256.h"
|
#include "mbedtls/sha256.h"
|
||||||
|
@ -60,10 +60,10 @@
|
||||||
/**
|
/**
|
||||||
* @brief SHA256 buffer size for storing cryptographic hash computation results.
|
* @brief SHA256 buffer size for storing cryptographic hash computation results.
|
||||||
*/
|
*/
|
||||||
#define SHA256_DIGEST_BYTES 32
|
#define SHA256_DIGEST_BYTES 32
|
||||||
|
|
||||||
/* Size of buffer used in file operations on this platform (Windows). */
|
/* Size of buffer used in file operations on this platform (Windows). */
|
||||||
#define OTA_PAL_WIN_BUF_SIZE ( ( size_t ) 4096UL )
|
#define OTA_PAL_WIN_BUF_SIZE ( ( size_t ) 4096UL )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Library-independent cryptographic algorithm identifiers.
|
* @brief Library-independent cryptographic algorithm identifiers.
|
||||||
|
@ -73,9 +73,9 @@
|
||||||
#define ASYMMETRIC_ALGORITHM_RSA 1
|
#define ASYMMETRIC_ALGORITHM_RSA 1
|
||||||
#define ASYMMETRIC_ALGORITHM_ECDSA 2
|
#define ASYMMETRIC_ALGORITHM_ECDSA 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Internal signature verification context structure.
|
* @brief Internal signature verification context structure.
|
||||||
*/
|
*/
|
||||||
typedef struct SignatureVerificationState
|
typedef struct SignatureVerificationState
|
||||||
{
|
{
|
||||||
BaseType_t xAsymmetricAlgorithm;
|
BaseType_t xAsymmetricAlgorithm;
|
||||||
|
@ -92,9 +92,9 @@ typedef struct SignatureVerificationState
|
||||||
*
|
*
|
||||||
* @return pdTRUE if initialization succeeds, or pdFALSE otherwise.
|
* @return pdTRUE if initialization succeeds, or pdFALSE otherwise.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvSignatureVerificationStart(void** ppvContext,
|
static BaseType_t prvSignatureVerificationStart( void ** ppvContext,
|
||||||
BaseType_t xAsymmetricAlgorithm,
|
BaseType_t xAsymmetricAlgorithm,
|
||||||
BaseType_t xHashAlgorithm);
|
BaseType_t xHashAlgorithm );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Updates a cryptographic hash computation with the specified byte array.
|
* @brief Updates a cryptographic hash computation with the specified byte array.
|
||||||
|
@ -103,9 +103,9 @@ static BaseType_t prvSignatureVerificationStart(void** ppvContext,
|
||||||
* @param[in] pucData Byte array that was signed.
|
* @param[in] pucData Byte array that was signed.
|
||||||
* @param[in] xDataLength Length in bytes of data that was signed.
|
* @param[in] xDataLength Length in bytes of data that was signed.
|
||||||
*/
|
*/
|
||||||
static void prvSignatureVerificationUpdate(void* pvContext,
|
static void prvSignatureVerificationUpdate( void * pvContext,
|
||||||
const uint8_t* pucData,
|
const uint8_t * pucData,
|
||||||
size_t xDataLength);
|
size_t xDataLength );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Verifies a digital signature computation using the public key from the
|
* @brief Verifies a digital signature computation using the public key from the
|
||||||
|
@ -120,41 +120,41 @@ static void prvSignatureVerificationUpdate(void* pvContext,
|
||||||
*
|
*
|
||||||
* @return pdTRUE if the signature is correct or pdFALSE if the signature is invalid.
|
* @return pdTRUE if the signature is correct or pdFALSE if the signature is invalid.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvSignatureVerificationFinal(void* pvContext,
|
static BaseType_t prvSignatureVerificationFinal( void * pvContext,
|
||||||
char* pcSignerCertificate,
|
char * pcSignerCertificate,
|
||||||
size_t xSignerCertificateLength,
|
size_t xSignerCertificateLength,
|
||||||
uint8_t* pucSignature,
|
uint8_t * pucSignature,
|
||||||
size_t xSignatureLength);
|
size_t xSignatureLength );
|
||||||
|
|
||||||
/* Read the specified signer certificate from the filesystem into a local buffer. The allocated
|
/* Read the specified signer certificate from the filesystem into a local buffer. The allocated
|
||||||
* memory becomes the property of the caller who is responsible for freeing it.
|
* memory becomes the property of the caller who is responsible for freeing it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint8_t* otaPal_ReadAndAssumeCertificate(const uint8_t* const pucCertName,
|
static uint8_t * otaPal_ReadAndAssumeCertificate( const uint8_t * const pucCertName,
|
||||||
uint32_t* const ulSignerCertSize)
|
uint32_t * const ulSignerCertSize )
|
||||||
{
|
{
|
||||||
FILE* pFile;
|
FILE * pFile;
|
||||||
uint8_t* pucSignerCert = NULL;
|
uint8_t * pucSignerCert = NULL;
|
||||||
uint8_t* pucCertData = NULL;
|
uint8_t * pucCertData = NULL;
|
||||||
int32_t lSize = 0; /* For MISRA mandatory. */
|
int32_t lSize = 0; /* For MISRA mandatory. */
|
||||||
int32_t lWindowsError;
|
int32_t lWindowsError;
|
||||||
|
|
||||||
pFile = fopen((const char*)pucCertName, "rb"); /*lint !e586
|
pFile = fopen( ( const char * ) pucCertName, "rb" ); /*lint !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
|
|
||||||
if (pFile != NULL)
|
if( pFile != NULL )
|
||||||
{
|
{
|
||||||
lWindowsError = fseek(pFile, 0, SEEK_END); /*lint !e586
|
lWindowsError = fseek( pFile, 0, SEEK_END ); /*lint !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
|
|
||||||
if (lWindowsError == 0) /* fseek returns a non-zero value on error. */
|
if( lWindowsError == 0 ) /* fseek returns a non-zero value on error. */
|
||||||
{
|
{
|
||||||
lSize = (int32_t)ftell(pFile); /*lint !e586 Allow call in this context. */
|
lSize = ( int32_t ) ftell( pFile ); /*lint !e586 Allow call in this context. */
|
||||||
|
|
||||||
if (lSize != -1L) /* ftell returns -1 on error. */
|
if( lSize != -1L ) /* ftell returns -1 on error. */
|
||||||
{
|
{
|
||||||
lWindowsError = fseek(pFile, 0, SEEK_SET); /*lint !e586
|
lWindowsError = fseek( pFile, 0, SEEK_SET ); /*lint !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
}
|
}
|
||||||
else /* ftell returned an error, pucSignerCert remains NULL. */
|
else /* ftell returned an error, pucSignerCert remains NULL. */
|
||||||
{
|
{
|
||||||
|
@ -162,60 +162,60 @@ static uint8_t* otaPal_ReadAndAssumeCertificate(const uint8_t* const pucCertName
|
||||||
}
|
}
|
||||||
} /* else fseek returned an error, pucSignerCert remains NULL. */
|
} /* else fseek returned an error, pucSignerCert remains NULL. */
|
||||||
|
|
||||||
if (lWindowsError == 0)
|
if( lWindowsError == 0 )
|
||||||
{
|
{
|
||||||
/* Allocate memory for the signer certificate plus a terminating zero so we can load and return it to the caller. */
|
/* Allocate memory for the signer certificate plus a terminating zero so we can load and return it to the caller. */
|
||||||
pucSignerCert = pvPortMalloc(lSize + 1); /*lint !e732 !e9034 !e9079 Allow conversion. */
|
pucSignerCert = pvPortMalloc( lSize + 1 ); /*lint !e732 !e9034 !e9079 Allow conversion. */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pucSignerCert != NULL)
|
if( pucSignerCert != NULL )
|
||||||
{
|
{
|
||||||
if (fread(pucSignerCert, 1, lSize, pFile) == (size_t)lSize) /*lint !e586 !e732 !e9034
|
if( fread( pucSignerCert, 1, lSize, pFile ) == ( size_t ) lSize ) /*lint !e586 !e732 !e9034
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
{
|
{
|
||||||
/* The crypto code requires the terminating zero to be part of the length so add 1 to the size. */
|
/* The crypto code requires the terminating zero to be part of the length so add 1 to the size. */
|
||||||
*ulSignerCertSize = lSize + 1;
|
*ulSignerCertSize = lSize + 1;
|
||||||
pucSignerCert[lSize] = 0;
|
pucSignerCert[ lSize ] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* There was a problem reading the certificate file so free the memory and abort. */
|
{ /* There was a problem reading the certificate file so free the memory and abort. */
|
||||||
vPortFree(pucSignerCert);
|
vPortFree( pucSignerCert );
|
||||||
pucSignerCert = NULL;
|
pucSignerCert = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogError(("Failed to allocate memory for signer cert contents.\r\n"));
|
LogError( ( "Failed to allocate memory for signer cert contents.\r\n" ) );
|
||||||
/* Nothing special to do. */
|
/* Nothing special to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
lWindowsError = fclose(pFile); /*lint !e586
|
lWindowsError = fclose( pFile ); /*lint !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
|
|
||||||
if (lWindowsError != 0)
|
if( lWindowsError != 0 )
|
||||||
{
|
{
|
||||||
LogError(("File pointer operation failed.\r\n"));
|
LogError( ( "File pointer operation failed.\r\n" ) );
|
||||||
pucSignerCert = NULL;
|
pucSignerCert = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogError(("No such certificate file: %s. Using aws_ota_codesigner_certificate.h.\r\n",
|
LogError( ( "No such certificate file: %s. Using aws_ota_codesigner_certificate.h.\r\n",
|
||||||
(const char*)pucCertName));
|
( const char * ) pucCertName ) );
|
||||||
|
|
||||||
/* Allocate memory for the signer certificate plus a terminating zero so we can copy it and return to the caller. */
|
/* Allocate memory for the signer certificate plus a terminating zero so we can copy it and return to the caller. */
|
||||||
lSize = sizeof(signingcredentialSIGNING_CERTIFICATE_PEM);
|
lSize = sizeof( signingcredentialSIGNING_CERTIFICATE_PEM );
|
||||||
pucSignerCert = pvPortMalloc(lSize); /*lint !e9029 !e9079 !e838 malloc proto requires void*. */
|
pucSignerCert = pvPortMalloc( lSize ); /*lint !e9029 !e9079 !e838 malloc proto requires void*. */
|
||||||
pucCertData = (uint8_t*)signingcredentialSIGNING_CERTIFICATE_PEM; /*lint !e9005 we don't modify the cert but it could be set by PKCS11 so it's not const. */
|
pucCertData = ( uint8_t * ) signingcredentialSIGNING_CERTIFICATE_PEM; /*lint !e9005 we don't modify the cert but it could be set by PKCS11 so it's not const. */
|
||||||
|
|
||||||
if (pucSignerCert != NULL)
|
if( pucSignerCert != NULL )
|
||||||
{
|
{
|
||||||
memcpy(pucSignerCert, pucCertData, lSize);
|
memcpy( pucSignerCert, pucCertData, lSize );
|
||||||
*ulSignerCertSize = lSize;
|
*ulSignerCertSize = lSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogError(("No memory for certificate of size %d!\r\n", lSize));
|
LogError( ( "No memory for certificate of size %d!\r\n", lSize ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,29 +226,29 @@ static uint8_t* otaPal_ReadAndAssumeCertificate(const uint8_t* const pucCertName
|
||||||
* @brief Verifies a cryptographic signature based on the signer
|
* @brief Verifies a cryptographic signature based on the signer
|
||||||
* certificate, hash algorithm, and the data that was signed.
|
* certificate, hash algorithm, and the data that was signed.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvVerifySignature(char* pcSignerCertificate,
|
static BaseType_t prvVerifySignature( char * pcSignerCertificate,
|
||||||
size_t xSignerCertificateLength,
|
size_t xSignerCertificateLength,
|
||||||
BaseType_t xHashAlgorithm,
|
BaseType_t xHashAlgorithm,
|
||||||
uint8_t* pucHash,
|
uint8_t * pucHash,
|
||||||
size_t xHashLength,
|
size_t xHashLength,
|
||||||
uint8_t* pucSignature,
|
uint8_t * pucSignature,
|
||||||
size_t xSignatureLength)
|
size_t xSignatureLength )
|
||||||
{
|
{
|
||||||
BaseType_t xResult = pdTRUE;
|
BaseType_t xResult = pdTRUE;
|
||||||
mbedtls_x509_crt xCertCtx;
|
mbedtls_x509_crt xCertCtx;
|
||||||
mbedtls_md_type_t xMbedHashAlg = MBEDTLS_MD_SHA256;
|
mbedtls_md_type_t xMbedHashAlg = MBEDTLS_MD_SHA256;
|
||||||
|
|
||||||
(void)xHashAlgorithm;
|
( void ) xHashAlgorithm;
|
||||||
|
|
||||||
memset(&xCertCtx, 0, sizeof(mbedtls_x509_crt));
|
memset( &xCertCtx, 0, sizeof( mbedtls_x509_crt ) );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decode and create a certificate context
|
* Decode and create a certificate context
|
||||||
*/
|
*/
|
||||||
mbedtls_x509_crt_init(&xCertCtx);
|
mbedtls_x509_crt_init( &xCertCtx );
|
||||||
|
|
||||||
if (0 != mbedtls_x509_crt_parse(
|
if( 0 != mbedtls_x509_crt_parse(
|
||||||
&xCertCtx, (const unsigned char*)pcSignerCertificate, xSignerCertificateLength))
|
&xCertCtx, ( const unsigned char * ) pcSignerCertificate, xSignerCertificateLength ) )
|
||||||
{
|
{
|
||||||
xResult = pdFALSE;
|
xResult = pdFALSE;
|
||||||
}
|
}
|
||||||
|
@ -256,15 +256,15 @@ static BaseType_t prvVerifySignature(char* pcSignerCertificate,
|
||||||
/*
|
/*
|
||||||
* Verify the signature using the public key from the decoded certificate
|
* Verify the signature using the public key from the decoded certificate
|
||||||
*/
|
*/
|
||||||
if (pdTRUE == xResult)
|
if( pdTRUE == xResult )
|
||||||
{
|
{
|
||||||
if (0 != mbedtls_pk_verify(
|
if( 0 != mbedtls_pk_verify(
|
||||||
&xCertCtx.pk,
|
&xCertCtx.pk,
|
||||||
xMbedHashAlg,
|
xMbedHashAlg,
|
||||||
pucHash,
|
pucHash,
|
||||||
xHashLength,
|
xHashLength,
|
||||||
pucSignature,
|
pucSignature,
|
||||||
xSignatureLength))
|
xSignatureLength ) )
|
||||||
{
|
{
|
||||||
xResult = pdFALSE;
|
xResult = pdFALSE;
|
||||||
}
|
}
|
||||||
|
@ -273,7 +273,7 @@ static BaseType_t prvVerifySignature(char* pcSignerCertificate,
|
||||||
/*
|
/*
|
||||||
* Clean-up
|
* Clean-up
|
||||||
*/
|
*/
|
||||||
mbedtls_x509_crt_free(&xCertCtx);
|
mbedtls_x509_crt_free( &xCertCtx );
|
||||||
|
|
||||||
return xResult;
|
return xResult;
|
||||||
}
|
}
|
||||||
|
@ -283,23 +283,23 @@ static BaseType_t prvVerifySignature(char* pcSignerCertificate,
|
||||||
/**
|
/**
|
||||||
* @brief Creates signature verification context.
|
* @brief Creates signature verification context.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvSignatureVerificationStart(void** ppvContext,
|
static BaseType_t prvSignatureVerificationStart( void ** ppvContext,
|
||||||
BaseType_t xAsymmetricAlgorithm,
|
BaseType_t xAsymmetricAlgorithm,
|
||||||
BaseType_t xHashAlgorithm)
|
BaseType_t xHashAlgorithm )
|
||||||
{
|
{
|
||||||
BaseType_t xResult = pdTRUE;
|
BaseType_t xResult = pdTRUE;
|
||||||
SignatureVerificationState_t* pxCtx = NULL;
|
SignatureVerificationState_t * pxCtx = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate the context
|
* Allocate the context
|
||||||
*/
|
*/
|
||||||
if (NULL == (pxCtx = (SignatureVerificationStatePtr_t)pvPortMalloc(
|
if( NULL == ( pxCtx = ( SignatureVerificationStatePtr_t ) pvPortMalloc(
|
||||||
sizeof(*pxCtx)))) /*lint !e9087 Allow casting void* to other types. */
|
sizeof( *pxCtx ) ) ) ) /*lint !e9087 Allow casting void* to other types. */
|
||||||
{
|
{
|
||||||
xResult = pdFALSE;
|
xResult = pdFALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdTRUE == xResult)
|
if( pdTRUE == xResult )
|
||||||
{
|
{
|
||||||
*ppvContext = pxCtx;
|
*ppvContext = pxCtx;
|
||||||
|
|
||||||
|
@ -312,8 +312,8 @@ static BaseType_t prvSignatureVerificationStart(void** ppvContext,
|
||||||
/*
|
/*
|
||||||
* Initialize the requested hash type
|
* Initialize the requested hash type
|
||||||
*/
|
*/
|
||||||
mbedtls_sha256_init(&pxCtx->xSHA256Context);
|
mbedtls_sha256_init( &pxCtx->xSHA256Context );
|
||||||
(void)mbedtls_sha256_starts(&pxCtx->xSHA256Context, 0);
|
( void ) mbedtls_sha256_starts( &pxCtx->xSHA256Context, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return xResult;
|
return xResult;
|
||||||
|
@ -322,59 +322,58 @@ static BaseType_t prvSignatureVerificationStart(void** ppvContext,
|
||||||
/**
|
/**
|
||||||
* @brief Adds bytes to an in-progress hash for subsequent signature verification.
|
* @brief Adds bytes to an in-progress hash for subsequent signature verification.
|
||||||
*/
|
*/
|
||||||
static void prvSignatureVerificationUpdate(void* pvContext,
|
static void prvSignatureVerificationUpdate( void * pvContext,
|
||||||
const uint8_t* pucData,
|
const uint8_t * pucData,
|
||||||
size_t xDataLength)
|
size_t xDataLength )
|
||||||
{
|
{
|
||||||
SignatureVerificationState_t* pxCtx = (SignatureVerificationStatePtr_t)pvContext; /*lint !e9087 Allow casting void* to other types. */
|
SignatureVerificationState_t * pxCtx = ( SignatureVerificationStatePtr_t ) pvContext; /*lint !e9087 Allow casting void* to other types. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add the data to the hash of the requested type
|
* Add the data to the hash of the requested type
|
||||||
*/
|
*/
|
||||||
(void)mbedtls_sha256_update(&pxCtx->xSHA256Context, pucData, xDataLength);
|
( void ) mbedtls_sha256_update( &pxCtx->xSHA256Context, pucData, xDataLength );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Performs signature verification on a cryptographic hash.
|
* @brief Performs signature verification on a cryptographic hash.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvSignatureVerificationFinal(void* pvContext,
|
static BaseType_t prvSignatureVerificationFinal( void * pvContext,
|
||||||
char* pcSignerCertificate,
|
char * pcSignerCertificate,
|
||||||
size_t xSignerCertificateLength,
|
size_t xSignerCertificateLength,
|
||||||
uint8_t* pucSignature,
|
uint8_t * pucSignature,
|
||||||
size_t xSignatureLength)
|
size_t xSignatureLength )
|
||||||
{
|
{
|
||||||
BaseType_t xResult = pdFALSE;
|
BaseType_t xResult = pdFALSE;
|
||||||
|
|
||||||
if (pvContext != NULL)
|
if( pvContext != NULL )
|
||||||
{
|
{
|
||||||
SignatureVerificationStatePtr_t pxCtx = (SignatureVerificationStatePtr_t)pvContext; /*lint !e9087 Allow casting void* to other types. */
|
SignatureVerificationStatePtr_t pxCtx = ( SignatureVerificationStatePtr_t ) pvContext; /*lint !e9087 Allow casting void* to other types. */
|
||||||
uint8_t ucSHA256[SHA256_DIGEST_BYTES]; /* Reserve enough space for the larger for SHA256 results. */
|
uint8_t ucSHA256[ SHA256_DIGEST_BYTES ]; /* Reserve enough space for the larger for SHA256 results. */
|
||||||
uint8_t* pucHash = NULL;
|
uint8_t * pucHash = NULL;
|
||||||
size_t xHashLength = 0;
|
size_t xHashLength = 0;
|
||||||
|
|
||||||
if ((pcSignerCertificate != NULL) &&
|
if( ( pcSignerCertificate != NULL ) &&
|
||||||
(pucSignature != NULL) &&
|
( pucSignature != NULL ) &&
|
||||||
(xSignerCertificateLength > 0UL) &&
|
( xSignerCertificateLength > 0UL ) &&
|
||||||
(xSignatureLength > 0UL))
|
( xSignatureLength > 0UL ) )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Finish the hash.
|
* Finish the hash.
|
||||||
*/
|
*/
|
||||||
(void)mbedtls_sha256_finish(&pxCtx->xSHA256Context, ucSHA256);
|
( void ) mbedtls_sha256_finish( &pxCtx->xSHA256Context, ucSHA256 );
|
||||||
pucHash = ucSHA256;
|
pucHash = ucSHA256;
|
||||||
xHashLength = SHA256_DIGEST_BYTES;
|
xHashLength = SHA256_DIGEST_BYTES;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Verify the signature.
|
* Verify the signature.
|
||||||
*/
|
*/
|
||||||
xResult = prvVerifySignature(pcSignerCertificate,
|
xResult = prvVerifySignature( pcSignerCertificate,
|
||||||
xSignerCertificateLength,
|
xSignerCertificateLength,
|
||||||
pxCtx->xHashAlgorithm,
|
pxCtx->xHashAlgorithm,
|
||||||
pucHash,
|
pucHash,
|
||||||
xHashLength,
|
xHashLength,
|
||||||
pucSignature,
|
pucSignature,
|
||||||
xSignatureLength);
|
xSignatureLength );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -384,82 +383,83 @@ static BaseType_t prvSignatureVerificationFinal(void* pvContext,
|
||||||
/*
|
/*
|
||||||
* Clean-up
|
* Clean-up
|
||||||
*/
|
*/
|
||||||
vPortFree(pxCtx);
|
vPortFree( pxCtx );
|
||||||
}
|
}
|
||||||
|
|
||||||
return xResult;
|
return xResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify the signature of the specified file. */
|
/* Verify the signature of the specified file. */
|
||||||
OtaPalMainStatus_t xValidateImageSignature(OtaFileContext_t* const C)
|
OtaPalMainStatus_t xValidateImageSignature( OtaFileContext_t * const C )
|
||||||
{
|
{
|
||||||
OtaPalMainStatus_t eResult = OtaPalSuccess;
|
OtaPalMainStatus_t eResult = OtaPalSuccess;
|
||||||
uint32_t ulBytesRead;
|
uint32_t ulBytesRead;
|
||||||
uint32_t ulSignerCertSize;
|
uint32_t ulSignerCertSize;
|
||||||
uint8_t* pucBuf, * pucSignerCert;
|
uint8_t * pucBuf, * pucSignerCert;
|
||||||
void* pvSigVerifyContext;
|
void * pvSigVerifyContext;
|
||||||
|
|
||||||
/* Verify an ECDSA-SHA256 signature. */
|
/* Verify an ECDSA-SHA256 signature. */
|
||||||
if (pdFALSE == prvSignatureVerificationStart(&pvSigVerifyContext, ASYMMETRIC_ALGORITHM_ECDSA, HASH_ALGORITHM_SHA256))
|
if( pdFALSE == prvSignatureVerificationStart( &pvSigVerifyContext, ASYMMETRIC_ALGORITHM_ECDSA, HASH_ALGORITHM_SHA256 ) )
|
||||||
{
|
{
|
||||||
eResult = OtaPalSignatureCheckFailed;
|
eResult = OtaPalSignatureCheckFailed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogInfo(("Started %s signature verification, file: %s\r\n",
|
LogInfo( ( "Started %s signature verification, file: %s\r\n",
|
||||||
OTA_JsonFileSignatureKey, (const char*)C->pCertFilepath));
|
OTA_JsonFileSignatureKey, ( const char * ) C->pCertFilepath ) );
|
||||||
pucSignerCert = otaPal_ReadAndAssumeCertificate((const uint8_t* const)C->pCertFilepath, &ulSignerCertSize);
|
pucSignerCert = otaPal_ReadAndAssumeCertificate( ( const uint8_t * const ) C->pCertFilepath, &ulSignerCertSize );
|
||||||
|
|
||||||
if (pucSignerCert != NULL)
|
if( pucSignerCert != NULL )
|
||||||
|
{
|
||||||
|
pucBuf = pvPortMalloc( OTA_PAL_WIN_BUF_SIZE ); /*lint !e9079 Allow conversion. */
|
||||||
|
|
||||||
|
if( pucBuf != NULL )
|
||||||
{
|
{
|
||||||
pucBuf = pvPortMalloc( OTA_PAL_WIN_BUF_SIZE ); /*lint !e9079 Allow conversion. */
|
/* Rewind the received file to the beginning. */
|
||||||
|
if( fseek( C->pFile, 0L, SEEK_SET ) == 0 ) /*lint !e586
|
||||||
if (pucBuf != NULL)
|
* C standard library call is being used for portability. */
|
||||||
{
|
{
|
||||||
/* Rewind the received file to the beginning. */
|
do
|
||||||
if (fseek(C->pFile, 0L, SEEK_SET) == 0) /*lint !e586
|
|
||||||
* C standard library call is being used for portability. */
|
|
||||||
{
|
{
|
||||||
do
|
ulBytesRead = fread( pucBuf, 1, OTA_PAL_WIN_BUF_SIZE, C->pFile ); /*lint !e586
|
||||||
{
|
* C standard library call is being used for portability. */
|
||||||
ulBytesRead = fread(pucBuf, 1, OTA_PAL_WIN_BUF_SIZE, C->pFile); /*lint !e586
|
/* Include the file chunk in the signature validation. Zero size is OK. */
|
||||||
* C standard library call is being used for portability. */
|
prvSignatureVerificationUpdate( pvSigVerifyContext, pucBuf, ulBytesRead );
|
||||||
/* Include the file chunk in the signature validation. Zero size is OK. */
|
} while( ulBytesRead > 0UL );
|
||||||
prvSignatureVerificationUpdate(pvSigVerifyContext, pucBuf, ulBytesRead);
|
|
||||||
} while (ulBytesRead > 0UL);
|
|
||||||
|
|
||||||
if (pdFALSE == prvSignatureVerificationFinal(pvSigVerifyContext,
|
if( pdFALSE == prvSignatureVerificationFinal( pvSigVerifyContext,
|
||||||
(char*)pucSignerCert,
|
( char * ) pucSignerCert,
|
||||||
(size_t)ulSignerCertSize,
|
( size_t ) ulSignerCertSize,
|
||||||
C->pSignature->data,
|
C->pSignature->data,
|
||||||
C->pSignature->size)) /*lint !e732 !e9034 Allow comparison in this context. */
|
C->pSignature->size ) ) /*lint !e732 !e9034 Allow comparison in this context. */
|
||||||
{
|
|
||||||
eResult = OtaPalSignatureCheckFailed;
|
|
||||||
}
|
|
||||||
pvSigVerifyContext = NULL; /* The context has been freed by prvSignatureVerificationFinal(). */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* Nothing special to do. */
|
eResult = OtaPalSignatureCheckFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the temporary file page buffer. */
|
pvSigVerifyContext = NULL; /* The context has been freed by prvSignatureVerificationFinal(). */
|
||||||
vPortFree(pucBuf);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogError(("Failed to allocate buffer memory.\r\n"));
|
/* Nothing special to do. */
|
||||||
eResult = OtaPalOutOfMemory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the signer certificate that we now own after prvReadAndAssumeCertificate(). */
|
/* Free the temporary file page buffer. */
|
||||||
vPortFree(pucSignerCert);
|
vPortFree( pucBuf );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
eResult = OtaPalBadSignerCert;
|
LogError( ( "Failed to allocate buffer memory.\r\n" ) );
|
||||||
|
eResult = OtaPalOutOfMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free the signer certificate that we now own after prvReadAndAssumeCertificate(). */
|
||||||
|
vPortFree( pucSignerCert );
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
eResult = OtaPalBadSignerCert;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return eResult;
|
return eResult;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -52,7 +52,7 @@ static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t * const C
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static inline BaseType_t prvContextValidate( OtaFileContext_t* pFileContext )
|
static inline BaseType_t prvContextValidate( OtaFileContext_t * pFileContext )
|
||||||
{
|
{
|
||||||
return( ( pFileContext != NULL ) &&
|
return( ( pFileContext != NULL ) &&
|
||||||
( pFileContext->pFile != NULL ) ); /*lint !e9034 Comparison is correct for file pointer type. */
|
( pFileContext->pFile != NULL ) ); /*lint !e9034 Comparison is correct for file pointer type. */
|
||||||
|
@ -63,19 +63,19 @@ static inline BaseType_t prvContextValidate( OtaFileContext_t* pFileContext )
|
||||||
|
|
||||||
/* Attempt to create a new receive file for the file chunks as they come in. */
|
/* Attempt to create a new receive file for the file chunks as they come in. */
|
||||||
|
|
||||||
OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t* const C )
|
OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C )
|
||||||
{
|
{
|
||||||
OtaPalMainStatus_t mainErr = OtaPalUninitialized;
|
OtaPalMainStatus_t mainErr = OtaPalUninitialized;
|
||||||
OtaPalSubStatus_t subErr = 0;
|
OtaPalSubStatus_t subErr = 0;
|
||||||
|
|
||||||
if( C != NULL )
|
if( C != NULL )
|
||||||
{
|
{
|
||||||
if ( C->pFilePath != NULL )
|
if( C->pFilePath != NULL )
|
||||||
{
|
{
|
||||||
C->pFile = fopen( ( const char * )C->pFilePath, "w+b" ); /*lint !e586
|
C->pFile = fopen( ( const char * ) C->pFilePath, "w+b" ); /*lint !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
|
|
||||||
if ( C->pFile != NULL )
|
if( C->pFile != NULL )
|
||||||
{
|
{
|
||||||
mainErr = OtaPalSuccess;
|
mainErr = OtaPalSuccess;
|
||||||
LogInfo( ( "Receive file created.\r\n" ) );
|
LogInfo( ( "Receive file created.\r\n" ) );
|
||||||
|
@ -99,7 +99,7 @@ OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t* const C )
|
||||||
LogError( ( "ERROR - Invalid file context provided.\r\n" ) );
|
LogError( ( "ERROR - Invalid file context provided.\r\n" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return OTA_PAL_COMBINE_ERR(mainErr,subErr);
|
return OTA_PAL_COMBINE_ERR( mainErr, subErr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C )
|
||||||
if( NULL != C->pFile )
|
if( NULL != C->pFile )
|
||||||
{
|
{
|
||||||
lFileCloseResult = fclose( C->pFile ); /*lint !e482 !e586
|
lFileCloseResult = fclose( C->pFile ); /*lint !e482 !e586
|
||||||
* Context file handle state is managed by this API. */
|
* Context file handle state is managed by this API. */
|
||||||
C->pFile = NULL;
|
C->pFile = NULL;
|
||||||
|
|
||||||
if( 0 == lFileCloseResult )
|
if( 0 == lFileCloseResult )
|
||||||
|
@ -145,7 +145,7 @@ OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C )
|
||||||
mainErr = OtaPalFileAbort;
|
mainErr = OtaPalFileAbort;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OTA_PAL_COMBINE_ERR(mainErr,subErr);
|
return OTA_PAL_COMBINE_ERR( mainErr, subErr );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write a block of data to the specified file. */
|
/* Write a block of data to the specified file. */
|
||||||
|
@ -159,12 +159,12 @@ int16_t otaPal_WriteBlock( OtaFileContext_t * const C,
|
||||||
if( prvContextValidate( C ) == pdTRUE )
|
if( prvContextValidate( C ) == pdTRUE )
|
||||||
{
|
{
|
||||||
lResult = fseek( C->pFile, ulOffset, SEEK_SET ); /*lint !e586 !e713 !e9034
|
lResult = fseek( C->pFile, ulOffset, SEEK_SET ); /*lint !e586 !e713 !e9034
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
|
|
||||||
if( 0 == lResult )
|
if( 0 == lResult )
|
||||||
{
|
{
|
||||||
lResult = fwrite( pacData, 1, ulBlockSize, C->pFile ); /*lint !e586 !e713 !e9034
|
lResult = fwrite( pacData, 1, ulBlockSize, C->pFile ); /*lint !e586 !e713 !e9034
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
|
|
||||||
if( lResult < 0 )
|
if( lResult < 0 )
|
||||||
{
|
{
|
||||||
|
@ -216,7 +216,7 @@ OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C )
|
||||||
|
|
||||||
/* Close the file. */
|
/* Close the file. */
|
||||||
lWindowsError = fclose( C->pFile ); /*lint !e482 !e586
|
lWindowsError = fclose( C->pFile ); /*lint !e482 !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
C->pFile = NULL;
|
C->pFile = NULL;
|
||||||
|
|
||||||
if( lWindowsError != 0 )
|
if( lWindowsError != 0 )
|
||||||
|
@ -233,11 +233,10 @@ OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogError( ( "Failed to pass %s signature verification: %d.\r\n",
|
LogError( ( "Failed to pass %s signature verification: %d.\r\n",
|
||||||
OTA_JsonFileSignatureKey, OTA_PAL_COMBINE_ERR(mainErr,subErr) ) );
|
OTA_JsonFileSignatureKey, OTA_PAL_COMBINE_ERR( mainErr, subErr ) ) );
|
||||||
|
|
||||||
/* If we fail to verify the file signature that means the image is not valid. We need to set the image state to aborted. */
|
/* If we fail to verify the file signature that means the image is not valid. We need to set the image state to aborted. */
|
||||||
otaPal_SetPlatformImageState( C, OtaImageStateAborted );
|
otaPal_SetPlatformImageState( C, OtaImageStateAborted );
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* Invalid OTA Context. */
|
else /* Invalid OTA Context. */
|
||||||
|
@ -247,17 +246,17 @@ OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C )
|
||||||
mainErr = OtaPalFileClose;
|
mainErr = OtaPalFileClose;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OTA_PAL_COMBINE_ERR(mainErr,subErr);
|
return OTA_PAL_COMBINE_ERR( mainErr, subErr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Verify the signature of the specified file. */
|
/* Verify the signature of the specified file. */
|
||||||
|
|
||||||
static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t* const C )
|
static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t * const C )
|
||||||
{
|
{
|
||||||
OtaPalMainStatus_t eResult = OtaPalSignatureCheckFailed;
|
OtaPalMainStatus_t eResult = OtaPalSignatureCheckFailed;
|
||||||
|
|
||||||
if ( prvContextValidate( C ) == pdTRUE )
|
if( prvContextValidate( C ) == pdTRUE )
|
||||||
{
|
{
|
||||||
eResult = xValidateImageSignature( C );
|
eResult = xValidateImageSignature( C );
|
||||||
}
|
}
|
||||||
|
@ -271,40 +270,41 @@ static OtaPalMainStatus_t otaPal_CheckFileSignature( OtaFileContext_t* const C )
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t* const pFileContext )
|
OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const pFileContext )
|
||||||
{
|
{
|
||||||
(void)pFileContext;
|
( void ) pFileContext;
|
||||||
|
|
||||||
/* Return no error. Windows implementation does not reset device. */
|
/* Return no error. Windows implementation does not reset device. */
|
||||||
return OTA_PAL_COMBINE_ERR(OtaPalSuccess,0);
|
return OTA_PAL_COMBINE_ERR( OtaPalSuccess, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t* const pFileContext )
|
OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const pFileContext )
|
||||||
{
|
{
|
||||||
(void)pFileContext;
|
( void ) pFileContext;
|
||||||
|
|
||||||
/* Return no error. Windows implementation simply does nothing on activate.
|
/* Return no error. Windows implementation simply does nothing on activate.
|
||||||
* To run the new firmware image, double click the newly downloaded exe */
|
* To run the new firmware image, double click the newly downloaded exe */
|
||||||
return OTA_PAL_COMBINE_ERR(OtaPalSuccess,0);
|
return OTA_PAL_COMBINE_ERR( OtaPalSuccess, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the final state of the last transferred (final) OTA file (or bundle).
|
* Set the final state of the last transferred (final) OTA file (or bundle).
|
||||||
* On Windows, the state of the OTA image is stored in PlaformImageState.txt.
|
* On Windows, the state of the OTA image is stored in PlatformImageState.txt.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileContext, OtaImageState_t eState )
|
OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileContext,
|
||||||
|
OtaImageState_t eState )
|
||||||
{
|
{
|
||||||
(void)pFileContext;
|
( void ) pFileContext;
|
||||||
|
|
||||||
OtaPalMainStatus_t mainErr = OtaPalSuccess;
|
OtaPalMainStatus_t mainErr = OtaPalSuccess;
|
||||||
OtaPalSubStatus_t subErr = 0;
|
OtaPalSubStatus_t subErr = 0;
|
||||||
FILE * pstPlatformImageState;
|
FILE * pstPlatformImageState;
|
||||||
|
|
||||||
if( eState != OtaImageStateUnknown && eState <= OtaLastImageState )
|
if( ( eState != OtaImageStateUnknown ) && ( eState <= OtaLastImageState ) )
|
||||||
{
|
{
|
||||||
pstPlatformImageState = fopen( "PlatformImageState.txt", "w+b" ); /*lint !e586
|
pstPlatformImageState = fopen( "PlatformImageState.txt", "w+b" ); /*lint !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
|
@ -313,7 +313,7 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileConte
|
||||||
{
|
{
|
||||||
/* Write the image state to PlatformImageState.txt. */
|
/* Write the image state to PlatformImageState.txt. */
|
||||||
if( 1 != fwrite( &eState, sizeof( OtaImageState_t ), 1, pstPlatformImageState ) ) /*lint !e586 !e9029
|
if( 1 != fwrite( &eState, sizeof( OtaImageState_t ), 1, pstPlatformImageState ) ) /*lint !e586 !e9029
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
{
|
{
|
||||||
LogError( ( "Unable to write to image state file.\r\n" ) );
|
LogError( ( "Unable to write to image state file.\r\n" ) );
|
||||||
mainErr = OtaPalBadImageState;
|
mainErr = OtaPalBadImageState;
|
||||||
|
@ -334,14 +334,14 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileConte
|
||||||
mainErr = OtaPalBadImageState;
|
mainErr = OtaPalBadImageState;
|
||||||
subErr = errno;
|
subErr = errno;
|
||||||
}
|
}
|
||||||
} /*lint !e481 Allow fopen and fclose calls in this context. */
|
} /*lint !e481 Allow fopen and fclose calls in this context. */
|
||||||
else /* Image state invalid. */
|
else /* Image state invalid. */
|
||||||
{
|
{
|
||||||
LogError( ( "ERROR - Invalid image state provided.\r\n" ) );
|
LogError( ( "ERROR - Invalid image state provided.\r\n" ) );
|
||||||
mainErr = OtaPalBadImageState;
|
mainErr = OtaPalBadImageState;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OTA_PAL_COMBINE_ERR(mainErr,subErr);
|
return OTA_PAL_COMBINE_ERR( mainErr, subErr );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the state of the currently running image.
|
/* Get the state of the currently running image.
|
||||||
|
@ -358,7 +358,7 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const pFileConte
|
||||||
*/
|
*/
|
||||||
OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileContext )
|
OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileContext )
|
||||||
{
|
{
|
||||||
(void)pFileContext;
|
( void ) pFileContext;
|
||||||
|
|
||||||
FILE * pstPlatformImageState;
|
FILE * pstPlatformImageState;
|
||||||
OtaImageState_t eSavedAgentState = OtaImageStateUnknown;
|
OtaImageState_t eSavedAgentState = OtaImageStateUnknown;
|
||||||
|
@ -369,23 +369,25 @@ OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileC
|
||||||
|
|
||||||
if( pstPlatformImageState != NULL )
|
if( pstPlatformImageState != NULL )
|
||||||
{
|
{
|
||||||
if( 1 != fread( &eSavedAgentState, sizeof(OtaImageState_t), 1, pstPlatformImageState ) ) /*lint !e586 !e9029
|
if( 1 != fread( &eSavedAgentState, sizeof( OtaImageState_t ), 1, pstPlatformImageState ) ) /*lint !e586 !e9029
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
{
|
{
|
||||||
/* If an error occurred reading the file, mark the state as aborted. */
|
/* If an error occurred reading the file, mark the state as aborted. */
|
||||||
LogError( ( "Unable to read image state file.\r\n" ) );
|
LogError( ( "Unable to read image state file.\r\n" ) );
|
||||||
ePalState = ( OtaPalImageStateInvalid | (errno & OTA_PAL_ERR_MASK) );
|
ePalState = ( OtaPalImageStateInvalid | ( errno & OTA_PAL_ERR_MASK ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (eSavedAgentState)
|
switch( eSavedAgentState )
|
||||||
{
|
{
|
||||||
case OtaImageStateTesting:
|
case OtaImageStateTesting:
|
||||||
ePalState = OtaPalImageStatePendingCommit;
|
ePalState = OtaPalImageStatePendingCommit;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OtaImageStateAccepted:
|
case OtaImageStateAccepted:
|
||||||
ePalState = OtaPalImageStateValid;
|
ePalState = OtaPalImageStateValid;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OtaImageStateRejected:
|
case OtaImageStateRejected:
|
||||||
case OtaImageStateAborted:
|
case OtaImageStateAborted:
|
||||||
default:
|
default:
|
||||||
|
@ -394,12 +396,11 @@ OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if( 0 != fclose( pstPlatformImageState ) ) /*lint !e586
|
if( 0 != fclose( pstPlatformImageState ) ) /*lint !e586
|
||||||
* C standard library call is being used for portability. */
|
* C standard library call is being used for portability. */
|
||||||
{
|
{
|
||||||
LogError( ( "Unable to close image state file.\r\n" ) );
|
LogError( ( "Unable to close image state file.\r\n" ) );
|
||||||
ePalState = (OtaPalImageStateInvalid | ( errno & OTA_PAL_ERR_MASK ) );
|
ePalState = ( OtaPalImageStateInvalid | ( errno & OTA_PAL_ERR_MASK ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -415,5 +416,5 @@ OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const pFileC
|
||||||
|
|
||||||
/* Provide access to private members for testing. */
|
/* Provide access to private members for testing. */
|
||||||
#ifdef FREERTOS_ENABLE_UNIT_TESTS
|
#ifdef FREERTOS_ENABLE_UNIT_TESTS
|
||||||
#include "aws_ota_pal_test_access_define.h"
|
#include "aws_ota_pal_test_access_define.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file ota_pal.h
|
* @file ota_pal.h
|
||||||
* @brief Function declarations for ota_ptal.c.
|
* @brief Function declarations for ota_pal.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _OTA_PAL_H_
|
#ifndef _OTA_PAL_H_
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
* OTA_ERR_NONE is returned when aborting access to the open file was successful.
|
* OTA_ERR_NONE is returned when aborting access to the open file was successful.
|
||||||
* OTA_ERR_FILE_ABORT is returned when aborting access to the open file context was unsuccessful.
|
* OTA_ERR_FILE_ABORT is returned when aborting access to the open file context was unsuccessful.
|
||||||
*/
|
*/
|
||||||
OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C );
|
OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Create a new receive file for the data chunks as they come in.
|
* @brief Create a new receive file for the data chunks as they come in.
|
||||||
|
@ -79,7 +79,7 @@ OtaPalStatus_t otaPal_Abort( OtaFileContext_t * const C );
|
||||||
* OTA_ERR_BOOT_INFO_CREATE_FAILED is returned if the bootloader information file creation fails.
|
* OTA_ERR_BOOT_INFO_CREATE_FAILED is returned if the bootloader information file creation fails.
|
||||||
* OTA_ERR_RX_FILE_CREATE_FAILED is returned for other errors creating the file in the device's non-volatile memory.
|
* OTA_ERR_RX_FILE_CREATE_FAILED is returned for other errors creating the file in the device's non-volatile memory.
|
||||||
*/
|
*/
|
||||||
OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C );
|
OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C );
|
||||||
|
|
||||||
/* @brief Authenticate and close the underlying receive file in the specified OTA context.
|
/* @brief Authenticate and close the underlying receive file in the specified OTA context.
|
||||||
*
|
*
|
||||||
|
@ -104,7 +104,7 @@ OtaPalStatus_t otaPal_CreateFileForRx( OtaFileContext_t * const C );
|
||||||
* OTA_ERR_BAD_SIGNER_CERT is returned for errors in the certificate itself.
|
* OTA_ERR_BAD_SIGNER_CERT is returned for errors in the certificate itself.
|
||||||
* OTA_ERR_FILE_CLOSE is returned when closing the file fails.
|
* OTA_ERR_FILE_CLOSE is returned when closing the file fails.
|
||||||
*/
|
*/
|
||||||
OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C );
|
OtaPalStatus_t otaPal_CloseFile( OtaFileContext_t * const C );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write a block of data to the specified file at the given offset.
|
* @brief Write a block of data to the specified file at the given offset.
|
||||||
|
@ -141,7 +141,7 @@ int16_t otaPal_WriteBlock( OtaFileContext_t * const C,
|
||||||
* @return The OTA PAL layer error code combined with the MCU specific error code. See OTA Agent
|
* @return The OTA PAL layer error code combined with the MCU specific error code. See OTA Agent
|
||||||
* error codes information in ota.h.
|
* error codes information in ota.h.
|
||||||
*/
|
*/
|
||||||
OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const C );
|
OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const C );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Reset the device.
|
* @brief Reset the device.
|
||||||
|
@ -155,7 +155,7 @@ OtaPalStatus_t otaPal_ActivateNewImage( OtaFileContext_t * const C );
|
||||||
* error codes information in ota.h.
|
* error codes information in ota.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const C );
|
OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const C );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Attempt to set the state of the OTA update image.
|
* @brief Attempt to set the state of the OTA update image.
|
||||||
|
@ -176,8 +176,8 @@ OtaPalStatus_t otaPal_ResetDevice( OtaFileContext_t * const C );
|
||||||
* OTA_ERR_REJECT_FAILED: failed to roll back the update image as requested by OtaImageStateRejected.
|
* OTA_ERR_REJECT_FAILED: failed to roll back the update image as requested by OtaImageStateRejected.
|
||||||
* OTA_ERR_COMMIT_FAILED: failed to make the update image permanent as requested by OtaImageStateAccepted.
|
* OTA_ERR_COMMIT_FAILED: failed to make the update image permanent as requested by OtaImageStateAccepted.
|
||||||
*/
|
*/
|
||||||
OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const C,
|
OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const C,
|
||||||
OtaImageState_t eState );
|
OtaImageState_t eState );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the state of the OTA update image.
|
* @brief Get the state of the OTA update image.
|
||||||
|
@ -202,4 +202,4 @@ OtaPalStatus_t otaPal_SetPlatformImageState( OtaFileContext_t * const C,
|
||||||
*/
|
*/
|
||||||
OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const C );
|
OtaPalImageState_t otaPal_GetPlatformImageState( OtaFileContext_t * const C );
|
||||||
|
|
||||||
#endif /* ifndef _OTA_PAL_H_ */
|
#endif /* ifndef _OTA_PAL_H_ */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -672,7 +672,7 @@ static void prvMQTTAgentTask( void * pParam );
|
||||||
*
|
*
|
||||||
* The implementation uses MQTT agent to queue a publish request. It then waits
|
* The implementation uses MQTT agent to queue a publish request. It then waits
|
||||||
* for the request complete notification from the agent. The notification along with result of the
|
* for the request complete notification from the agent. The notification along with result of the
|
||||||
* operation is sent back to the caller task using xTaksNotify API. For publishes involving QOS 1 and
|
* operation is sent back to the caller task using xTaskNotify API. For publishes involving QOS 1 and
|
||||||
* QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function
|
* QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function
|
||||||
* to fetch new job, provide status update and send other control related messages to the MQTT broker.
|
* to fetch new job, provide status update and send other control related messages to the MQTT broker.
|
||||||
*
|
*
|
||||||
|
@ -808,7 +808,7 @@ static void prvMqttDataCallback( void * pContext,
|
||||||
*
|
*
|
||||||
* The callback is not subscribed with MQTT broker, but only with local subscription manager.
|
* The callback is not subscribed with MQTT broker, but only with local subscription manager.
|
||||||
* A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is
|
* A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is
|
||||||
* forwarded to this callback for filteration. Right now the callback is used to filter responses to job requests
|
* forwarded to this callback for filtration. Right now the callback is used to filter responses to job requests
|
||||||
* from the OTA service.
|
* from the OTA service.
|
||||||
*
|
*
|
||||||
* @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection.
|
* @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection.
|
||||||
|
@ -1186,12 +1186,12 @@ static void prvCommandCallback( MQTTAgentCommandContext_t * pxCommandContext,
|
||||||
static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext,
|
static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext,
|
||||||
MQTTAgentReturnInfo_t * pxReturnInfo )
|
MQTTAgentReturnInfo_t * pxReturnInfo )
|
||||||
{
|
{
|
||||||
MQTTAgentSubscribeArgs_t * pSubsribeArgs;
|
MQTTAgentSubscribeArgs_t * pSubscribeArgs;
|
||||||
|
|
||||||
if( pxReturnInfo->returnCode == MQTTSuccess )
|
if( pxReturnInfo->returnCode == MQTTSuccess )
|
||||||
{
|
{
|
||||||
pSubsribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs );
|
pSubscribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs );
|
||||||
prvRegisterOTACallback( pSubsribeArgs->pSubscribeInfo->pTopicFilter, pSubsribeArgs->pSubscribeInfo->topicFilterLength );
|
prvRegisterOTACallback( pSubscribeArgs->pSubscribeInfo->pTopicFilter, pSubscribeArgs->pSubscribeInfo->topicFilterLength );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store the result in the application defined context so the task that
|
/* Store the result in the application defined context so the task that
|
||||||
|
@ -1431,41 +1431,43 @@ static BaseType_t prvSocketConnect( NetworkContext_t * pxNetworkContext )
|
||||||
NetworkCredentials_t xNetworkCredentials = { 0 };
|
NetworkCredentials_t xNetworkCredentials = { 0 };
|
||||||
|
|
||||||
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER )
|
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER )
|
||||||
#if defined( democonfigCLIENT_USERNAME )
|
#if defined( democonfigCLIENT_USERNAME )
|
||||||
/*
|
|
||||||
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
|
||||||
* to AWS IoT Core with Custom Authentication on port 443.
|
|
||||||
*
|
|
||||||
* Custom Authentication uses the contents of the username and password
|
|
||||||
* fields of the MQTT CONNECT packet to authenticate the client.
|
|
||||||
*
|
|
||||||
* For more information, refer to the documentation at:
|
|
||||||
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
|
||||||
*/
|
|
||||||
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
|
||||||
#if democonfigMQTT_BROKER_PORT != 443U
|
|
||||||
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
|
||||||
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
|
||||||
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
|
||||||
/*
|
|
||||||
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
|
||||||
* x509 Certificate Authentication.
|
|
||||||
*/
|
|
||||||
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
|
||||||
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* An ALPN identifier is only required when connecting to AWS IoT core on port 443.
|
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
||||||
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
|
* to AWS IoT Core with Custom Authentication on port 443.
|
||||||
|
*
|
||||||
|
* Custom Authentication uses the contents of the username and password
|
||||||
|
* fields of the MQTT CONNECT packet to authenticate the client.
|
||||||
|
*
|
||||||
|
* For more information, refer to the documentation at:
|
||||||
|
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
||||||
*/
|
*/
|
||||||
#if democonfigMQTT_BROKER_PORT == 443U
|
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
||||||
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols;
|
#if democonfigMQTT_BROKER_PORT != 443U
|
||||||
#elif democonfigMQTT_BROKER_PORT == 8883U
|
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
||||||
xNetworkCredentials.pAlpnProtos = NULL;
|
|
||||||
#else /* democonfigMQTT_BROKER_PORT != 8883U */
|
|
||||||
xNetworkCredentials.pAlpnProtos = NULL;
|
|
||||||
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
|
|
||||||
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
||||||
|
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
||||||
|
* x509 Certificate Authentication.
|
||||||
|
*/
|
||||||
|
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
||||||
|
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An ALPN identifier is only required when connecting to AWS IoT core on port 443.
|
||||||
|
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
|
||||||
|
*/
|
||||||
|
#if democonfigMQTT_BROKER_PORT == 443U
|
||||||
|
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols;
|
||||||
|
#elif democonfigMQTT_BROKER_PORT == 8883U
|
||||||
|
xNetworkCredentials.pAlpnProtos = NULL;
|
||||||
|
#else /* democonfigMQTT_BROKER_PORT != 8883U */
|
||||||
|
xNetworkCredentials.pAlpnProtos = NULL;
|
||||||
|
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
|
||||||
|
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
||||||
#else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
#else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
||||||
xNetworkCredentials.pAlpnProtos = NULL;
|
xNetworkCredentials.pAlpnProtos = NULL;
|
||||||
#endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
#endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
||||||
|
@ -2501,7 +2503,7 @@ static BaseType_t prvRunOTADemo( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remvove callback for receiving messages intended for OTA agent from broker,
|
* Remove callback for receiving messages intended for OTA agent from broker,
|
||||||
* for which the topic has not been subscribed for.
|
* for which the topic has not been subscribed for.
|
||||||
*/
|
*/
|
||||||
removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext,
|
removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext,
|
||||||
|
|
|
@ -1,249 +1,249 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>x64</Platform>
|
<Platform>x64</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|x64">
|
<ProjectConfiguration Include="Release|x64">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>x64</Platform>
|
<Platform>x64</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<VCProjectVersion>16.0</VCProjectVersion>
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<ProjectGuid>{4be4e103-5bf4-4a85-9656-ec20852a2b8e}</ProjectGuid>
|
<ProjectGuid>{4be4e103-5bf4-4a85-9656-ec20852a2b8e}</ProjectGuid>
|
||||||
<RootNamespace>OtaOverHttpDemo</RootNamespace>
|
<RootNamespace>OtaOverHttpDemo</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="Shared">
|
<ImportGroup Label="Shared">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
<TargetName>RTOSDemo</TargetName>
|
<TargetName>RTOSDemo</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
<TargetName>RTOSDemo</TargetName>
|
<TargetName>RTOSDemo</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
<TargetName>RTOSDemo</TargetName>
|
<TargetName>RTOSDemo</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
<TargetName>RTOSDemo</TargetName>
|
<TargetName>RTOSDemo</TargetName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<SDLCheck>false</SDLCheck>
|
<SDLCheck>false</SDLCheck>
|
||||||
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;WIN32;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;WIN32;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>false</SDLCheck>
|
<SDLCheck>false</SDLCheck>
|
||||||
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;WIN32;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;WIN32;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<SDLCheck>false</SDLCheck>
|
<SDLCheck>false</SDLCheck>
|
||||||
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;_DEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>false</SDLCheck>
|
<SDLCheck>false</SDLCheck>
|
||||||
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MQTT_AGENT_DO_NOT_USE_CUSTOM_CONFIG;WIN32;__little_endian__=1;NDEBUG;_CONSOLE;MBEDTLS_CONFIG_FILE="mbedtls_config_v3.2.1.h";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\Common\HTTP_Utils;..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include;..\..\..\..\Source\Application-Protocols\network_transport;..\..\..\Common\coreMQTT_Agent_Interface\include;..\..\..\..\ThirdParty\tinycbor\src;..\..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\..\..\Source\AWS\ota\source\include;..\..\..\..\Source\AWS\ota\source\portable\os;..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\Common\Ota_PAL\Win32\Code_Signature_Verification;..\Common\Ota_PAL\Win32;..\Common\subscription-manager;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj">
|
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj">
|
||||||
<Project>{ee39fa0f-cefb-4c29-a571-05a28fdd47fd}</Project>
|
<Project>{ee39fa0f-cefb-4c29-a571-05a28fdd47fd}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj">
|
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj">
|
||||||
<Project>{c90e6cc5-818b-4c97-8876-0986d989387c}</Project>
|
<Project>{c90e6cc5-818b-4c97-8876-0986d989387c}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj">
|
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj">
|
||||||
<Project>{72c209c4-49a4-4942-a201-44706c9d77ec}</Project>
|
<Project>{72c209c4-49a4-4942-a201-44706c9d77ec}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj">
|
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj">
|
||||||
<Project>{be362ac0-b10b-4276-b84e-6304652ba228}</Project>
|
<Project>{be362ac0-b10b-4276-b84e-6304652ba228}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj">
|
<ProjectReference Include="..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj">
|
||||||
<Project>{e1016f3e-94e9-4864-9fd8-1d7c1fefbfd7}</Project>
|
<Project>{e1016f3e-94e9-4864-9fd8-1d7c1fefbfd7}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent_command_functions.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\core_mqtt_agent_command_functions.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_serializer.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_serializer.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_state.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\core_mqtt_state.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\ports\freertos_plus_tcp\tcp_sockets_wrapper.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\ports\freertos_plus_tcp\tcp_sockets_wrapper.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.c" />
|
<ClCompile Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota.c" />
|
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_base64.c" />
|
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_base64.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_cbor.c" />
|
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_cbor.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_http.c" />
|
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_http.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_interface.c" />
|
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_interface.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_mqtt.c" />
|
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\ota_mqtt.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.c" />
|
<ClCompile Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\coreJSON\source\core_json.c" />
|
<ClCompile Include="..\..\..\..\Source\coreJSON\source\core_json.c" />
|
||||||
<ClCompile Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\backoff_algorithm.c" />
|
<ClCompile Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\backoff_algorithm.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder_close_container_checked.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborencoder_close_container_checked.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborerrorstrings.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborerrorstrings.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser_dup_string.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborparser_dup_string.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty_stdio.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborpretty_stdio.c" />
|
||||||
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborvalidation.c" />
|
<ClCompile Include="..\..\..\..\ThirdParty\tinycbor\src\cborvalidation.c" />
|
||||||
<ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_agent_message.c" />
|
<ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_agent_message.c" />
|
||||||
<ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_command_pool.c" />
|
<ClCompile Include="..\..\..\Common\coreMQTT_Agent_Interface\freertos_command_pool.c" />
|
||||||
<ClCompile Include="..\Common\HTTP_Utils\http_demo_utils.c" />
|
<ClCompile Include="..\Common\HTTP_Utils\http_demo_utils.c" />
|
||||||
<ClCompile Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification_mbedtls.c" />
|
<ClCompile Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification_mbedtls.c" />
|
||||||
<ClCompile Include="..\Common\Ota_PAL\Win32\ota_pal.c" />
|
<ClCompile Include="..\Common\Ota_PAL\Win32\ota_pal.c" />
|
||||||
<ClCompile Include="..\Common\subscription-manager\subscription_manager.c" />
|
<ClCompile Include="..\Common\subscription-manager\subscription_manager.c" />
|
||||||
<ClCompile Include="DemoTasks\OtaOverHttpDemoExample.c" />
|
<ClCompile Include="DemoTasks\OtaOverHttpDemoExample.c" />
|
||||||
<ClCompile Include="main.c" />
|
<ClCompile Include="main.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_command_functions.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_command_functions.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_message_interface.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include\core_mqtt_agent_message_interface.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_config_defaults.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_config_defaults.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_serializer.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_serializer.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_state.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\include\core_mqtt_state.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface\transport_interface.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface\transport_interface.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\mbedtls_bio_tcp_sockets_wrapper.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include\tcp_sockets_wrapper.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\tcp_sockets_wrapper\include\tcp_sockets_wrapper.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.h" />
|
<ClInclude Include="..\..\..\..\Source\Application-Protocols\network_transport\transport_mbedtls.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_appversion32.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_appversion32.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_base64_private.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_base64_private.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_cbor_private.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_cbor_private.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_config_defaults.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_config_defaults.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_interface.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_interface.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_private.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_http_private.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_interface_private.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_interface_private.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_interface.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_interface.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_private.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_mqtt_private.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_os_interface.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_os_interface.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_platform_interface.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_platform_interface.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_private.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\include\ota_private.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.h" />
|
<ClInclude Include="..\..\..\..\Source\AWS\ota\source\portable\os\ota_os_freertos.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\coreJSON\source\include\core_json.h" />
|
<ClInclude Include="..\..\..\..\Source\coreJSON\source\include\core_json.h" />
|
||||||
<ClInclude Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\include\backoff_algorithm.h" />
|
<ClInclude Include="..\..\..\..\Source\Utilities\backoff_algorithm\source\include\backoff_algorithm.h" />
|
||||||
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cbor.h" />
|
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cbor.h" />
|
||||||
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborinternal_p.h" />
|
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborinternal_p.h" />
|
||||||
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborjson.h" />
|
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\cborjson.h" />
|
||||||
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\compilersupport_p.h" />
|
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\compilersupport_p.h" />
|
||||||
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\tinycbor-version.h" />
|
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\tinycbor-version.h" />
|
||||||
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\utf8_p.h" />
|
<ClInclude Include="..\..\..\..\ThirdParty\tinycbor\src\utf8_p.h" />
|
||||||
<ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_agent_message.h" />
|
<ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_agent_message.h" />
|
||||||
<ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_command_pool.h" />
|
<ClInclude Include="..\..\..\Common\coreMQTT_Agent_Interface\include\freertos_command_pool.h" />
|
||||||
<ClInclude Include="..\Common\HTTP_Utils\http_demo_utils.h" />
|
<ClInclude Include="..\Common\HTTP_Utils\http_demo_utils.h" />
|
||||||
<ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\aws_ota_codesigner_certificate.h" />
|
<ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\aws_ota_codesigner_certificate.h" />
|
||||||
<ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification.h" />
|
<ClInclude Include="..\Common\Ota_PAL\Win32\Code_Signature_Verification\code_signature_verification.h" />
|
||||||
<ClInclude Include="..\Common\Ota_PAL\Win32\ota_pal.h" />
|
<ClInclude Include="..\Common\Ota_PAL\Win32\ota_pal.h" />
|
||||||
<ClInclude Include="..\Common\subscription-manager\subscription_manager.h" />
|
<ClInclude Include="..\Common\subscription-manager\subscription_manager.h" />
|
||||||
<ClInclude Include="core_mqtt_config.h" />
|
<ClInclude Include="core_mqtt_config.h" />
|
||||||
<ClInclude Include="demo_config.h" />
|
<ClInclude Include="demo_config.h" />
|
||||||
<ClInclude Include="ota_config.h" />
|
<ClInclude Include="ota_config.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Source Files">
|
<Filter Include="Source Files">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
* https://github.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CORE_MQTT_CONFIG_H
|
#ifndef CORE_MQTT_CONFIG_H
|
||||||
#define CORE_MQTT_CONFIG_H
|
#define CORE_MQTT_CONFIG_H
|
||||||
|
|
||||||
|
@ -76,33 +76,34 @@ extern void vLoggingPrintf( const char * pcFormatString,
|
||||||
*/
|
*/
|
||||||
#define MQTT_STATE_ARRAY_MAX_COUNT 10U
|
#define MQTT_STATE_ARRAY_MAX_COUNT 10U
|
||||||
|
|
||||||
/*********************** coreMQTT Agent Configurations **********************/
|
/*********************** coreMQTT Agent Configurations **********************/
|
||||||
/**
|
|
||||||
* @brief The maximum number of pending acknowledgments to track for a single
|
/**
|
||||||
* connection.
|
* @brief The maximum number of pending acknowledgments to track for a single
|
||||||
*
|
* connection.
|
||||||
* @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th
|
*
|
||||||
* at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set
|
* @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th
|
||||||
* the maximum number of acknowledgments that can be outstanding at any one time.
|
* at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set
|
||||||
* The higher this number is the greater the agent's RAM consumption will be.
|
* the maximum number of acknowledgments that can be outstanding at any one time.
|
||||||
*/
|
* The higher this number is the greater the agent's RAM consumption will be.
|
||||||
|
*/
|
||||||
#define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U )
|
#define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Time in MS that the MQTT agent task will wait in the Blocked state (so
|
* @brief Time in MS that the MQTT agent task will wait in the Blocked state (so
|
||||||
* not using any CPU time) for a command to arrive in its command queue before
|
* not using any CPU time) for a command to arrive in its command queue before
|
||||||
* exiting the blocked state so it can call MQTT_ProcessLoop().
|
* exiting the blocked state so it can call MQTT_ProcessLoop().
|
||||||
*
|
*
|
||||||
* @note It is important MQTT_ProcessLoop() is called often if there is known
|
* @note It is important MQTT_ProcessLoop() is called often if there is known
|
||||||
* MQTT traffic, but calling it too often can take processing time away from
|
* MQTT traffic, but calling it too often can take processing time away from
|
||||||
* lower priority tasks and waste CPU time and power.
|
* lower priority tasks and waste CPU time and power.
|
||||||
*/
|
*/
|
||||||
#define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 )
|
#define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The number of command structures to allocate in the pool
|
* @brief The number of command structures to allocate in the pool
|
||||||
* for the agent.
|
* for the agent.
|
||||||
*/
|
*/
|
||||||
#define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10
|
#define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -179,8 +179,8 @@ extern void vLoggingPrintf( const char * pcFormatString,
|
||||||
* can be set to following -
|
* can be set to following -
|
||||||
* Enable data over MQTT - ( OTA_DATA_OVER_MQTT )
|
* Enable data over MQTT - ( OTA_DATA_OVER_MQTT )
|
||||||
* Enable data over HTTP - ( OTA_DATA_OVER_HTTP)
|
* Enable data over HTTP - ( OTA_DATA_OVER_HTTP)
|
||||||
*
|
*
|
||||||
* Note - Please check the OTA over MQTT demo which has the MQTT data transfer functionality and
|
* Note - Please check the OTA over MQTT demo which has the MQTT data transfer functionality and
|
||||||
* and this configuration is set to OTA_DATA_OVER_MQTT.
|
* and this configuration is set to OTA_DATA_OVER_MQTT.
|
||||||
*/
|
*/
|
||||||
#define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_HTTP )
|
#define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_HTTP )
|
||||||
|
|
|
@ -1,116 +1,116 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.31205.134
|
VisualStudioVersion = 16.0.31205.134
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ota_Over_Http_Demo", "Ota_Over_Http_Demo.vcxproj", "{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ota_Over_Http_Demo", "Ota_Over_Http_Demo.vcxproj", "{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Statically Linked Libraries", "Statically Linked Libraries", "{9799AFF4-25E2-43CD-8829-C066177E3748}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Statically Linked Libraries", "Statically Linked Libraries", "{9799AFF4-25E2-43CD-8829-C066177E3748}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS+TCP", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj", "{C90E6CC5-818B-4C97-8876-0986D989387C}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS+TCP", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj", "{C90E6CC5-818B-4C97-8876-0986D989387C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ww", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj", "{72C209C4-49A4-4942-A201-44706C9D77EC}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ww", "..\..\..\..\VisualStudio_StaticProjects\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj", "{72C209C4-49A4-4942-A201-44706C9D77EC}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Logging", "..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj", "{BE362AC0-B10B-4276-B84E-6304652BA228}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Logging", "..\..\..\..\VisualStudio_StaticProjects\Logging\Logging.vcxproj", "{BE362AC0-B10B-4276-B84E-6304652BA228}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MbedTLS", "..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj", "{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MbedTLS", "..\..\..\..\VisualStudio_StaticProjects\MbedTLS\MbedTLS.vcxproj", "{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "coreHTTP", "..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj", "{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "coreHTTP", "..\..\..\..\VisualStudio_StaticProjects\coreHTTP\coreHTTP.vcxproj", "{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Win32 = Debug|Win32
|
Debug|Win32 = Debug|Win32
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
Release|Win32 = Release|Win32
|
Release|Win32 = Release|Win32
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.ActiveCfg = Debug|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.Build.0 = Debug|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.ActiveCfg = Debug|x64
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.Build.0 = Debug|x64
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x64.Build.0 = Debug|x64
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.ActiveCfg = Debug|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.Build.0 = Debug|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.ActiveCfg = Release|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.Build.0 = Release|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|Win32.Build.0 = Release|Win32
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.ActiveCfg = Release|x64
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.ActiveCfg = Release|x64
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.Build.0 = Release|x64
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x64.Build.0 = Release|x64
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.ActiveCfg = Release|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.Build.0 = Release|Win32
|
{4BE4E103-5BF4-4A85-9656-EC20852A2B8E}.Release|x86.Build.0 = Release|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.ActiveCfg = Debug|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.Build.0 = Debug|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.ActiveCfg = Debug|x64
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.Build.0 = Debug|x64
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.Build.0 = Debug|x64
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.ActiveCfg = Debug|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.Build.0 = Debug|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.ActiveCfg = Release|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.Build.0 = Release|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|Win32.Build.0 = Release|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.ActiveCfg = Release|x64
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.ActiveCfg = Release|x64
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.Build.0 = Release|x64
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.Build.0 = Release|x64
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.ActiveCfg = Release|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.Build.0 = Release|Win32
|
{C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.Build.0 = Release|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.ActiveCfg = Debug|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.Build.0 = Debug|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.ActiveCfg = Debug|x64
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.Build.0 = Debug|x64
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.Build.0 = Debug|x64
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.ActiveCfg = Debug|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.Build.0 = Debug|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.ActiveCfg = Release|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.Build.0 = Release|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|Win32.Build.0 = Release|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.ActiveCfg = Release|x64
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.ActiveCfg = Release|x64
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.Build.0 = Release|x64
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.Build.0 = Release|x64
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.ActiveCfg = Release|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.Build.0 = Release|Win32
|
{72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.Build.0 = Release|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.ActiveCfg = Debug|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.Build.0 = Debug|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.ActiveCfg = Debug|x64
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.Build.0 = Debug|x64
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.Build.0 = Debug|x64
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.ActiveCfg = Debug|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.Build.0 = Debug|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.ActiveCfg = Release|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.Build.0 = Release|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|Win32.Build.0 = Release|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.ActiveCfg = Release|x64
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.ActiveCfg = Release|x64
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.Build.0 = Release|x64
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.Build.0 = Release|x64
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.ActiveCfg = Release|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.Build.0 = Release|Win32
|
{BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.Build.0 = Release|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.ActiveCfg = Debug|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.Build.0 = Debug|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.ActiveCfg = Debug|x64
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.Build.0 = Debug|x64
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.Build.0 = Debug|x64
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.ActiveCfg = Debug|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.Build.0 = Debug|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.ActiveCfg = Release|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.Build.0 = Release|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|Win32.Build.0 = Release|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.ActiveCfg = Release|x64
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.ActiveCfg = Release|x64
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.Build.0 = Release|x64
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.Build.0 = Release|x64
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.ActiveCfg = Release|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.Build.0 = Release|Win32
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.Build.0 = Release|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.ActiveCfg = Debug|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.Build.0 = Debug|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.ActiveCfg = Debug|x64
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.Build.0 = Debug|x64
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x64.Build.0 = Debug|x64
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.ActiveCfg = Debug|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.Build.0 = Debug|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.ActiveCfg = Release|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.Build.0 = Release|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|Win32.Build.0 = Release|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.ActiveCfg = Release|x64
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.ActiveCfg = Release|x64
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.Build.0 = Release|x64
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x64.Build.0 = Release|x64
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.ActiveCfg = Release|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.Build.0 = Release|Win32
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD}.Release|x86.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{C90E6CC5-818B-4C97-8876-0986D989387C} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
{C90E6CC5-818B-4C97-8876-0986D989387C} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
||||||
{72C209C4-49A4-4942-A201-44706C9D77EC} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
{72C209C4-49A4-4942-A201-44706C9D77EC} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
||||||
{BE362AC0-B10B-4276-B84E-6304652BA228} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
{BE362AC0-B10B-4276-B84E-6304652BA228} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
||||||
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
||||||
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
{EE39FA0F-CEFB-4C29-A571-05A28FDD47FD} = {9799AFF4-25E2-43CD-8829-C066177E3748}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {03800DFF-BAFA-4654-8E51-C4E654A54416}
|
SolutionGuid = {03800DFF-BAFA-4654-8E51-C4E654A54416}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -304,13 +304,13 @@
|
||||||
|
|
||||||
#ifndef democonfigCLIENT_IDENTIFIER
|
#ifndef democonfigCLIENT_IDENTIFIER
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The MQTT client identifier used in this example. Each client identifier
|
* @brief The MQTT client identifier used in this example. Each client identifier
|
||||||
* must be unique so edit as required to ensure no two clients connecting to the
|
* must be unique so edit as required to ensure no two clients connecting to the
|
||||||
* same broker use the same client identifier. Using a #define is for convenience
|
* same broker use the same client identifier. Using a #define is for convenience
|
||||||
* of demonstration only - production devices should use something unique to the
|
* of demonstration only - production devices should use something unique to the
|
||||||
* device that can be read from software - such as a production serial number.
|
* device that can be read from software - such as a production serial number.
|
||||||
*/
|
*/
|
||||||
#error "Please define democonfigCLIENT_IDENTIFIER in demo_config.h to something unique for this device."
|
#error "Please define democonfigCLIENT_IDENTIFIER in demo_config.h to something unique for this device."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -320,14 +320,14 @@
|
||||||
#error "Please define Root CA certificate of the MQTT broker(democonfigROOT_CA_PEM) in demo_config.h."
|
#error "Please define Root CA certificate of the MQTT broker(democonfigROOT_CA_PEM) in demo_config.h."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If no username is defined, then a client certificate/key is required. */
|
/* If no username is defined, then a client certificate/key is required. */
|
||||||
#ifndef democonfigCLIENT_USERNAME
|
#ifndef democonfigCLIENT_USERNAME
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*!!! Please note democonfigCLIENT_PRIVATE_KEY_PEM in used for
|
*!!! Please note democonfigCLIENT_PRIVATE_KEY_PEM in used for
|
||||||
*!!! convenience of demonstration only. Production devices should
|
*!!! convenience of demonstration only. Production devices should
|
||||||
*!!! store keys securely, such as within a secure element.
|
*!!! store keys securely, such as within a secure element.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef democonfigCLIENT_CERTIFICATE_PEM
|
#ifndef democonfigCLIENT_CERTIFICATE_PEM
|
||||||
#error "Please define client certificate(democonfigCLIENT_CERTIFICATE_PEM) in demo_config.h."
|
#error "Please define client certificate(democonfigCLIENT_CERTIFICATE_PEM) in demo_config.h."
|
||||||
|
@ -337,14 +337,14 @@
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* If a username is defined, a client password also would need to be defined for
|
/* If a username is defined, a client password also would need to be defined for
|
||||||
* client authentication. */
|
* client authentication. */
|
||||||
#ifndef democonfigCLIENT_PASSWORD
|
#ifndef democonfigCLIENT_PASSWORD
|
||||||
#error "Please define client password(democonfigCLIENT_PASSWORD) in demo_config.h for client authentication based on username/password."
|
#error "Please define client password(democonfigCLIENT_PASSWORD) in demo_config.h for client authentication based on username/password."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* AWS IoT MQTT broker port needs to be 443 for client authentication based on
|
/* AWS IoT MQTT broker port needs to be 443 for client authentication based on
|
||||||
* username/password. */
|
* username/password. */
|
||||||
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER ) && democonfigMQTT_BROKER_PORT != 443
|
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER ) && democonfigMQTT_BROKER_PORT != 443
|
||||||
#error "Broker port(democonfigMQTT_BROKER_PORT) should be defined as 443 in demo_config.h for client authentication based on username/password in AWS IoT Core."
|
#error "Broker port(democonfigMQTT_BROKER_PORT) should be defined as 443 in demo_config.h for client authentication based on username/password in AWS IoT Core."
|
||||||
#endif
|
#endif
|
||||||
|
@ -529,7 +529,7 @@ static void prvMQTTAgentTask( void * pParam );
|
||||||
*
|
*
|
||||||
* The implementation uses MQTT agent to queue a publish request. It then waits
|
* The implementation uses MQTT agent to queue a publish request. It then waits
|
||||||
* for the request complete notification from the agent. The notification along with result of the
|
* for the request complete notification from the agent. The notification along with result of the
|
||||||
* operation is sent back to the caller task using xTaksNotify API. For publishes involving QOS 1 and
|
* operation is sent back to the caller task using xTaskNotify API. For publishes involving QOS 1 and
|
||||||
* QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function
|
* QOS2 the operation is complete once an acknowledgment (PUBACK) is received. OTA agent uses this function
|
||||||
* to fetch new job, provide status update and send other control related messages to the MQTT broker.
|
* to fetch new job, provide status update and send other control related messages to the MQTT broker.
|
||||||
*
|
*
|
||||||
|
@ -593,7 +593,7 @@ static OtaMqttStatus_t prvMQTTUnsubscribe( const char * pTopicFilter,
|
||||||
* within ota_config.h. This function is used to fetch a free buffer from the pool for processing
|
* within ota_config.h. This function is used to fetch a free buffer from the pool for processing
|
||||||
* by the OTA agent task. It uses a mutex for thread safe access to the pool.
|
* by the OTA agent task. It uses a mutex for thread safe access to the pool.
|
||||||
*
|
*
|
||||||
* @return A pointer to an unusued buffer. NULL if there are no buffers available.
|
* @return A pointer to an unused buffer. NULL if there are no buffers available.
|
||||||
*/
|
*/
|
||||||
static OtaEventData_t * prvOTAEventBufferGet( void );
|
static OtaEventData_t * prvOTAEventBufferGet( void );
|
||||||
|
|
||||||
|
@ -667,7 +667,7 @@ static void prvMqttDataCallback( void * pContext,
|
||||||
*
|
*
|
||||||
* The callback is not subscribed with MQTT broker, but only with local subscription manager.
|
* The callback is not subscribed with MQTT broker, but only with local subscription manager.
|
||||||
* A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is
|
* A wildcard OTA job topic is used for subscription so that all unsolicited messages related to OTA is
|
||||||
* forwarded to this callback for filteration. Right now the callback is used to filter responses to job requests
|
* forwarded to this callback for filtration. Right now the callback is used to filter responses to job requests
|
||||||
* from the OTA service.
|
* from the OTA service.
|
||||||
*
|
*
|
||||||
* @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection.
|
* @param[in] pvIncomingPublishCallbackContext MQTT context which stores the connection.
|
||||||
|
@ -1043,12 +1043,12 @@ static void prvCommandCallback( MQTTAgentCommandContext_t * pxCommandContext,
|
||||||
static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext,
|
static void prvMQTTSubscribeCompleteCallback( MQTTAgentCommandContext_t * pxCommandContext,
|
||||||
MQTTAgentReturnInfo_t * pxReturnInfo )
|
MQTTAgentReturnInfo_t * pxReturnInfo )
|
||||||
{
|
{
|
||||||
MQTTAgentSubscribeArgs_t * pSubsribeArgs;
|
MQTTAgentSubscribeArgs_t * pSubscribeArgs;
|
||||||
|
|
||||||
if( pxReturnInfo->returnCode == MQTTSuccess )
|
if( pxReturnInfo->returnCode == MQTTSuccess )
|
||||||
{
|
{
|
||||||
pSubsribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs );
|
pSubscribeArgs = ( MQTTAgentSubscribeArgs_t * ) ( pxCommandContext->pArgs );
|
||||||
prvRegisterOTACallback( pSubsribeArgs->pSubscribeInfo->pTopicFilter, pSubsribeArgs->pSubscribeInfo->topicFilterLength );
|
prvRegisterOTACallback( pSubscribeArgs->pSubscribeInfo->pTopicFilter, pSubscribeArgs->pSubscribeInfo->topicFilterLength );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store the result in the application defined context so the task that
|
/* Store the result in the application defined context so the task that
|
||||||
|
@ -1288,42 +1288,43 @@ static BaseType_t prvSocketConnect( NetworkContext_t * pxNetworkContext )
|
||||||
NetworkCredentials_t xNetworkCredentials = { 0 };
|
NetworkCredentials_t xNetworkCredentials = { 0 };
|
||||||
|
|
||||||
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER )
|
#if defined( democonfigUSE_AWS_IOT_CORE_BROKER )
|
||||||
#if defined( democonfigCLIENT_USERNAME )
|
#if defined( democonfigCLIENT_USERNAME )
|
||||||
/*
|
|
||||||
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
|
||||||
* to AWS IoT Core with Custom Authentication on port 443.
|
|
||||||
*
|
|
||||||
* Custom Authentication uses the contents of the username and password
|
|
||||||
* fields of the MQTT CONNECT packet to authenticate the client.
|
|
||||||
*
|
|
||||||
* For more information, refer to the documentation at:
|
|
||||||
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
|
||||||
*/
|
|
||||||
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
|
||||||
#if democonfigMQTT_BROKER_PORT != 443U
|
|
||||||
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
|
||||||
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
|
||||||
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
|
||||||
/*
|
|
||||||
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
|
||||||
* x509 Certificate Authentication.
|
|
||||||
*/
|
|
||||||
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
|
||||||
|
|
||||||
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* An ALPN identifier is only required when connecting to AWS IoT core on port 443.
|
* When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
|
||||||
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
|
* to AWS IoT Core with Custom Authentication on port 443.
|
||||||
*/
|
*
|
||||||
#if democonfigMQTT_BROKER_PORT == 443U
|
* Custom Authentication uses the contents of the username and password
|
||||||
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols;
|
* fields of the MQTT CONNECT packet to authenticate the client.
|
||||||
#elif democonfigMQTT_BROKER_PORT == 8883U
|
*
|
||||||
xNetworkCredentials.pAlpnProtos = NULL;
|
* For more information, refer to the documentation at:
|
||||||
#else /* democonfigMQTT_BROKER_PORT != 8883U */
|
* https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
|
||||||
xNetworkCredentials.pAlpnProtos = NULL;
|
*/
|
||||||
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
|
static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
|
||||||
|
#if democonfigMQTT_BROKER_PORT != 443U
|
||||||
|
#error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
|
||||||
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
||||||
|
#else /* if !defined( democonfigCLIENT_USERNAME ) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
|
||||||
|
* x509 Certificate Authentication.
|
||||||
|
*/
|
||||||
|
static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
|
||||||
|
#endif /* !defined( democonfigCLIENT_USERNAME ) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An ALPN identifier is only required when connecting to AWS IoT core on port 443.
|
||||||
|
* https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
|
||||||
|
*/
|
||||||
|
#if democonfigMQTT_BROKER_PORT == 443U
|
||||||
|
xNetworkCredentials.pAlpnProtos = ppcAlpnProtocols;
|
||||||
|
#elif democonfigMQTT_BROKER_PORT == 8883U
|
||||||
|
xNetworkCredentials.pAlpnProtos = NULL;
|
||||||
|
#else /* democonfigMQTT_BROKER_PORT != 8883U */
|
||||||
|
xNetworkCredentials.pAlpnProtos = NULL;
|
||||||
|
#error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
|
||||||
|
#endif /* democonfigMQTT_BROKER_PORT != 443U */
|
||||||
#else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
#else /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
||||||
xNetworkCredentials.pAlpnProtos = NULL;
|
xNetworkCredentials.pAlpnProtos = NULL;
|
||||||
#endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
#endif /* !defined( democonfigUSE_AWS_IOT_CORE_BROKER ) */
|
||||||
|
@ -2037,7 +2038,7 @@ static BaseType_t prvRunOTADemo( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remvove callback for receiving messages intended for OTA agent from broker,
|
* Remove callback for receiving messages intended for OTA agent from broker,
|
||||||
* for which the topic has not been subscribed for.
|
* for which the topic has not been subscribed for.
|
||||||
*/
|
*/
|
||||||
removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext,
|
removeSubscription( ( SubscriptionElement_t * ) xGlobalMqttAgentContext.pIncomingCallbackContext,
|
||||||
|
@ -2086,6 +2087,7 @@ void vOtaDemoTask( void * pvParam )
|
||||||
if( xPlatformIsNetworkUp() == pdFALSE )
|
if( xPlatformIsNetworkUp() == pdFALSE )
|
||||||
{
|
{
|
||||||
LogInfo( ( "Waiting for the network link up event..." ) );
|
LogInfo( ( "Waiting for the network link up event..." ) );
|
||||||
|
|
||||||
while( xPlatformIsNetworkUp() == pdFALSE )
|
while( xPlatformIsNetworkUp() == pdFALSE )
|
||||||
{
|
{
|
||||||
vTaskDelay( pdMS_TO_TICKS( 1000U ) );
|
vTaskDelay( pdMS_TO_TICKS( 1000U ) );
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Source Files">
|
<Filter Include="Source Files">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
* https://github.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CORE_MQTT_CONFIG_H
|
#ifndef CORE_MQTT_CONFIG_H
|
||||||
#define CORE_MQTT_CONFIG_H
|
#define CORE_MQTT_CONFIG_H
|
||||||
|
|
||||||
|
@ -76,33 +76,34 @@ extern void vLoggingPrintf( const char * pcFormatString,
|
||||||
*/
|
*/
|
||||||
#define MQTT_STATE_ARRAY_MAX_COUNT 10U
|
#define MQTT_STATE_ARRAY_MAX_COUNT 10U
|
||||||
|
|
||||||
/*********************** coreMQTT Agent Configurations **********************/
|
/*********************** coreMQTT Agent Configurations **********************/
|
||||||
/**
|
|
||||||
* @brief The maximum number of pending acknowledgments to track for a single
|
/**
|
||||||
* connection.
|
* @brief The maximum number of pending acknowledgments to track for a single
|
||||||
*
|
* connection.
|
||||||
* @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th
|
*
|
||||||
* at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set
|
* @note The MQTT agent tracks MQTT commands (such as PUBLISH and SUBSCRIBE) th
|
||||||
* the maximum number of acknowledgments that can be outstanding at any one time.
|
* at are still waiting to be acknowledged. MQTT_AGENT_MAX_OUTSTANDING_ACKS set
|
||||||
* The higher this number is the greater the agent's RAM consumption will be.
|
* the maximum number of acknowledgments that can be outstanding at any one time.
|
||||||
*/
|
* The higher this number is the greater the agent's RAM consumption will be.
|
||||||
|
*/
|
||||||
#define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U )
|
#define MQTT_AGENT_MAX_OUTSTANDING_ACKS ( 20U )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Time in MS that the MQTT agent task will wait in the Blocked state (so
|
* @brief Time in MS that the MQTT agent task will wait in the Blocked state (so
|
||||||
* not using any CPU time) for a command to arrive in its command queue before
|
* not using any CPU time) for a command to arrive in its command queue before
|
||||||
* exiting the blocked state so it can call MQTT_ProcessLoop().
|
* exiting the blocked state so it can call MQTT_ProcessLoop().
|
||||||
*
|
*
|
||||||
* @note It is important MQTT_ProcessLoop() is called often if there is known
|
* @note It is important MQTT_ProcessLoop() is called often if there is known
|
||||||
* MQTT traffic, but calling it too often can take processing time away from
|
* MQTT traffic, but calling it too often can take processing time away from
|
||||||
* lower priority tasks and waste CPU time and power.
|
* lower priority tasks and waste CPU time and power.
|
||||||
*/
|
*/
|
||||||
#define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 )
|
#define MQTT_AGENT_MAX_EVENT_QUEUE_WAIT_TIME ( 1000 )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The number of command structures to allocate in the pool
|
* @brief The number of command structures to allocate in the pool
|
||||||
* for the agent.
|
* for the agent.
|
||||||
*/
|
*/
|
||||||
#define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10
|
#define MQTT_COMMAND_CONTEXTS_POOL_SIZE 10
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -179,8 +179,8 @@ extern void vLoggingPrintf( const char * pcFormatString,
|
||||||
* can be set to following -
|
* can be set to following -
|
||||||
* Enable data over MQTT - ( OTA_DATA_OVER_MQTT )
|
* Enable data over MQTT - ( OTA_DATA_OVER_MQTT )
|
||||||
* Enable data over HTTP - ( OTA_DATA_OVER_HTTP)
|
* Enable data over HTTP - ( OTA_DATA_OVER_HTTP)
|
||||||
*
|
*
|
||||||
* Note - Please check the OTA over HTTP demo which has the HTTP data transfer functionality and
|
* Note - Please check the OTA over HTTP demo which has the HTTP data transfer functionality and
|
||||||
* and this configuration is set to OTA_DATA_OVER_HTTP.
|
* and this configuration is set to OTA_DATA_OVER_HTTP.
|
||||||
*/
|
*/
|
||||||
#define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_MQTT )
|
#define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_MQTT )
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.31205.134
|
VisualStudioVersion = 16.0.31205.134
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[{000214A0-0000-0000-C000-000000000046}]
|
[{000214A0-0000-0000-C000-000000000046}]
|
||||||
Prop3=19,2
|
Prop3=19,2
|
||||||
[InternetShortcut]
|
[InternetShortcut]
|
||||||
URL=http://www.freertos.org/labs
|
URL=http://www.freertos.org/labs
|
||||||
IDList=
|
IDList=
|
||||||
|
|
|
@ -1,372 +1,385 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://github.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
/* FreeRTOS+TCP includes. */
|
/* FreeRTOS+TCP includes. */
|
||||||
#include "FreeRTOS_IP.h"
|
#include "FreeRTOS_IP.h"
|
||||||
#include "FreeRTOS_Sockets.h"
|
#include "FreeRTOS_Sockets.h"
|
||||||
#include "FreeRTOS_TCP_server.h"
|
#include "FreeRTOS_TCP_server.h"
|
||||||
#include "FreeRTOS_server_private.h"
|
#include "FreeRTOS_server_private.h"
|
||||||
|
|
||||||
/* Remove the entire file if TCP is not being used. */
|
/* Remove the entire file if TCP is not being used. */
|
||||||
#if( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) )
|
#if ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) )
|
||||||
|
|
||||||
#if !defined( ARRAY_SIZE )
|
#if !defined( ARRAY_SIZE )
|
||||||
#define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] )
|
#define ARRAY_SIZE( x ) ( BaseType_t ) ( sizeof( x ) / sizeof( x )[ 0 ] )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket );
|
static void prvReceiveNewClient( TCPServer_t * pxServer,
|
||||||
static char *strnew( const char *pcString );
|
BaseType_t xIndex,
|
||||||
/* Remove slashes at the end of a path. */
|
Socket_t xNexSocket );
|
||||||
static void prvRemoveSlash( char *pcDir );
|
static char * strnew( const char * pcString );
|
||||||
|
/* Remove slashes at the end of a path. */
|
||||||
TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount )
|
static void prvRemoveSlash( char * pcDir );
|
||||||
{
|
|
||||||
TCPServer_t *pxServer;
|
TCPServer_t * FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG * pxConfigs,
|
||||||
SocketSet_t xSocketSet;
|
BaseType_t xCount )
|
||||||
|
{
|
||||||
/* Create a new server.
|
TCPServer_t * pxServer;
|
||||||
xPort / xPortAlt : Make the service available on 1 or 2 public port numbers. */
|
SocketSet_t xSocketSet;
|
||||||
xSocketSet = FreeRTOS_CreateSocketSet();
|
|
||||||
|
/* Create a new server.
|
||||||
if( xSocketSet != NULL )
|
* xPort / xPortAlt : Make the service available on 1 or 2 public port numbers. */
|
||||||
{
|
xSocketSet = FreeRTOS_CreateSocketSet();
|
||||||
BaseType_t xSize;
|
|
||||||
|
if( xSocketSet != NULL )
|
||||||
xSize = sizeof( *pxServer ) - sizeof( pxServer->xServers ) + xCount * sizeof( pxServer->xServers[ 0 ] );
|
{
|
||||||
|
BaseType_t xSize;
|
||||||
pxServer = ( TCPServer_t * ) pvPortMallocLarge( xSize );
|
|
||||||
if( pxServer != NULL )
|
xSize = sizeof( *pxServer ) - sizeof( pxServer->xServers ) + xCount * sizeof( pxServer->xServers[ 0 ] );
|
||||||
{
|
|
||||||
struct freertos_sockaddr xAddress;
|
pxServer = ( TCPServer_t * ) pvPortMallocLarge( xSize );
|
||||||
BaseType_t xNoTimeout = 0;
|
|
||||||
BaseType_t xIndex;
|
if( pxServer != NULL )
|
||||||
|
{
|
||||||
memset( pxServer, '\0', xSize );
|
struct freertos_sockaddr xAddress;
|
||||||
pxServer->xServerCount = xCount;
|
BaseType_t xNoTimeout = 0;
|
||||||
pxServer->xSocketSet = xSocketSet;
|
BaseType_t xIndex;
|
||||||
|
|
||||||
for( xIndex = 0; xIndex < xCount; xIndex++ )
|
memset( pxServer, '\0', xSize );
|
||||||
{
|
pxServer->xServerCount = xCount;
|
||||||
BaseType_t xPortNumber = pxConfigs[ xIndex ].xPortNumber;
|
pxServer->xSocketSet = xSocketSet;
|
||||||
|
|
||||||
if( xPortNumber > 0 )
|
for( xIndex = 0; xIndex < xCount; xIndex++ )
|
||||||
{
|
{
|
||||||
Socket_t xSocket;
|
BaseType_t xPortNumber = pxConfigs[ xIndex ].xPortNumber;
|
||||||
|
|
||||||
xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
|
if( xPortNumber > 0 )
|
||||||
FreeRTOS_printf( ( "TCP socket on port %d\n", ( int )xPortNumber ) );
|
{
|
||||||
|
Socket_t xSocket;
|
||||||
if( xSocket != FREERTOS_INVALID_SOCKET )
|
|
||||||
{
|
xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
FreeRTOS_printf( ( "TCP socket on port %d\n", ( int ) xPortNumber ) );
|
||||||
{
|
|
||||||
xAddress.sin_address.ulIP_IPv4 = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */
|
if( xSocket != FREERTOS_INVALID_SOCKET )
|
||||||
}
|
{
|
||||||
#else
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
{
|
{
|
||||||
xAddress.sin_addr = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */
|
xAddress.sin_address.ulIP_IPv4 = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */
|
||||||
}
|
}
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
#else
|
||||||
|
{
|
||||||
xAddress.sin_port = FreeRTOS_htons( xPortNumber );
|
xAddress.sin_addr = FreeRTOS_GetIPAddress(); /* Single NIC, currently not used */
|
||||||
xAddress.sin_family = FREERTOS_AF_INET;
|
}
|
||||||
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
FreeRTOS_bind( xSocket, &xAddress, sizeof( xAddress ) );
|
|
||||||
FreeRTOS_listen( xSocket, pxConfigs[ xIndex ].xBackLog );
|
xAddress.sin_port = FreeRTOS_htons( xPortNumber );
|
||||||
|
xAddress.sin_family = FREERTOS_AF_INET;
|
||||||
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
|
|
||||||
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
|
FreeRTOS_bind( xSocket, &xAddress, sizeof( xAddress ) );
|
||||||
|
FreeRTOS_listen( xSocket, pxConfigs[ xIndex ].xBackLog );
|
||||||
#if( ipconfigHTTP_RX_BUFSIZE > 0 )
|
|
||||||
{
|
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
|
||||||
if( pxConfigs[ xIndex ].eType == eSERVER_HTTP )
|
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
|
||||||
{
|
|
||||||
WinProperties_t xWinProps;
|
#if ( ipconfigHTTP_RX_BUFSIZE > 0 )
|
||||||
|
{
|
||||||
memset( &xWinProps, '\0', sizeof( xWinProps ) );
|
if( pxConfigs[ xIndex ].eType == eSERVER_HTTP )
|
||||||
/* The parent socket itself won't get connected. The properties below
|
{
|
||||||
will be inherited by each new child socket. */
|
WinProperties_t xWinProps;
|
||||||
xWinProps.lTxBufSize = ipconfigHTTP_TX_BUFSIZE;
|
|
||||||
xWinProps.lTxWinSize = ipconfigHTTP_TX_WINSIZE;
|
memset( &xWinProps, '\0', sizeof( xWinProps ) );
|
||||||
xWinProps.lRxBufSize = ipconfigHTTP_RX_BUFSIZE;
|
|
||||||
xWinProps.lRxWinSize = ipconfigHTTP_RX_WINSIZE;
|
/* The parent socket itself won't get connected. The properties below
|
||||||
|
* will be inherited by each new child socket. */
|
||||||
/* Set the window and buffer sizes. */
|
xWinProps.lTxBufSize = ipconfigHTTP_TX_BUFSIZE;
|
||||||
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
|
xWinProps.lTxWinSize = ipconfigHTTP_TX_WINSIZE;
|
||||||
}
|
xWinProps.lRxBufSize = ipconfigHTTP_RX_BUFSIZE;
|
||||||
}
|
xWinProps.lRxWinSize = ipconfigHTTP_RX_WINSIZE;
|
||||||
#endif
|
|
||||||
|
/* Set the window and buffer sizes. */
|
||||||
FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ|eSELECT_EXCEPT );
|
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
|
||||||
pxServer->xServers[ xIndex ].xSocket = xSocket;
|
}
|
||||||
pxServer->xServers[ xIndex ].eType = pxConfigs[ xIndex ].eType;
|
}
|
||||||
pxServer->xServers[ xIndex ].pcRootDir = strnew( pxConfigs[ xIndex ].pcRootDir );
|
#endif /* if ( ipconfigHTTP_RX_BUFSIZE > 0 ) */
|
||||||
prvRemoveSlash( ( char * ) pxServer->xServers[ xIndex ].pcRootDir );
|
|
||||||
}
|
FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ | eSELECT_EXCEPT );
|
||||||
}
|
pxServer->xServers[ xIndex ].xSocket = xSocket;
|
||||||
}
|
pxServer->xServers[ xIndex ].eType = pxConfigs[ xIndex ].eType;
|
||||||
}
|
pxServer->xServers[ xIndex ].pcRootDir = strnew( pxConfigs[ xIndex ].pcRootDir );
|
||||||
else
|
prvRemoveSlash( ( char * ) pxServer->xServers[ xIndex ].pcRootDir );
|
||||||
{
|
}
|
||||||
/* Could not allocate the server, delete the socket set */
|
}
|
||||||
FreeRTOS_DeleteSocketSet( xSocketSet );
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
/* Could not allocate the server, delete the socket set */
|
||||||
/* Could not create a socket set, return NULL */
|
FreeRTOS_DeleteSocketSet( xSocketSet );
|
||||||
pxServer = NULL;
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
return pxServer;
|
{
|
||||||
}
|
/* Could not create a socket set, return NULL */
|
||||||
/*-----------------------------------------------------------*/
|
pxServer = NULL;
|
||||||
|
}
|
||||||
static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket )
|
|
||||||
{
|
return pxServer;
|
||||||
TCPClient_t *pxClient = NULL;
|
}
|
||||||
BaseType_t xSize = 0;
|
/*-----------------------------------------------------------*/
|
||||||
FTCPWorkFunction fWorkFunc = NULL;
|
|
||||||
FTCPDeleteFunction fDeleteFunc = NULL;
|
static void prvReceiveNewClient( TCPServer_t * pxServer,
|
||||||
const char *pcType = "Unknown";
|
BaseType_t xIndex,
|
||||||
|
Socket_t xNexSocket )
|
||||||
/*_RB_ Can the work and delete functions be part of the xSERVER_CONFIG structure
|
{
|
||||||
becomes generic, with no pre-processing required? */
|
TCPClient_t * pxClient = NULL;
|
||||||
#if( ipconfigUSE_HTTP != 0 )
|
BaseType_t xSize = 0;
|
||||||
{
|
FTCPWorkFunction fWorkFunc = NULL;
|
||||||
if( pxServer->xServers[ xIndex ].eType == eSERVER_HTTP )
|
FTCPDeleteFunction fDeleteFunc = NULL;
|
||||||
{
|
const char * pcType = "Unknown";
|
||||||
xSize = sizeof( HTTPClient_t );
|
|
||||||
fWorkFunc = xHTTPClientWork;
|
/*_RB_ Can the work and delete functions be part of the xSERVER_CONFIG structure
|
||||||
fDeleteFunc = vHTTPClientDelete;
|
* becomes generic, with no pre-processing required? */
|
||||||
pcType = "HTTP";
|
#if ( ipconfigUSE_HTTP != 0 )
|
||||||
}
|
{
|
||||||
}
|
if( pxServer->xServers[ xIndex ].eType == eSERVER_HTTP )
|
||||||
#endif /* ipconfigUSE_HTTP != 0 */
|
{
|
||||||
|
xSize = sizeof( HTTPClient_t );
|
||||||
#if( ipconfigUSE_FTP != 0 )
|
fWorkFunc = xHTTPClientWork;
|
||||||
{
|
fDeleteFunc = vHTTPClientDelete;
|
||||||
if( pxServer->xServers[ xIndex ].eType == eSERVER_FTP )
|
pcType = "HTTP";
|
||||||
{
|
}
|
||||||
xSize = sizeof( FTPClient_t );
|
}
|
||||||
fWorkFunc = xFTPClientWork;
|
#endif /* ipconfigUSE_HTTP != 0 */
|
||||||
fDeleteFunc = vFTPClientDelete;
|
|
||||||
pcType = "FTP";
|
#if ( ipconfigUSE_FTP != 0 )
|
||||||
}
|
{
|
||||||
}
|
if( pxServer->xServers[ xIndex ].eType == eSERVER_FTP )
|
||||||
#endif /* ipconfigUSE_FTP != 0 */
|
{
|
||||||
|
xSize = sizeof( FTPClient_t );
|
||||||
/* Malloc enough space for a new HTTP-client */
|
fWorkFunc = xFTPClientWork;
|
||||||
if( xSize )
|
fDeleteFunc = vFTPClientDelete;
|
||||||
{
|
pcType = "FTP";
|
||||||
pxClient = ( TCPClient_t* ) pvPortMallocLarge( xSize );
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* ipconfigUSE_FTP != 0 */
|
||||||
if( pxClient != NULL )
|
|
||||||
{
|
/* Malloc enough space for a new HTTP-client */
|
||||||
memset( pxClient, '\0', xSize );
|
if( xSize )
|
||||||
|
{
|
||||||
/* Put the new client in front of the list. */
|
pxClient = ( TCPClient_t * ) pvPortMallocLarge( xSize );
|
||||||
pxClient->eType = pxServer->xServers[ xIndex ].eType;
|
}
|
||||||
pxClient->pcRootDir = pxServer->xServers[ xIndex ].pcRootDir;
|
|
||||||
pxClient->pxParent = pxServer;
|
if( pxClient != NULL )
|
||||||
pxClient->xSocket = xNexSocket;
|
{
|
||||||
pxClient->pxNextClient = pxServer->pxClients;
|
memset( pxClient, '\0', xSize );
|
||||||
pxClient->fWorkFunction = fWorkFunc;
|
|
||||||
pxClient->fDeleteFunction = fDeleteFunc;
|
/* Put the new client in front of the list. */
|
||||||
pxServer->pxClients = pxClient;
|
pxClient->eType = pxServer->xServers[ xIndex ].eType;
|
||||||
|
pxClient->pcRootDir = pxServer->xServers[ xIndex ].pcRootDir;
|
||||||
FreeRTOS_FD_SET( xNexSocket, pxServer->xSocketSet, eSELECT_READ|eSELECT_EXCEPT );
|
pxClient->pxParent = pxServer;
|
||||||
}
|
pxClient->xSocket = xNexSocket;
|
||||||
else
|
pxClient->pxNextClient = pxServer->pxClients;
|
||||||
{
|
pxClient->fWorkFunction = fWorkFunc;
|
||||||
pcType = "closed";
|
pxClient->fDeleteFunction = fDeleteFunc;
|
||||||
FreeRTOS_closesocket( xNexSocket );
|
pxServer->pxClients = pxClient;
|
||||||
}
|
|
||||||
{
|
FreeRTOS_FD_SET( xNexSocket, pxServer->xSocketSet, eSELECT_READ | eSELECT_EXCEPT );
|
||||||
struct freertos_sockaddr xRemoteAddress;
|
}
|
||||||
FreeRTOS_GetRemoteAddress( pxClient->xSocket, &xRemoteAddress );
|
else
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
{
|
||||||
{
|
pcType = "closed";
|
||||||
FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, (unsigned)FreeRTOS_ntohl( xRemoteAddress.sin_address.ulIP_IPv4 ) ) );
|
FreeRTOS_closesocket( xNexSocket );
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
{
|
{
|
||||||
FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, (unsigned)FreeRTOS_ntohl( xRemoteAddress.sin_addr ) ) );
|
struct freertos_sockaddr xRemoteAddress;
|
||||||
}
|
FreeRTOS_GetRemoteAddress( pxClient->xSocket, &xRemoteAddress );
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
}
|
{
|
||||||
|
FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, ( unsigned ) FreeRTOS_ntohl( xRemoteAddress.sin_address.ulIP_IPv4 ) ) );
|
||||||
/* Remove compiler warnings in case FreeRTOS_printf() is not used. */
|
}
|
||||||
( void ) pcType;
|
#else
|
||||||
}
|
{
|
||||||
/*-----------------------------------------------------------*/
|
FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, ( unsigned ) FreeRTOS_ntohl( xRemoteAddress.sin_addr ) ) );
|
||||||
|
}
|
||||||
void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime )
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
{
|
}
|
||||||
TCPClient_t **ppxClient;
|
|
||||||
BaseType_t xIndex;
|
/* Remove compiler warnings in case FreeRTOS_printf() is not used. */
|
||||||
BaseType_t xRc;
|
( void ) pcType;
|
||||||
|
}
|
||||||
/* Let the server do one working cycle */
|
/*-----------------------------------------------------------*/
|
||||||
xRc = FreeRTOS_select( pxServer->xSocketSet, xBlockingTime );
|
|
||||||
|
void FreeRTOS_TCPServerWork( TCPServer_t * pxServer,
|
||||||
if( xRc != 0 )
|
TickType_t xBlockingTime )
|
||||||
{
|
{
|
||||||
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
|
TCPClient_t ** ppxClient;
|
||||||
{
|
BaseType_t xIndex;
|
||||||
struct freertos_sockaddr xAddress;
|
BaseType_t xRc;
|
||||||
Socket_t xNexSocket;
|
|
||||||
socklen_t xSocketLength;
|
/* Let the server do one working cycle */
|
||||||
|
xRc = FreeRTOS_select( pxServer->xSocketSet, xBlockingTime );
|
||||||
if( pxServer->xServers[ xIndex ].xSocket == FREERTOS_NO_SOCKET )
|
|
||||||
{
|
if( xRc != 0 )
|
||||||
continue;
|
{
|
||||||
}
|
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
|
||||||
|
{
|
||||||
xSocketLength = sizeof( xAddress );
|
struct freertos_sockaddr xAddress;
|
||||||
xNexSocket = FreeRTOS_accept( pxServer->xServers[ xIndex ].xSocket, &xAddress, &xSocketLength);
|
Socket_t xNexSocket;
|
||||||
|
socklen_t xSocketLength;
|
||||||
if( ( xNexSocket != FREERTOS_NO_SOCKET ) && ( xNexSocket != FREERTOS_INVALID_SOCKET ) )
|
|
||||||
{
|
if( pxServer->xServers[ xIndex ].xSocket == FREERTOS_NO_SOCKET )
|
||||||
prvReceiveNewClient( pxServer, xIndex, xNexSocket );
|
{
|
||||||
}
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
xSocketLength = sizeof( xAddress );
|
||||||
ppxClient = &pxServer->pxClients;
|
xNexSocket = FreeRTOS_accept( pxServer->xServers[ xIndex ].xSocket, &xAddress, &xSocketLength );
|
||||||
|
|
||||||
while( ( * ppxClient ) != NULL )
|
if( ( xNexSocket != FREERTOS_NO_SOCKET ) && ( xNexSocket != FREERTOS_INVALID_SOCKET ) )
|
||||||
{
|
{
|
||||||
TCPClient_t *pxThis = *ppxClient;
|
prvReceiveNewClient( pxServer, xIndex, xNexSocket );
|
||||||
|
}
|
||||||
/* Almost C++ */
|
}
|
||||||
xRc = pxThis->fWorkFunction( pxThis );
|
}
|
||||||
|
|
||||||
if (xRc < 0 )
|
ppxClient = &pxServer->pxClients;
|
||||||
{
|
|
||||||
*ppxClient = pxThis->pxNextClient;
|
while( ( *ppxClient ) != NULL )
|
||||||
/* Close handles, resources */
|
{
|
||||||
pxThis->fDeleteFunction( pxThis );
|
TCPClient_t * pxThis = *ppxClient;
|
||||||
/* Free the space */
|
|
||||||
vPortFreeLarge( pxThis );
|
/* Almost C++ */
|
||||||
}
|
xRc = pxThis->fWorkFunction( pxThis );
|
||||||
else
|
|
||||||
{
|
if( xRc < 0 )
|
||||||
ppxClient = &( pxThis->pxNextClient );
|
{
|
||||||
}
|
*ppxClient = pxThis->pxNextClient;
|
||||||
}
|
/* Close handles, resources */
|
||||||
}
|
pxThis->fDeleteFunction( pxThis );
|
||||||
/*-----------------------------------------------------------*/
|
/* Free the space */
|
||||||
|
vPortFreeLarge( pxThis );
|
||||||
static char *strnew( const char *pcString )
|
}
|
||||||
{
|
else
|
||||||
BaseType_t xLength;
|
{
|
||||||
char *pxBuffer;
|
ppxClient = &( pxThis->pxNextClient );
|
||||||
|
}
|
||||||
xLength = strlen( pcString ) + 1;
|
}
|
||||||
pxBuffer = ( char * ) pvPortMalloc( xLength );
|
}
|
||||||
if( pxBuffer != NULL )
|
/*-----------------------------------------------------------*/
|
||||||
{
|
|
||||||
memcpy( pxBuffer, pcString, xLength );
|
static char * strnew( const char * pcString )
|
||||||
}
|
{
|
||||||
|
BaseType_t xLength;
|
||||||
return pxBuffer;
|
char * pxBuffer;
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
xLength = strlen( pcString ) + 1;
|
||||||
|
pxBuffer = ( char * ) pvPortMalloc( xLength );
|
||||||
static void prvRemoveSlash( char *pcDir )
|
|
||||||
{
|
if( pxBuffer != NULL )
|
||||||
BaseType_t xLength = strlen( pcDir );
|
{
|
||||||
|
memcpy( pxBuffer, pcString, xLength );
|
||||||
while( ( xLength > 0 ) && ( pcDir[ xLength - 1 ] == '/' ) )
|
}
|
||||||
{
|
|
||||||
pcDir[ --xLength ] = '\0';
|
return pxBuffer;
|
||||||
}
|
}
|
||||||
}
|
/*-----------------------------------------------------------*/
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
static void prvRemoveSlash( char * pcDir )
|
||||||
#if( ipconfigSUPPORT_SIGNALS != 0 )
|
{
|
||||||
|
BaseType_t xLength = strlen( pcDir );
|
||||||
/* FreeRTOS_TCPServerWork() calls select().
|
|
||||||
The two functions below provide a possibility to interrupt
|
while( ( xLength > 0 ) && ( pcDir[ xLength - 1 ] == '/' ) )
|
||||||
the call to select(). After the interruption, resume
|
{
|
||||||
by calling FreeRTOS_TCPServerWork() again. */
|
pcDir[ --xLength ] = '\0';
|
||||||
BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer )
|
}
|
||||||
{
|
}
|
||||||
BaseType_t xIndex;
|
/*-----------------------------------------------------------*/
|
||||||
BaseType_t xResult = pdFALSE;
|
|
||||||
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
|
#if ( ipconfigSUPPORT_SIGNALS != 0 )
|
||||||
{
|
|
||||||
if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
|
/* FreeRTOS_TCPServerWork() calls select().
|
||||||
{
|
* The two functions below provide a possibility to interrupt
|
||||||
FreeRTOS_SignalSocket( pxServer->xServers[ xIndex ].xSocket );
|
* the call to select(). After the interruption, resume
|
||||||
xResult = pdTRUE;
|
* by calling FreeRTOS_TCPServerWork() again. */
|
||||||
break;
|
BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t * pxServer )
|
||||||
}
|
{
|
||||||
}
|
BaseType_t xIndex;
|
||||||
|
BaseType_t xResult = pdFALSE;
|
||||||
return xResult;
|
|
||||||
}
|
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
|
||||||
|
{
|
||||||
#endif /* ipconfigSUPPORT_SIGNALS */
|
if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
|
||||||
/*-----------------------------------------------------------*/
|
{
|
||||||
|
FreeRTOS_SignalSocket( pxServer->xServers[ xIndex ].xSocket );
|
||||||
#if( ipconfigSUPPORT_SIGNALS != 0 )
|
xResult = pdTRUE;
|
||||||
|
break;
|
||||||
/* Same as above: this function may be called from an ISR,
|
}
|
||||||
for instance a GPIO interrupt. */
|
}
|
||||||
BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken )
|
|
||||||
{
|
return xResult;
|
||||||
BaseType_t xIndex;
|
}
|
||||||
BaseType_t xResult = pdFALSE;
|
|
||||||
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
|
#endif /* ipconfigSUPPORT_SIGNALS */
|
||||||
{
|
/*-----------------------------------------------------------*/
|
||||||
if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
|
|
||||||
{
|
#if ( ipconfigSUPPORT_SIGNALS != 0 )
|
||||||
FreeRTOS_SignalSocketFromISR( pxServer->xServers[ xIndex ].xSocket, pxHigherPriorityTaskWoken );
|
|
||||||
xResult = pdTRUE;
|
/* Same as above: this function may be called from an ISR,
|
||||||
break;
|
* for instance a GPIO interrupt. */
|
||||||
}
|
BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t * pxServer,
|
||||||
}
|
BaseType_t * pxHigherPriorityTaskWoken )
|
||||||
|
{
|
||||||
return xResult;
|
BaseType_t xIndex;
|
||||||
}
|
BaseType_t xResult = pdFALSE;
|
||||||
#endif /* ipconfigSUPPORT_SIGNALS */
|
|
||||||
/*-----------------------------------------------------------*/
|
for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
|
||||||
|
{
|
||||||
#endif /* ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) */
|
if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
|
||||||
|
{
|
||||||
|
FreeRTOS_SignalSocketFromISR( pxServer->xServers[ xIndex ].xSocket, pxHigherPriorityTaskWoken );
|
||||||
|
xResult = pdTRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xResult;
|
||||||
|
}
|
||||||
|
#endif /* ipconfigSUPPORT_SIGNALS */
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#endif /* ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) */
|
||||||
|
|
|
@ -1,74 +1,75 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS+TCP V2.0.3
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://aws.amazon.com/freertos
|
* https://www.FreeRTOS.org
|
||||||
* https://www.FreeRTOS.org
|
* https://github.com/FreeRTOS
|
||||||
*/
|
*
|
||||||
|
*/
|
||||||
/* FreeRTOS includes. */
|
|
||||||
#include "FreeRTOS.h"
|
/* FreeRTOS includes. */
|
||||||
|
#include "FreeRTOS.h"
|
||||||
/* FreeRTOS+TCP includes. */
|
|
||||||
#include "FreeRTOS_FTP_commands.h"
|
/* FreeRTOS+TCP includes. */
|
||||||
|
#include "FreeRTOS_FTP_commands.h"
|
||||||
const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ] =
|
|
||||||
{
|
const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ] =
|
||||||
/* cmdLen cmdName[7] cmdType checkLogin checkNullArg */
|
{
|
||||||
{ 4, "USER", ECMD_USER, pdFALSE, pdFALSE },
|
/* cmdLen cmdName[7] cmdType checkLogin checkNullArg */
|
||||||
{ 4, "PASS", ECMD_PASS, pdFALSE, pdFALSE },
|
{ 4, "USER", ECMD_USER, pdFALSE, pdFALSE },
|
||||||
{ 4, "ACCT", ECMD_ACCT, pdTRUE, pdFALSE },
|
{ 4, "PASS", ECMD_PASS, pdFALSE, pdFALSE },
|
||||||
{ 3, "CWD", ECMD_CWD, pdTRUE, pdTRUE },
|
{ 4, "ACCT", ECMD_ACCT, pdTRUE, pdFALSE },
|
||||||
{ 4, "CDUP", ECMD_CDUP, pdTRUE, pdFALSE },
|
{ 3, "CWD", ECMD_CWD, pdTRUE, pdTRUE },
|
||||||
{ 4, "SMNT", ECMD_SMNT, pdTRUE, pdFALSE },
|
{ 4, "CDUP", ECMD_CDUP, pdTRUE, pdFALSE },
|
||||||
{ 4, "QUIT", ECMD_QUIT, pdTRUE, pdFALSE },
|
{ 4, "SMNT", ECMD_SMNT, pdTRUE, pdFALSE },
|
||||||
{ 4, "REIN", ECMD_REIN, pdTRUE, pdFALSE },
|
{ 4, "QUIT", ECMD_QUIT, pdTRUE, pdFALSE },
|
||||||
{ 4, "PORT", ECMD_PORT, pdTRUE, pdFALSE },
|
{ 4, "REIN", ECMD_REIN, pdTRUE, pdFALSE },
|
||||||
{ 4, "PASV", ECMD_PASV, pdTRUE, pdFALSE },
|
{ 4, "PORT", ECMD_PORT, pdTRUE, pdFALSE },
|
||||||
{ 4, "TYPE", ECMD_TYPE, pdTRUE, pdFALSE },
|
{ 4, "PASV", ECMD_PASV, pdTRUE, pdFALSE },
|
||||||
{ 4, "STRU", ECMD_STRU, pdTRUE, pdFALSE },
|
{ 4, "TYPE", ECMD_TYPE, pdTRUE, pdFALSE },
|
||||||
{ 4, "MODE", ECMD_MODE, pdTRUE, pdFALSE },
|
{ 4, "STRU", ECMD_STRU, pdTRUE, pdFALSE },
|
||||||
{ 4, "RETR", ECMD_RETR, pdTRUE, pdTRUE },
|
{ 4, "MODE", ECMD_MODE, pdTRUE, pdFALSE },
|
||||||
{ 4, "STOR", ECMD_STOR, pdTRUE, pdTRUE },
|
{ 4, "RETR", ECMD_RETR, pdTRUE, pdTRUE },
|
||||||
{ 4, "STOU", ECMD_STOU, pdTRUE, pdFALSE },
|
{ 4, "STOR", ECMD_STOR, pdTRUE, pdTRUE },
|
||||||
{ 4, "APPE", ECMD_APPE, pdTRUE, pdFALSE },
|
{ 4, "STOU", ECMD_STOU, pdTRUE, pdFALSE },
|
||||||
{ 4, "ALLO", ECMD_ALLO, pdTRUE, pdFALSE },
|
{ 4, "APPE", ECMD_APPE, pdTRUE, pdFALSE },
|
||||||
{ 4, "REST", ECMD_REST, pdTRUE, pdFALSE },
|
{ 4, "ALLO", ECMD_ALLO, pdTRUE, pdFALSE },
|
||||||
{ 4, "RNFR", ECMD_RNFR, pdTRUE, pdTRUE },
|
{ 4, "REST", ECMD_REST, pdTRUE, pdFALSE },
|
||||||
{ 4, "RNTO", ECMD_RNTO, pdTRUE, pdTRUE },
|
{ 4, "RNFR", ECMD_RNFR, pdTRUE, pdTRUE },
|
||||||
{ 4, "ABOR", ECMD_ABOR, pdTRUE, pdFALSE },
|
{ 4, "RNTO", ECMD_RNTO, pdTRUE, pdTRUE },
|
||||||
{ 4, "SIZE", ECMD_SIZE, pdTRUE, pdTRUE },
|
{ 4, "ABOR", ECMD_ABOR, pdTRUE, pdFALSE },
|
||||||
{ 4, "MDTM", ECMD_MDTM, pdTRUE, pdTRUE },
|
{ 4, "SIZE", ECMD_SIZE, pdTRUE, pdTRUE },
|
||||||
{ 4, "DELE", ECMD_DELE, pdTRUE, pdTRUE },
|
{ 4, "MDTM", ECMD_MDTM, pdTRUE, pdTRUE },
|
||||||
{ 3, "RMD", ECMD_RMD, pdTRUE, pdTRUE },
|
{ 4, "DELE", ECMD_DELE, pdTRUE, pdTRUE },
|
||||||
{ 3, "MKD", ECMD_MKD, pdTRUE, pdTRUE },
|
{ 3, "RMD", ECMD_RMD, pdTRUE, pdTRUE },
|
||||||
{ 3, "PWD", ECMD_PWD, pdTRUE, pdFALSE },
|
{ 3, "MKD", ECMD_MKD, pdTRUE, pdTRUE },
|
||||||
{ 4, "LIST", ECMD_LIST, pdTRUE, pdFALSE },
|
{ 3, "PWD", ECMD_PWD, pdTRUE, pdFALSE },
|
||||||
{ 4, "NLST", ECMD_NLST, pdTRUE, pdFALSE },
|
{ 4, "LIST", ECMD_LIST, pdTRUE, pdFALSE },
|
||||||
{ 4, "SITE", ECMD_SITE, pdTRUE, pdFALSE },
|
{ 4, "NLST", ECMD_NLST, pdTRUE, pdFALSE },
|
||||||
{ 4, "SYST", ECMD_SYST, pdFALSE, pdFALSE },
|
{ 4, "SITE", ECMD_SITE, pdTRUE, pdFALSE },
|
||||||
{ 4, "FEAT", ECMD_FEAT, pdFALSE, pdFALSE },
|
{ 4, "SYST", ECMD_SYST, pdFALSE, pdFALSE },
|
||||||
{ 4, "STAT", ECMD_STAT, pdTRUE, pdFALSE },
|
{ 4, "FEAT", ECMD_FEAT, pdFALSE, pdFALSE },
|
||||||
{ 4, "HELP", ECMD_HELP, pdFALSE, pdFALSE },
|
{ 4, "STAT", ECMD_STAT, pdTRUE, pdFALSE },
|
||||||
{ 4, "NOOP", ECMD_NOOP, pdFALSE, pdFALSE },
|
{ 4, "HELP", ECMD_HELP, pdFALSE, pdFALSE },
|
||||||
{ 4, "EMPT", ECMD_EMPTY, pdFALSE, pdFALSE },
|
{ 4, "NOOP", ECMD_NOOP, pdFALSE, pdFALSE },
|
||||||
{ 4, "CLOS", ECMD_CLOSE, pdTRUE, pdFALSE },
|
{ 4, "EMPT", ECMD_EMPTY, pdFALSE, pdFALSE },
|
||||||
{ 4, "UNKN", ECMD_UNKNOWN, pdFALSE, pdFALSE },
|
{ 4, "CLOS", ECMD_CLOSE, pdTRUE, pdFALSE },
|
||||||
};
|
{ 4, "UNKN", ECMD_UNKNOWN, pdFALSE, pdFALSE },
|
||||||
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,76 +1,87 @@
|
||||||
/*
|
/*
|
||||||
*!
|
* FreeRTOS V202212.00
|
||||||
*! The protocols implemented in this file are intended to be demo quality only,
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*! and not for production devices.
|
*
|
||||||
*!
|
* 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
|
||||||
* FreeRTOS+TCP V2.0.3
|
* the Software without restriction, including without limitation the rights to
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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,
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* subject to the following conditions:
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
*
|
||||||
* the Software without restriction, including without limitation the rights to
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* copies or substantial portions of the Software.
|
||||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
*
|
||||||
* subject to the following conditions:
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
*
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
* copies or substantial portions of the Software.
|
* 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
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
*
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* https://www.FreeRTOS.org
|
||||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
* https://github.com/FreeRTOS
|
||||||
* 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.
|
*/
|
||||||
*
|
|
||||||
* https://aws.amazon.com/freertos
|
/**
|
||||||
* https://www.FreeRTOS.org
|
*!
|
||||||
*/
|
*! The protocols implemented in this file are intended to be demo quality only,
|
||||||
|
*! and not for production devices.
|
||||||
|
*!
|
||||||
/* Standard includes. */
|
*/
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
/* Standard includes. */
|
||||||
|
#include <stdio.h>
|
||||||
/* FreeRTOS includes. */
|
#include <stdlib.h>
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS_HTTP_commands.h"
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ] =
|
#include "FreeRTOS_HTTP_commands.h"
|
||||||
{
|
|
||||||
{ 3, "GET", ECMD_GET },
|
const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ] =
|
||||||
{ 4, "HEAD", ECMD_HEAD },
|
{
|
||||||
{ 4, "POST", ECMD_POST },
|
{ 3, "GET", ECMD_GET },
|
||||||
{ 3, "PUT", ECMD_PUT },
|
{ 4, "HEAD", ECMD_HEAD },
|
||||||
{ 6, "DELETE", ECMD_DELETE },
|
{ 4, "POST", ECMD_POST },
|
||||||
{ 5, "TRACE", ECMD_TRACE },
|
{ 3, "PUT", ECMD_PUT },
|
||||||
{ 7, "OPTIONS", ECMD_OPTIONS },
|
{ 6, "DELETE", ECMD_DELETE },
|
||||||
{ 7, "CONNECT", ECMD_CONNECT },
|
{ 5, "TRACE", ECMD_TRACE },
|
||||||
{ 5, "PATCH", ECMD_PATCH },
|
{ 7, "OPTIONS", ECMD_OPTIONS },
|
||||||
{ 4, "UNKN", ECMD_UNK },
|
{ 7, "CONNECT", ECMD_CONNECT },
|
||||||
};
|
{ 5, "PATCH", ECMD_PATCH },
|
||||||
|
{ 4, "UNKN", ECMD_UNK },
|
||||||
const char *webCodename (int aCode)
|
};
|
||||||
{
|
|
||||||
switch (aCode) {
|
const char * webCodename( int aCode )
|
||||||
case WEB_REPLY_OK: // = 200,
|
{
|
||||||
return "OK";
|
switch( aCode )
|
||||||
case WEB_NO_CONTENT: // 204
|
{
|
||||||
return "No content";
|
case WEB_REPLY_OK: /* = 200, */
|
||||||
case WEB_BAD_REQUEST: // = 400,
|
return "OK";
|
||||||
return "Bad request";
|
|
||||||
case WEB_UNAUTHORIZED: // = 401,
|
case WEB_NO_CONTENT: /* 204 */
|
||||||
return "Authorization Required";
|
return "No content";
|
||||||
case WEB_NOT_FOUND: // = 404,
|
|
||||||
return "Not Found";
|
case WEB_BAD_REQUEST: /* = 400, */
|
||||||
case WEB_GONE: // = 410,
|
return "Bad request";
|
||||||
return "Done";
|
|
||||||
case WEB_PRECONDITION_FAILED: // = 412,
|
case WEB_UNAUTHORIZED: /* = 401, */
|
||||||
return "Precondition Failed";
|
return "Authorization Required";
|
||||||
case WEB_INTERNAL_SERVER_ERROR: // = 500,
|
|
||||||
return "Internal Server Error";
|
case WEB_NOT_FOUND: /* = 404, */
|
||||||
}
|
return "Not Found";
|
||||||
return "Unknown";
|
|
||||||
}
|
case WEB_GONE: /* = 410, */
|
||||||
|
return "Done";
|
||||||
|
|
||||||
|
case WEB_PRECONDITION_FAILED: /* = 412, */
|
||||||
|
return "Precondition Failed";
|
||||||
|
|
||||||
|
case WEB_INTERNAL_SERVER_ERROR: /* = 500, */
|
||||||
|
return "Internal Server Error";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
|
@ -1,433 +1,464 @@
|
||||||
/*
|
/*
|
||||||
*!
|
* FreeRTOS V202212.00
|
||||||
*! The protocols implemented in this file are intended to be demo quality only,
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*! and not for production devices.
|
*
|
||||||
*!
|
* 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
|
||||||
* FreeRTOS+TCP V2.0.3
|
* the Software without restriction, including without limitation the rights to
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* 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,
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* subject to the following conditions:
|
||||||
* this software and associated documentation files (the "Software"), to deal in
|
*
|
||||||
* the Software without restriction, including without limitation the rights to
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* copies or substantial portions of the Software.
|
||||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
*
|
||||||
* subject to the following conditions:
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
*
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
* copies or substantial portions of the Software.
|
* 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
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
*
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* https://www.FreeRTOS.org
|
||||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
* https://github.com/FreeRTOS
|
||||||
* 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.
|
*/
|
||||||
*
|
|
||||||
* https://aws.amazon.com/freertos
|
/**
|
||||||
* https://www.FreeRTOS.org
|
*!
|
||||||
*/
|
*! The protocols implemented in this file are intended to be demo quality only,
|
||||||
|
*! and not for production devices.
|
||||||
/* Standard includes. */
|
*!
|
||||||
#include <stdio.h>
|
*/
|
||||||
#include <stdlib.h>
|
|
||||||
|
/* Standard includes. */
|
||||||
/* FreeRTOS includes. */
|
#include <stdio.h>
|
||||||
#include "FreeRTOS.h"
|
#include <stdlib.h>
|
||||||
#include "task.h"
|
|
||||||
|
/* FreeRTOS includes. */
|
||||||
/* FreeRTOS+TCP includes. */
|
#include "FreeRTOS.h"
|
||||||
#include "FreeRTOS_IP.h"
|
#include "task.h"
|
||||||
#include "FreeRTOS_Sockets.h"
|
|
||||||
|
/* FreeRTOS+TCP includes. */
|
||||||
/* FreeRTOS Protocol includes. */
|
#include "FreeRTOS_IP.h"
|
||||||
#include "FreeRTOS_HTTP_commands.h"
|
#include "FreeRTOS_Sockets.h"
|
||||||
#include "FreeRTOS_TCP_server.h"
|
|
||||||
#include "FreeRTOS_server_private.h"
|
/* FreeRTOS Protocol includes. */
|
||||||
|
#include "FreeRTOS_HTTP_commands.h"
|
||||||
/* Remove the whole file if HTTP is not supported. */
|
#include "FreeRTOS_TCP_server.h"
|
||||||
#if( ipconfigUSE_HTTP == 1 )
|
#include "FreeRTOS_server_private.h"
|
||||||
|
|
||||||
/* FreeRTOS+FAT includes. */
|
/* Remove the whole file if HTTP is not supported. */
|
||||||
#include "ff_stdio.h"
|
#if ( ipconfigUSE_HTTP == 1 )
|
||||||
|
|
||||||
#ifndef HTTP_SERVER_BACKLOG
|
/* FreeRTOS+FAT includes. */
|
||||||
#define HTTP_SERVER_BACKLOG ( 12 )
|
#include "ff_stdio.h"
|
||||||
#endif
|
|
||||||
|
#ifndef HTTP_SERVER_BACKLOG
|
||||||
#ifndef USE_HTML_CHUNKS
|
#define HTTP_SERVER_BACKLOG ( 12 )
|
||||||
#define USE_HTML_CHUNKS ( 0 )
|
#endif
|
||||||
#endif
|
|
||||||
|
#ifndef USE_HTML_CHUNKS
|
||||||
#if !defined( ARRAY_SIZE )
|
#define USE_HTML_CHUNKS ( 0 )
|
||||||
#define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] )
|
#endif
|
||||||
#endif
|
|
||||||
|
#if !defined( ARRAY_SIZE )
|
||||||
/* Some defines to make the code more readbale */
|
#define ARRAY_SIZE( x ) ( BaseType_t ) ( sizeof( x ) / sizeof( x )[ 0 ] )
|
||||||
#define pcCOMMAND_BUFFER pxClient->pxParent->pcCommandBuffer
|
#endif
|
||||||
#define pcNEW_DIR pxClient->pxParent->pcNewDir
|
|
||||||
#define pcFILE_BUFFER pxClient->pxParent->pcFileBuffer
|
/* Some defines to make the code more readbale */
|
||||||
|
#define pcCOMMAND_BUFFER pxClient->pxParent->pcCommandBuffer
|
||||||
#ifndef ipconfigHTTP_REQUEST_CHARACTER
|
#define pcNEW_DIR pxClient->pxParent->pcNewDir
|
||||||
#define ipconfigHTTP_REQUEST_CHARACTER '?'
|
#define pcFILE_BUFFER pxClient->pxParent->pcFileBuffer
|
||||||
#endif
|
|
||||||
|
#ifndef ipconfigHTTP_REQUEST_CHARACTER
|
||||||
/*_RB_ Need comment block, although fairly self evident. */
|
#define ipconfigHTTP_REQUEST_CHARACTER '?'
|
||||||
static void prvFileClose( HTTPClient_t *pxClient );
|
#endif
|
||||||
static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex );
|
|
||||||
static const char *pcGetContentsType( const char *apFname );
|
/*_RB_ Need comment block, although fairly self evident. */
|
||||||
static BaseType_t prvOpenURL( HTTPClient_t *pxClient );
|
static void prvFileClose( HTTPClient_t * pxClient );
|
||||||
static BaseType_t prvSendFile( HTTPClient_t *pxClient );
|
static BaseType_t prvProcessCmd( HTTPClient_t * pxClient,
|
||||||
static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode );
|
BaseType_t xIndex );
|
||||||
|
static const char * pcGetContentsType( const char * apFname );
|
||||||
static const char pcEmptyString[1] = { '\0' };
|
static BaseType_t prvOpenURL( HTTPClient_t * pxClient );
|
||||||
|
static BaseType_t prvSendFile( HTTPClient_t * pxClient );
|
||||||
typedef struct xTYPE_COUPLE
|
static BaseType_t prvSendReply( HTTPClient_t * pxClient,
|
||||||
{
|
BaseType_t xCode );
|
||||||
const char *pcExtension;
|
|
||||||
const char *pcType;
|
static const char pcEmptyString[ 1 ] = { '\0' };
|
||||||
} TypeCouple_t;
|
|
||||||
|
typedef struct xTYPE_COUPLE
|
||||||
static TypeCouple_t pxTypeCouples[ ] =
|
{
|
||||||
{
|
const char * pcExtension;
|
||||||
{ "html", "text/html" },
|
const char * pcType;
|
||||||
{ "css", "text/css" },
|
} TypeCouple_t;
|
||||||
{ "js", "text/javascript" },
|
|
||||||
{ "png", "image/png" },
|
static TypeCouple_t pxTypeCouples[] =
|
||||||
{ "jpg", "image/jpeg" },
|
{
|
||||||
{ "gif", "image/gif" },
|
{ "html", "text/html" },
|
||||||
{ "txt", "text/plain" },
|
{ "css", "text/css" },
|
||||||
{ "mp3", "audio/mpeg3" },
|
{ "js", "text/javascript" },
|
||||||
{ "wav", "audio/wav" },
|
{ "png", "image/png" },
|
||||||
{ "flac", "audio/ogg" },
|
{ "jpg", "image/jpeg" },
|
||||||
{ "pdf", "application/pdf" },
|
{ "gif", "image/gif" },
|
||||||
{ "ttf", "application/x-font-ttf" },
|
{ "txt", "text/plain" },
|
||||||
{ "ttc", "application/x-font-ttf" }
|
{ "mp3", "audio/mpeg3" },
|
||||||
};
|
{ "wav", "audio/wav" },
|
||||||
|
{ "flac", "audio/ogg" },
|
||||||
void vHTTPClientDelete( TCPClient_t *pxTCPClient )
|
{ "pdf", "application/pdf" },
|
||||||
{
|
{ "ttf", "application/x-font-ttf" },
|
||||||
HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient;
|
{ "ttc", "application/x-font-ttf" }
|
||||||
|
};
|
||||||
/* This HTTP client stops, close / release all resources. */
|
|
||||||
if( pxClient->xSocket != FREERTOS_NO_SOCKET )
|
void vHTTPClientDelete( TCPClient_t * pxTCPClient )
|
||||||
{
|
{
|
||||||
FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL );
|
HTTPClient_t * pxClient = ( HTTPClient_t * ) pxTCPClient;
|
||||||
FreeRTOS_closesocket( pxClient->xSocket );
|
|
||||||
pxClient->xSocket = FREERTOS_NO_SOCKET;
|
/* This HTTP client stops, close / release all resources. */
|
||||||
}
|
if( pxClient->xSocket != FREERTOS_NO_SOCKET )
|
||||||
prvFileClose( pxClient );
|
{
|
||||||
}
|
FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL );
|
||||||
/*-----------------------------------------------------------*/
|
FreeRTOS_closesocket( pxClient->xSocket );
|
||||||
|
pxClient->xSocket = FREERTOS_NO_SOCKET;
|
||||||
static void prvFileClose( HTTPClient_t *pxClient )
|
}
|
||||||
{
|
|
||||||
if( pxClient->pxFileHandle != NULL )
|
prvFileClose( pxClient );
|
||||||
{
|
}
|
||||||
FreeRTOS_printf( ( "Closing file: %s\n", pxClient->pcCurrentFilename ) );
|
/*-----------------------------------------------------------*/
|
||||||
ff_fclose( pxClient->pxFileHandle );
|
|
||||||
pxClient->pxFileHandle = NULL;
|
static void prvFileClose( HTTPClient_t * pxClient )
|
||||||
}
|
{
|
||||||
}
|
if( pxClient->pxFileHandle != NULL )
|
||||||
/*-----------------------------------------------------------*/
|
{
|
||||||
|
FreeRTOS_printf( ( "Closing file: %s\n", pxClient->pcCurrentFilename ) );
|
||||||
static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode )
|
ff_fclose( pxClient->pxFileHandle );
|
||||||
{
|
pxClient->pxFileHandle = NULL;
|
||||||
struct xTCP_SERVER *pxParent = pxClient->pxParent;
|
}
|
||||||
BaseType_t xRc;
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
/* A normal command reply on the main socket (port 21). */
|
|
||||||
char *pcBuffer = pxParent->pcFileBuffer;
|
static BaseType_t prvSendReply( HTTPClient_t * pxClient,
|
||||||
|
BaseType_t xCode )
|
||||||
xRc = snprintf( pcBuffer, sizeof( pxParent->pcFileBuffer ),
|
{
|
||||||
"HTTP/1.1 %d %s\r\n"
|
struct xTCP_SERVER * pxParent = pxClient->pxParent;
|
||||||
#if USE_HTML_CHUNKS
|
BaseType_t xRc;
|
||||||
"Transfer-Encoding: chunked\r\n"
|
|
||||||
#endif
|
/* A normal command reply on the main socket (port 21). */
|
||||||
"Content-Type: %s\r\n"
|
char * pcBuffer = pxParent->pcFileBuffer;
|
||||||
"Connection: keep-alive\r\n"
|
|
||||||
"%s\r\n",
|
xRc = snprintf( pcBuffer, sizeof( pxParent->pcFileBuffer ),
|
||||||
( int ) xCode,
|
"HTTP/1.1 %d %s\r\n"
|
||||||
webCodename (xCode),
|
#if USE_HTML_CHUNKS
|
||||||
pxParent->pcContentsType[0] ? pxParent->pcContentsType : "text/html",
|
"Transfer-Encoding: chunked\r\n"
|
||||||
pxParent->pcExtraContents );
|
#endif
|
||||||
|
"Content-Type: %s\r\n"
|
||||||
pxParent->pcContentsType[0] = '\0';
|
"Connection: keep-alive\r\n"
|
||||||
pxParent->pcExtraContents[0] = '\0';
|
"%s\r\n",
|
||||||
|
( int ) xCode,
|
||||||
xRc = FreeRTOS_send( pxClient->xSocket, ( const void * ) pcBuffer, xRc, 0 );
|
webCodename( xCode ),
|
||||||
pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
|
pxParent->pcContentsType[ 0 ] ? pxParent->pcContentsType : "text/html",
|
||||||
|
pxParent->pcExtraContents );
|
||||||
return xRc;
|
|
||||||
}
|
pxParent->pcContentsType[ 0 ] = '\0';
|
||||||
/*-----------------------------------------------------------*/
|
pxParent->pcExtraContents[ 0 ] = '\0';
|
||||||
|
|
||||||
static BaseType_t prvSendFile( HTTPClient_t *pxClient )
|
xRc = FreeRTOS_send( pxClient->xSocket, ( const void * ) pcBuffer, xRc, 0 );
|
||||||
{
|
pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
|
||||||
size_t uxSpace;
|
|
||||||
size_t uxCount;
|
return xRc;
|
||||||
BaseType_t xRc = 0;
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
if( pxClient->bits.bReplySent == pdFALSE_UNSIGNED )
|
|
||||||
{
|
static BaseType_t prvSendFile( HTTPClient_t * pxClient )
|
||||||
pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
|
{
|
||||||
|
size_t uxSpace;
|
||||||
strcpy( pxClient->pxParent->pcContentsType, pcGetContentsType( pxClient->pcCurrentFilename ) );
|
size_t uxCount;
|
||||||
snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
|
BaseType_t xRc = 0;
|
||||||
"Content-Length: %d\r\n", ( int ) pxClient->uxBytesLeft );
|
|
||||||
|
if( pxClient->bits.bReplySent == pdFALSE_UNSIGNED )
|
||||||
/* "Requested file action OK". */
|
{
|
||||||
xRc = prvSendReply( pxClient, WEB_REPLY_OK );
|
pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
|
||||||
}
|
|
||||||
|
strcpy( pxClient->pxParent->pcContentsType, pcGetContentsType( pxClient->pcCurrentFilename ) );
|
||||||
if( xRc >= 0 ) do
|
snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
|
||||||
{
|
"Content-Length: %d\r\n", ( int ) pxClient->uxBytesLeft );
|
||||||
uxSpace = FreeRTOS_tx_space( pxClient->xSocket );
|
|
||||||
|
/* "Requested file action OK". */
|
||||||
if( pxClient->uxBytesLeft < uxSpace )
|
xRc = prvSendReply( pxClient, WEB_REPLY_OK );
|
||||||
{
|
}
|
||||||
uxCount = pxClient->uxBytesLeft;
|
|
||||||
}
|
if( xRc >= 0 )
|
||||||
else
|
{
|
||||||
{
|
do
|
||||||
uxCount = uxSpace;
|
{
|
||||||
}
|
uxSpace = FreeRTOS_tx_space( pxClient->xSocket );
|
||||||
|
|
||||||
if( uxCount > 0u )
|
if( pxClient->uxBytesLeft < uxSpace )
|
||||||
{
|
{
|
||||||
if( uxCount > sizeof( pxClient->pxParent->pcFileBuffer ) )
|
uxCount = pxClient->uxBytesLeft;
|
||||||
{
|
}
|
||||||
uxCount = sizeof( pxClient->pxParent->pcFileBuffer );
|
else
|
||||||
}
|
{
|
||||||
ff_fread( pxClient->pxParent->pcFileBuffer, 1, uxCount, pxClient->pxFileHandle );
|
uxCount = uxSpace;
|
||||||
pxClient->uxBytesLeft -= uxCount;
|
}
|
||||||
|
|
||||||
xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pxParent->pcFileBuffer, uxCount, 0 );
|
if( uxCount > 0u )
|
||||||
if( xRc < 0 )
|
{
|
||||||
{
|
if( uxCount > sizeof( pxClient->pxParent->pcFileBuffer ) )
|
||||||
break;
|
{
|
||||||
}
|
uxCount = sizeof( pxClient->pxParent->pcFileBuffer );
|
||||||
}
|
}
|
||||||
} while( uxCount > 0u );
|
|
||||||
|
ff_fread( pxClient->pxParent->pcFileBuffer, 1, uxCount, pxClient->pxFileHandle );
|
||||||
if( pxClient->uxBytesLeft == 0u )
|
pxClient->uxBytesLeft -= uxCount;
|
||||||
{
|
|
||||||
/* Writing is ready, no need for further 'eSELECT_WRITE' events. */
|
xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pxParent->pcFileBuffer, uxCount, 0 );
|
||||||
FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
|
|
||||||
prvFileClose( pxClient );
|
if( xRc < 0 )
|
||||||
}
|
{
|
||||||
else
|
break;
|
||||||
{
|
}
|
||||||
/* Wake up the TCP task as soon as this socket may be written to. */
|
}
|
||||||
FreeRTOS_FD_SET( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
|
} while( uxCount > 0u );
|
||||||
}
|
}
|
||||||
|
|
||||||
return xRc;
|
if( pxClient->uxBytesLeft == 0u )
|
||||||
}
|
{
|
||||||
/*-----------------------------------------------------------*/
|
/* Writing is ready, no need for further 'eSELECT_WRITE' events. */
|
||||||
|
FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
|
||||||
static BaseType_t prvOpenURL( HTTPClient_t *pxClient )
|
prvFileClose( pxClient );
|
||||||
{
|
}
|
||||||
BaseType_t xRc;
|
else
|
||||||
char pcSlash[ 2 ];
|
{
|
||||||
|
/* Wake up the TCP task as soon as this socket may be written to. */
|
||||||
pxClient->bits.ulFlags = 0;
|
FreeRTOS_FD_SET( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
|
||||||
|
}
|
||||||
#if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
|
|
||||||
{
|
return xRc;
|
||||||
if( strchr( pxClient->pcUrlData, ipconfigHTTP_REQUEST_CHARACTER ) != NULL )
|
}
|
||||||
{
|
/*-----------------------------------------------------------*/
|
||||||
size_t xResult;
|
|
||||||
|
static BaseType_t prvOpenURL( HTTPClient_t * pxClient )
|
||||||
xResult = uxApplicationHTTPHandleRequestHook( pxClient->pcUrlData, pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ) );
|
{
|
||||||
if( xResult > 0 )
|
BaseType_t xRc;
|
||||||
{
|
char pcSlash[ 2 ];
|
||||||
strcpy( pxClient->pxParent->pcContentsType, "text/html" );
|
|
||||||
snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
|
pxClient->bits.ulFlags = 0;
|
||||||
"Content-Length: %d\r\n", ( int ) xResult );
|
|
||||||
xRc = prvSendReply( pxClient, WEB_REPLY_OK ); /* "Requested file action OK" */
|
#if ( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
|
||||||
if( xRc > 0 )
|
{
|
||||||
{
|
if( strchr( pxClient->pcUrlData, ipconfigHTTP_REQUEST_CHARACTER ) != NULL )
|
||||||
xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pcCurrentFilename, xResult, 0 );
|
{
|
||||||
}
|
size_t xResult;
|
||||||
/* Although against the coding standard of FreeRTOS, a return is
|
|
||||||
done here to simplify this conditional code. */
|
xResult = uxApplicationHTTPHandleRequestHook( pxClient->pcUrlData, pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ) );
|
||||||
return xRc;
|
|
||||||
}
|
if( xResult > 0 )
|
||||||
}
|
{
|
||||||
}
|
strcpy( pxClient->pxParent->pcContentsType, "text/html" );
|
||||||
#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
|
snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
|
||||||
|
"Content-Length: %d\r\n", ( int ) xResult );
|
||||||
if( pxClient->pcUrlData[ 0 ] != '/' )
|
xRc = prvSendReply( pxClient, WEB_REPLY_OK ); /* "Requested file action OK" */
|
||||||
{
|
|
||||||
/* Insert a slash before the file name. */
|
if( xRc > 0 )
|
||||||
pcSlash[ 0 ] = '/';
|
{
|
||||||
pcSlash[ 1 ] = '\0';
|
xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pcCurrentFilename, xResult, 0 );
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
/* Although against the coding standard of FreeRTOS, a return is
|
||||||
/* The browser provided a starting '/' already. */
|
* done here to simplify this conditional code. */
|
||||||
pcSlash[ 0 ] = '\0';
|
return xRc;
|
||||||
}
|
}
|
||||||
snprintf( pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ), "%s%s%s",
|
}
|
||||||
pxClient->pcRootDir,
|
}
|
||||||
pcSlash,
|
#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
|
||||||
pxClient->pcUrlData);
|
|
||||||
|
if( pxClient->pcUrlData[ 0 ] != '/' )
|
||||||
pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" );
|
{
|
||||||
|
/* Insert a slash before the file name. */
|
||||||
FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename,
|
pcSlash[ 0 ] = '/';
|
||||||
pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) );
|
pcSlash[ 1 ] = '\0';
|
||||||
|
}
|
||||||
if( pxClient->pxFileHandle == NULL )
|
else
|
||||||
{
|
{
|
||||||
/* "404 File not found". */
|
/* The browser provided a starting '/' already. */
|
||||||
xRc = prvSendReply( pxClient, WEB_NOT_FOUND );
|
pcSlash[ 0 ] = '\0';
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
snprintf( pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ), "%s%s%s",
|
||||||
pxClient->uxBytesLeft = ( size_t ) pxClient->pxFileHandle->ulFileSize;
|
pxClient->pcRootDir,
|
||||||
xRc = prvSendFile( pxClient );
|
pcSlash,
|
||||||
}
|
pxClient->pcUrlData );
|
||||||
|
|
||||||
return xRc;
|
pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" );
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename,
|
||||||
|
pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) );
|
||||||
static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex )
|
|
||||||
{
|
if( pxClient->pxFileHandle == NULL )
|
||||||
BaseType_t xResult = 0;
|
{
|
||||||
|
/* "404 File not found". */
|
||||||
/* A new command has been received. Process it. */
|
xRc = prvSendReply( pxClient, WEB_NOT_FOUND );
|
||||||
switch( xIndex )
|
}
|
||||||
{
|
else
|
||||||
case ECMD_GET:
|
{
|
||||||
xResult = prvOpenURL( pxClient );
|
pxClient->uxBytesLeft = ( size_t ) pxClient->pxFileHandle->ulFileSize;
|
||||||
break;
|
xRc = prvSendFile( pxClient );
|
||||||
|
}
|
||||||
case ECMD_HEAD:
|
|
||||||
case ECMD_POST:
|
return xRc;
|
||||||
case ECMD_PUT:
|
}
|
||||||
case ECMD_DELETE:
|
/*-----------------------------------------------------------*/
|
||||||
case ECMD_TRACE:
|
|
||||||
case ECMD_OPTIONS:
|
static BaseType_t prvProcessCmd( HTTPClient_t * pxClient,
|
||||||
case ECMD_CONNECT:
|
BaseType_t xIndex )
|
||||||
case ECMD_PATCH:
|
{
|
||||||
case ECMD_UNK:
|
BaseType_t xResult = 0;
|
||||||
{
|
|
||||||
FreeRTOS_printf( ( "prvProcessCmd: Not implemented: %s\n",
|
/* A new command has been received. Process it. */
|
||||||
xWebCommands[xIndex].pcCommandName ) );
|
switch( xIndex )
|
||||||
}
|
{
|
||||||
break;
|
case ECMD_GET:
|
||||||
}
|
xResult = prvOpenURL( pxClient );
|
||||||
|
break;
|
||||||
return xResult;
|
|
||||||
}
|
case ECMD_HEAD:
|
||||||
/*-----------------------------------------------------------*/
|
case ECMD_POST:
|
||||||
|
case ECMD_PUT:
|
||||||
BaseType_t xHTTPClientWork( TCPClient_t *pxTCPClient )
|
case ECMD_DELETE:
|
||||||
{
|
case ECMD_TRACE:
|
||||||
BaseType_t xRc;
|
case ECMD_OPTIONS:
|
||||||
HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient;
|
case ECMD_CONNECT:
|
||||||
|
case ECMD_PATCH:
|
||||||
if( pxClient->pxFileHandle != NULL )
|
case ECMD_UNK:
|
||||||
{
|
FreeRTOS_printf( ( "prvProcessCmd: Not implemented: %s\n",
|
||||||
prvSendFile( pxClient );
|
xWebCommands[ xIndex ].pcCommandName ) );
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
xRc = FreeRTOS_recv( pxClient->xSocket, ( void * )pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), 0 );
|
|
||||||
|
return xResult;
|
||||||
if( xRc > 0 )
|
}
|
||||||
{
|
/*-----------------------------------------------------------*/
|
||||||
BaseType_t xIndex;
|
|
||||||
const char *pcEndOfCmd;
|
BaseType_t xHTTPClientWork( TCPClient_t * pxTCPClient )
|
||||||
const struct xWEB_COMMAND *curCmd;
|
{
|
||||||
char *pcBuffer = pcCOMMAND_BUFFER;
|
BaseType_t xRc;
|
||||||
|
HTTPClient_t * pxClient = ( HTTPClient_t * ) pxTCPClient;
|
||||||
if( xRc < ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) )
|
|
||||||
{
|
if( pxClient->pxFileHandle != NULL )
|
||||||
pcBuffer[ xRc ] = '\0';
|
{
|
||||||
}
|
prvSendFile( pxClient );
|
||||||
while( xRc && ( pcBuffer[ xRc - 1 ] == 13 || pcBuffer[ xRc - 1 ] == 10 ) )
|
}
|
||||||
{
|
|
||||||
pcBuffer[ --xRc ] = '\0';
|
xRc = FreeRTOS_recv( pxClient->xSocket, ( void * ) pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), 0 );
|
||||||
}
|
|
||||||
pcEndOfCmd = pcBuffer + xRc;
|
if( xRc > 0 )
|
||||||
|
{
|
||||||
curCmd = xWebCommands;
|
BaseType_t xIndex;
|
||||||
|
const char * pcEndOfCmd;
|
||||||
/* Pointing to "/index.html HTTP/1.1". */
|
const struct xWEB_COMMAND * curCmd;
|
||||||
pxClient->pcUrlData = pcBuffer;
|
char * pcBuffer = pcCOMMAND_BUFFER;
|
||||||
|
|
||||||
/* Pointing to "HTTP/1.1". */
|
if( xRc < ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) )
|
||||||
pxClient->pcRestData = pcEmptyString;
|
{
|
||||||
|
pcBuffer[ xRc ] = '\0';
|
||||||
/* Last entry is "ECMD_UNK". */
|
}
|
||||||
for( xIndex = 0; xIndex < WEB_CMD_COUNT - 1; xIndex++, curCmd++ )
|
|
||||||
{
|
while( xRc && ( pcBuffer[ xRc - 1 ] == 13 || pcBuffer[ xRc - 1 ] == 10 ) )
|
||||||
BaseType_t xLength;
|
{
|
||||||
|
pcBuffer[ --xRc ] = '\0';
|
||||||
xLength = curCmd->xCommandLength;
|
}
|
||||||
if( ( xRc >= xLength ) && ( memcmp( curCmd->pcCommandName, pcBuffer, xLength ) == 0 ) )
|
|
||||||
{
|
pcEndOfCmd = pcBuffer + xRc;
|
||||||
char *pcLastPtr;
|
|
||||||
|
curCmd = xWebCommands;
|
||||||
pxClient->pcUrlData += xLength + 1;
|
|
||||||
for( pcLastPtr = (char *)pxClient->pcUrlData; pcLastPtr < pcEndOfCmd; pcLastPtr++ )
|
/* Pointing to "/index.html HTTP/1.1". */
|
||||||
{
|
pxClient->pcUrlData = pcBuffer;
|
||||||
char ch = *pcLastPtr;
|
|
||||||
if( ( ch == '\0' ) || ( strchr( "\n\r \t", ch ) != NULL ) )
|
/* Pointing to "HTTP/1.1". */
|
||||||
{
|
pxClient->pcRestData = pcEmptyString;
|
||||||
*pcLastPtr = '\0';
|
|
||||||
pxClient->pcRestData = pcLastPtr + 1;
|
/* Last entry is "ECMD_UNK". */
|
||||||
break;
|
for( xIndex = 0; xIndex < WEB_CMD_COUNT - 1; xIndex++, curCmd++ )
|
||||||
}
|
{
|
||||||
}
|
BaseType_t xLength;
|
||||||
break;
|
|
||||||
}
|
xLength = curCmd->xCommandLength;
|
||||||
}
|
|
||||||
|
if( ( xRc >= xLength ) && ( memcmp( curCmd->pcCommandName, pcBuffer, xLength ) == 0 ) )
|
||||||
if( xIndex < ( WEB_CMD_COUNT - 1 ) )
|
{
|
||||||
{
|
char * pcLastPtr;
|
||||||
xRc = prvProcessCmd( pxClient, xIndex );
|
|
||||||
}
|
pxClient->pcUrlData += xLength + 1;
|
||||||
}
|
|
||||||
else if( xRc < 0 )
|
for( pcLastPtr = ( char * ) pxClient->pcUrlData; pcLastPtr < pcEndOfCmd; pcLastPtr++ )
|
||||||
{
|
{
|
||||||
/* The connection will be closed and the client will be deleted. */
|
char ch = *pcLastPtr;
|
||||||
FreeRTOS_printf( ( "xHTTPClientWork: rc = %ld\n", xRc ) );
|
|
||||||
}
|
if( ( ch == '\0' ) || ( strchr( "\n\r \t", ch ) != NULL ) )
|
||||||
return xRc;
|
{
|
||||||
}
|
*pcLastPtr = '\0';
|
||||||
/*-----------------------------------------------------------*/
|
pxClient->pcRestData = pcLastPtr + 1;
|
||||||
|
break;
|
||||||
static const char *pcGetContentsType (const char *apFname)
|
}
|
||||||
{
|
}
|
||||||
const char *slash = NULL;
|
|
||||||
const char *dot = NULL;
|
break;
|
||||||
const char *ptr;
|
}
|
||||||
const char *pcResult = "text/html";
|
}
|
||||||
BaseType_t x;
|
|
||||||
|
if( xIndex < ( WEB_CMD_COUNT - 1 ) )
|
||||||
for( ptr = apFname; *ptr; ptr++ )
|
{
|
||||||
{
|
xRc = prvProcessCmd( pxClient, xIndex );
|
||||||
if (*ptr == '.') dot = ptr;
|
}
|
||||||
if (*ptr == '/') slash = ptr;
|
}
|
||||||
}
|
else if( xRc < 0 )
|
||||||
if( dot > slash )
|
{
|
||||||
{
|
/* The connection will be closed and the client will be deleted. */
|
||||||
dot++;
|
FreeRTOS_printf( ( "xHTTPClientWork: rc = %ld\n", xRc ) );
|
||||||
for( x = 0; x < ARRAY_SIZE( pxTypeCouples ); x++ )
|
}
|
||||||
{
|
|
||||||
if( strcasecmp( dot, pxTypeCouples[ x ].pcExtension ) == 0 )
|
return xRc;
|
||||||
{
|
}
|
||||||
pcResult = pxTypeCouples[ x ].pcType;
|
/*-----------------------------------------------------------*/
|
||||||
break;
|
|
||||||
}
|
static const char * pcGetContentsType( const char * apFname )
|
||||||
}
|
{
|
||||||
}
|
const char * slash = NULL;
|
||||||
return pcResult;
|
const char * dot = NULL;
|
||||||
}
|
const char * ptr;
|
||||||
|
const char * pcResult = "text/html";
|
||||||
#endif /* ipconfigUSE_HTTP */
|
BaseType_t x;
|
||||||
|
|
||||||
|
for( ptr = apFname; *ptr; ptr++ )
|
||||||
|
{
|
||||||
|
if( *ptr == '.' )
|
||||||
|
{
|
||||||
|
dot = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( *ptr == '/' )
|
||||||
|
{
|
||||||
|
slash = ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( dot > slash )
|
||||||
|
{
|
||||||
|
dot++;
|
||||||
|
|
||||||
|
for( x = 0; x < ARRAY_SIZE( pxTypeCouples ); x++ )
|
||||||
|
{
|
||||||
|
if( strcasecmp( dot, pxTypeCouples[ x ].pcExtension ) == 0 )
|
||||||
|
{
|
||||||
|
pcResult = pxTypeCouples[ x ].pcType;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pcResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ipconfigUSE_HTTP */
|
||||||
|
|
|
@ -1,469 +1,498 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://github.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*!
|
*!
|
||||||
*! The protocols implemented in this file are intended to be demo quality only,
|
*! The protocols implemented in this file are intended to be demo quality only,
|
||||||
*! and not for production devices.
|
*! and not for production devices.
|
||||||
*!
|
*!
|
||||||
*
|
*
|
||||||
* NTPDemo.c
|
* NTPDemo.c
|
||||||
*
|
*
|
||||||
* An example of how to lookup a domain using DNS
|
* An example of how to lookup a domain using DNS
|
||||||
* And also how to send and receive UDP messages to get the NTP time
|
* And also how to send and receive UDP messages to get the NTP time
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "semphr.h"
|
#include "semphr.h"
|
||||||
|
|
||||||
/* FreeRTOS+TCP includes. */
|
/* FreeRTOS+TCP includes. */
|
||||||
#include "FreeRTOS_IP.h"
|
#include "FreeRTOS_IP.h"
|
||||||
#include "FreeRTOS_Sockets.h"
|
#include "FreeRTOS_Sockets.h"
|
||||||
#include "FreeRTOS_DNS.h"
|
#include "FreeRTOS_DNS.h"
|
||||||
#include "FreeRTOS_Stream_Buffer.h"
|
#include "FreeRTOS_Stream_Buffer.h"
|
||||||
|
|
||||||
/* Use the date & time functions from +FAT. */
|
/* Use the date & time functions from +FAT. */
|
||||||
#include "ff_time.h"
|
#include "ff_time.h"
|
||||||
|
|
||||||
#include "NTPDemo.h"
|
#include "NTPDemo.h"
|
||||||
#include "ntpClient.h"
|
#include "ntpClient.h"
|
||||||
|
|
||||||
#include "date_and_time.h"
|
#include "date_and_time.h"
|
||||||
|
|
||||||
enum EStatus {
|
enum EStatus
|
||||||
EStatusLookup,
|
{
|
||||||
EStatusAsking,
|
EStatusLookup,
|
||||||
EStatusPause,
|
EStatusAsking,
|
||||||
EStatusFailed,
|
EStatusPause,
|
||||||
};
|
EStatusFailed,
|
||||||
|
};
|
||||||
static struct SNtpPacket xNTPPacket;
|
|
||||||
|
static struct SNtpPacket xNTPPacket;
|
||||||
#if( ipconfigUSE_CALLBACKS == 0 )
|
|
||||||
static char cRecvBuffer[ sizeof( struct SNtpPacket ) + 64 ];
|
#if ( ipconfigUSE_CALLBACKS == 0 )
|
||||||
#endif
|
static char cRecvBuffer[ sizeof( struct SNtpPacket ) + 64 ];
|
||||||
|
#endif
|
||||||
static enum EStatus xStatus = EStatusLookup;
|
|
||||||
|
static enum EStatus xStatus = EStatusLookup;
|
||||||
static const char *pcTimeServers[] = {
|
|
||||||
"0.asia.pool.ntp.org",
|
static const char * pcTimeServers[] =
|
||||||
"0.europe.pool.ntp.org",
|
{
|
||||||
"0.id.pool.ntp.org",
|
"0.asia.pool.ntp.org",
|
||||||
"0.south-america.pool.ntp.org",
|
"0.europe.pool.ntp.org",
|
||||||
"0.oceania.pool.ntp.org",
|
"0.id.pool.ntp.org",
|
||||||
"0.north-america.pool.ntp.org"
|
"0.south-america.pool.ntp.org",
|
||||||
};
|
"0.oceania.pool.ntp.org",
|
||||||
|
"0.north-america.pool.ntp.org"
|
||||||
static SemaphoreHandle_t xNTPWakeupSem = NULL;
|
};
|
||||||
static uint32_t ulIPAddressFound;
|
|
||||||
static Socket_t xUDPSocket = NULL;
|
static SemaphoreHandle_t xNTPWakeupSem = NULL;
|
||||||
static TaskHandle_t xNTPTaskhandle = NULL;
|
static uint32_t ulIPAddressFound;
|
||||||
static TickType_t uxSendTime;
|
static Socket_t xUDPSocket = NULL;
|
||||||
|
static TaskHandle_t xNTPTaskhandle = NULL;
|
||||||
static void prvNTPTask( void *pvParameters );
|
static TickType_t uxSendTime;
|
||||||
|
|
||||||
static void vSignalTask( void )
|
static void prvNTPTask( void * pvParameters );
|
||||||
{
|
|
||||||
#if( ipconfigUSE_CALLBACKS == 0 )
|
static void vSignalTask( void )
|
||||||
if( xUDPSocket != NULL )
|
{
|
||||||
{
|
#if ( ipconfigUSE_CALLBACKS == 0 )
|
||||||
/* Send a signal to the socket so that the
|
if( xUDPSocket != NULL )
|
||||||
FreeRTOS_recvfrom will get interrupted. */
|
{
|
||||||
FreeRTOS_SignalSocket( xUDPSocket );
|
/* Send a signal to the socket so that the
|
||||||
}
|
* FreeRTOS_recvfrom will get interrupted. */
|
||||||
else
|
FreeRTOS_SignalSocket( xUDPSocket );
|
||||||
#endif
|
}
|
||||||
if( xNTPWakeupSem != NULL )
|
else
|
||||||
{
|
#endif
|
||||||
xSemaphoreGive( xNTPWakeupSem );
|
|
||||||
}
|
if( xNTPWakeupSem != NULL )
|
||||||
}
|
{
|
||||||
|
xSemaphoreGive( xNTPWakeupSem );
|
||||||
void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority )
|
}
|
||||||
{
|
}
|
||||||
/* The only public function in this module: start a task to contact
|
|
||||||
some NTP server. */
|
void vStartNTPTask( uint16_t usTaskStackSize,
|
||||||
|
UBaseType_t uxTaskPriority )
|
||||||
if( xNTPTaskhandle != NULL )
|
{
|
||||||
{
|
/* The only public function in this module: start a task to contact
|
||||||
switch( xStatus )
|
* some NTP server. */
|
||||||
{
|
|
||||||
case EStatusPause:
|
if( xNTPTaskhandle != NULL )
|
||||||
xStatus = EStatusAsking;
|
{
|
||||||
vSignalTask();
|
switch( xStatus )
|
||||||
break;
|
{
|
||||||
case EStatusLookup:
|
case EStatusPause:
|
||||||
FreeRTOS_printf( ( "NTP looking up server\n" ) );
|
xStatus = EStatusAsking;
|
||||||
break;
|
vSignalTask();
|
||||||
case EStatusAsking:
|
break;
|
||||||
FreeRTOS_printf( ( "NTP still asking\n" ) );
|
|
||||||
break;
|
case EStatusLookup:
|
||||||
case EStatusFailed:
|
FreeRTOS_printf( ( "NTP looking up server\n" ) );
|
||||||
FreeRTOS_printf( ( "NTP failed somehow\n" ) );
|
break;
|
||||||
ulIPAddressFound = 0ul;
|
|
||||||
xStatus = EStatusLookup;
|
case EStatusAsking:
|
||||||
vSignalTask();
|
FreeRTOS_printf( ( "NTP still asking\n" ) );
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
case EStatusFailed:
|
||||||
else
|
FreeRTOS_printf( ( "NTP failed somehow\n" ) );
|
||||||
{
|
ulIPAddressFound = 0ul;
|
||||||
xUDPSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
|
xStatus = EStatusLookup;
|
||||||
if( xUDPSocket != FREERTOS_INVALID_SOCKET )
|
vSignalTask();
|
||||||
{
|
break;
|
||||||
struct freertos_sockaddr xAddress;
|
}
|
||||||
#if( ipconfigUSE_CALLBACKS != 0 )
|
}
|
||||||
BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 0 );
|
else
|
||||||
#else
|
{
|
||||||
BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 );
|
xUDPSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
|
||||||
#endif
|
|
||||||
|
if( xUDPSocket != FREERTOS_INVALID_SOCKET )
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
{
|
||||||
{
|
struct freertos_sockaddr xAddress;
|
||||||
xAddress.sin_address.ulIP_IPv4 = 0ul;
|
#if ( ipconfigUSE_CALLBACKS != 0 )
|
||||||
}
|
BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 0 );
|
||||||
#else
|
#else
|
||||||
{
|
BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 );
|
||||||
xAddress.sin_addr = 0ul;
|
#endif
|
||||||
}
|
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
|
{
|
||||||
xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
|
xAddress.sin_address.ulIP_IPv4 = 0ul;
|
||||||
xAddress.sin_family = FREERTOS_AF_INET;
|
}
|
||||||
|
#else
|
||||||
FreeRTOS_bind( xUDPSocket, &xAddress, sizeof( xAddress ) );
|
{
|
||||||
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
|
xAddress.sin_addr = 0ul;
|
||||||
xTaskCreate( prvNTPTask, /* The function that implements the task. */
|
}
|
||||||
( const char * ) "NTP client", /* Just a text name for the task to aid debugging. */
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
usTaskStackSize, /* The stack size is defined in FreeRTOSIPConfig.h. */
|
|
||||||
NULL, /* The task parameter, not used in this case. */
|
xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
|
||||||
uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */
|
xAddress.sin_family = FREERTOS_AF_INET;
|
||||||
&xNTPTaskhandle ); /* The task handle. */
|
|
||||||
}
|
FreeRTOS_bind( xUDPSocket, &xAddress, sizeof( xAddress ) );
|
||||||
else
|
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
|
||||||
{
|
xTaskCreate( prvNTPTask, /* The function that implements the task. */
|
||||||
FreeRTOS_printf( ( "Creating socket failed\n" ) );
|
( const char * ) "NTP client", /* Just a text name for the task to aid debugging. */
|
||||||
}
|
usTaskStackSize, /* The stack size is defined in FreeRTOSIPConfig.h. */
|
||||||
}
|
NULL, /* The task parameter, not used in this case. */
|
||||||
}
|
uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */
|
||||||
/*-----------------------------------------------------------*/
|
&xNTPTaskhandle ); /* The task handle. */
|
||||||
|
}
|
||||||
static void vDNS_callback( const char *pcName, void *pvSearchID, uint32_t ulIPAddress )
|
else
|
||||||
{
|
{
|
||||||
char pcBuf[16];
|
FreeRTOS_printf( ( "Creating socket failed\n" ) );
|
||||||
|
}
|
||||||
/* The DNS lookup has a result, or it has reached the time-out. */
|
}
|
||||||
FreeRTOS_inet_ntoa( ulIPAddress, pcBuf );
|
}
|
||||||
FreeRTOS_printf( ( "IP address of %s found: %s\n", pcName, pcBuf ) );
|
/*-----------------------------------------------------------*/
|
||||||
if( ulIPAddressFound == 0ul )
|
|
||||||
{
|
static void vDNS_callback( const char * pcName,
|
||||||
ulIPAddressFound = ulIPAddress;
|
void * pvSearchID,
|
||||||
}
|
uint32_t ulIPAddress )
|
||||||
/* For testing: in case DNS doen't respond, still try some NTP server
|
{
|
||||||
with a known IP-address. */
|
char pcBuf[ 16 ];
|
||||||
if( ulIPAddressFound == 0ul )
|
|
||||||
{
|
/* The DNS lookup has a result, or it has reached the time-out. */
|
||||||
ulIPAddressFound = FreeRTOS_inet_addr_quick( 184, 105, 182, 7 );
|
FreeRTOS_inet_ntoa( ulIPAddress, pcBuf );
|
||||||
/* ulIPAddressFound = FreeRTOS_inet_addr_quick( 103, 242, 70, 4 ); */
|
FreeRTOS_printf( ( "IP address of %s found: %s\n", pcName, pcBuf ) );
|
||||||
}
|
|
||||||
xStatus = EStatusAsking;
|
if( ulIPAddressFound == 0ul )
|
||||||
|
{
|
||||||
vSignalTask();
|
ulIPAddressFound = ulIPAddress;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
/* For testing: in case DNS doesn't respond, still try some NTP server
|
||||||
static void prvSwapFields( struct SNtpPacket *pxPacket)
|
* with a known IP-address. */
|
||||||
{
|
if( ulIPAddressFound == 0ul )
|
||||||
/* NTP messages are big-endian */
|
{
|
||||||
pxPacket->rootDelay = FreeRTOS_htonl( pxPacket->rootDelay );
|
ulIPAddressFound = FreeRTOS_inet_addr_quick( 184, 105, 182, 7 );
|
||||||
pxPacket->rootDispersion = FreeRTOS_htonl( pxPacket->rootDispersion );
|
/* ulIPAddressFound = FreeRTOS_inet_addr_quick( 103, 242, 70, 4 ); */
|
||||||
|
}
|
||||||
pxPacket->referenceTimestamp.seconds = FreeRTOS_htonl( pxPacket->referenceTimestamp.seconds );
|
|
||||||
pxPacket->referenceTimestamp.fraction = FreeRTOS_htonl( pxPacket->referenceTimestamp.fraction );
|
xStatus = EStatusAsking;
|
||||||
|
|
||||||
pxPacket->originateTimestamp.seconds = FreeRTOS_htonl( pxPacket->originateTimestamp.seconds );
|
vSignalTask();
|
||||||
pxPacket->originateTimestamp.fraction = FreeRTOS_htonl( pxPacket->originateTimestamp.fraction );
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
pxPacket->receiveTimestamp.seconds = FreeRTOS_htonl( pxPacket->receiveTimestamp.seconds );
|
|
||||||
pxPacket->receiveTimestamp.fraction = FreeRTOS_htonl( pxPacket->receiveTimestamp.fraction );
|
static void prvSwapFields( struct SNtpPacket * pxPacket )
|
||||||
|
{
|
||||||
pxPacket->transmitTimestamp.seconds = FreeRTOS_htonl( pxPacket->transmitTimestamp.seconds );
|
/* NTP messages are big-endian */
|
||||||
pxPacket->transmitTimestamp.fraction = FreeRTOS_htonl( pxPacket->transmitTimestamp.fraction );
|
pxPacket->rootDelay = FreeRTOS_htonl( pxPacket->rootDelay );
|
||||||
}
|
pxPacket->rootDispersion = FreeRTOS_htonl( pxPacket->rootDispersion );
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
pxPacket->referenceTimestamp.seconds = FreeRTOS_htonl( pxPacket->referenceTimestamp.seconds );
|
||||||
static void prvNTPPacketInit( )
|
pxPacket->referenceTimestamp.fraction = FreeRTOS_htonl( pxPacket->referenceTimestamp.fraction );
|
||||||
{
|
|
||||||
memset (&xNTPPacket, '\0', sizeof( xNTPPacket ) );
|
pxPacket->originateTimestamp.seconds = FreeRTOS_htonl( pxPacket->originateTimestamp.seconds );
|
||||||
|
pxPacket->originateTimestamp.fraction = FreeRTOS_htonl( pxPacket->originateTimestamp.fraction );
|
||||||
xNTPPacket.flags = 0xDB; /* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */
|
|
||||||
xNTPPacket.poll = 10; /* 10 means 1 << 10 = 1024 seconds */
|
pxPacket->receiveTimestamp.seconds = FreeRTOS_htonl( pxPacket->receiveTimestamp.seconds );
|
||||||
xNTPPacket.precision = 0xFA; /* = 250 = 0.015625 seconds */
|
pxPacket->receiveTimestamp.fraction = FreeRTOS_htonl( pxPacket->receiveTimestamp.fraction );
|
||||||
xNTPPacket.rootDelay = 0x5D2E; /* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */
|
|
||||||
xNTPPacket.rootDispersion = 0x0008CAC8; /* 0x0008CAC8 = 8.7912 seconds */
|
pxPacket->transmitTimestamp.seconds = FreeRTOS_htonl( pxPacket->transmitTimestamp.seconds );
|
||||||
|
pxPacket->transmitTimestamp.fraction = FreeRTOS_htonl( pxPacket->transmitTimestamp.fraction );
|
||||||
/* use the recorded NTP time */
|
}
|
||||||
time_t uxSecs = FreeRTOS_time( NULL );/* apTime may be NULL, returns seconds */
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
xNTPPacket.referenceTimestamp.seconds = uxSecs; /* Current time */
|
static void prvNTPPacketInit()
|
||||||
xNTPPacket.transmitTimestamp.seconds = uxSecs + 3;
|
{
|
||||||
|
memset( &xNTPPacket, '\0', sizeof( xNTPPacket ) );
|
||||||
/* Transform the contents of the fields from native to big endian. */
|
|
||||||
prvSwapFields( &xNTPPacket );
|
xNTPPacket.flags = 0xDB; /* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */
|
||||||
}
|
xNTPPacket.poll = 10; /* 10 means 1 << 10 = 1024 seconds */
|
||||||
/*-----------------------------------------------------------*/
|
xNTPPacket.precision = 0xFA; /* = 250 = 0.015625 seconds */
|
||||||
|
xNTPPacket.rootDelay = 0x5D2E; /* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */
|
||||||
static void prvReadTime( struct SNtpPacket * pxPacket )
|
xNTPPacket.rootDispersion = 0x0008CAC8; /* 0x0008CAC8 = 8.7912 seconds */
|
||||||
{
|
|
||||||
FF_TimeStruct_t xTimeStruct;
|
/* use the recorded NTP time */
|
||||||
time_t uxPreviousSeconds;
|
time_t uxSecs = FreeRTOS_time( NULL ); /* apTime may be NULL, returns seconds */
|
||||||
time_t uxPreviousMS;
|
|
||||||
|
xNTPPacket.referenceTimestamp.seconds = uxSecs; /* Current time */
|
||||||
time_t uxCurrentSeconds;
|
xNTPPacket.transmitTimestamp.seconds = uxSecs + 3;
|
||||||
time_t uxCurrentMS;
|
|
||||||
|
/* Transform the contents of the fields from native to big endian. */
|
||||||
const char *pcTimeUnit;
|
prvSwapFields( &xNTPPacket );
|
||||||
int32_t ilDiff;
|
}
|
||||||
TickType_t uxTravelTime;
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
uxTravelTime = xTaskGetTickCount() - uxSendTime;
|
static void prvReadTime( struct SNtpPacket * pxPacket )
|
||||||
|
{
|
||||||
/* Transform the contents of the fields from big to native endian. */
|
FF_TimeStruct_t xTimeStruct;
|
||||||
prvSwapFields( pxPacket );
|
time_t uxPreviousSeconds;
|
||||||
|
time_t uxPreviousMS;
|
||||||
uxCurrentSeconds = pxPacket->receiveTimestamp.seconds - TIME1970;
|
|
||||||
uxCurrentMS = pxPacket->receiveTimestamp.fraction / 4294967;
|
time_t uxCurrentSeconds;
|
||||||
uxCurrentSeconds += uxCurrentMS / 1000;
|
time_t uxCurrentMS;
|
||||||
uxCurrentMS = uxCurrentMS % 1000;
|
|
||||||
|
const char * pcTimeUnit;
|
||||||
// Get the last time recorded
|
int32_t ilDiff;
|
||||||
uxPreviousSeconds = FreeRTOS_get_secs_msec( &uxPreviousMS );
|
TickType_t uxTravelTime;
|
||||||
|
|
||||||
// Set the new time with precision in msec. */
|
uxTravelTime = xTaskGetTickCount() - uxSendTime;
|
||||||
FreeRTOS_set_secs_msec( &uxCurrentSeconds, &uxCurrentMS );
|
|
||||||
|
/* Transform the contents of the fields from big to native endian. */
|
||||||
if( uxCurrentSeconds >= uxPreviousSeconds )
|
prvSwapFields( pxPacket );
|
||||||
{
|
|
||||||
ilDiff = ( int32_t ) ( uxCurrentSeconds - uxPreviousSeconds );
|
uxCurrentSeconds = pxPacket->receiveTimestamp.seconds - TIME1970;
|
||||||
}
|
uxCurrentMS = pxPacket->receiveTimestamp.fraction / 4294967;
|
||||||
else
|
uxCurrentSeconds += uxCurrentMS / 1000;
|
||||||
{
|
uxCurrentMS = uxCurrentMS % 1000;
|
||||||
ilDiff = 0 - ( int32_t ) ( uxPreviousSeconds - uxCurrentSeconds );
|
|
||||||
}
|
/* Get the last time recorded */
|
||||||
|
uxPreviousSeconds = FreeRTOS_get_secs_msec( &uxPreviousMS );
|
||||||
if( ( ilDiff < -5 ) || ( ilDiff > 5 ) )
|
|
||||||
{
|
/* Set the new time with precision in msec. * / */
|
||||||
/* More than 5 seconds difference. */
|
FreeRTOS_set_secs_msec( &uxCurrentSeconds, &uxCurrentMS );
|
||||||
pcTimeUnit = "sec";
|
|
||||||
}
|
if( uxCurrentSeconds >= uxPreviousSeconds )
|
||||||
else
|
{
|
||||||
{
|
ilDiff = ( int32_t ) ( uxCurrentSeconds - uxPreviousSeconds );
|
||||||
/* Less than or equal to 5 second difference. */
|
}
|
||||||
pcTimeUnit = "ms";
|
else
|
||||||
uint32_t ulLowest = ( uxCurrentSeconds <= uxPreviousSeconds ) ? uxCurrentSeconds : uxPreviousSeconds;
|
{
|
||||||
int32_t iCurMS = 1000 * ( uxCurrentSeconds - ulLowest ) + uxCurrentMS;
|
ilDiff = 0 - ( int32_t ) ( uxPreviousSeconds - uxCurrentSeconds );
|
||||||
int32_t iPrevMS = 1000 * ( uxPreviousSeconds - ulLowest ) + uxPreviousMS;
|
}
|
||||||
ilDiff = iCurMS - iPrevMS;
|
|
||||||
}
|
if( ( ilDiff < -5 ) || ( ilDiff > 5 ) )
|
||||||
uxCurrentSeconds -= iTimeZone;
|
{
|
||||||
|
/* More than 5 seconds difference. */
|
||||||
FreeRTOS_gmtime_r( &uxCurrentSeconds, &xTimeStruct );
|
pcTimeUnit = "sec";
|
||||||
|
}
|
||||||
/*
|
else
|
||||||
378.067 [NTP client] NTP time: 9/11/2015 16:11:19.559 Diff -20 ms (289 ms)
|
{
|
||||||
379.441 [NTP client] NTP time: 9/11/2015 16:11:20.933 Diff 0 ms (263 ms)
|
/* Less than or equal to 5 second difference. */
|
||||||
*/
|
pcTimeUnit = "ms";
|
||||||
|
uint32_t ulLowest = ( uxCurrentSeconds <= uxPreviousSeconds ) ? uxCurrentSeconds : uxPreviousSeconds;
|
||||||
FreeRTOS_printf( ("NTP time: %d/%d/%02d %2d:%02d:%02d.%03u Diff %d %s (%lu ms)\n",
|
int32_t iCurMS = 1000 * ( uxCurrentSeconds - ulLowest ) + uxCurrentMS;
|
||||||
xTimeStruct.tm_mday,
|
int32_t iPrevMS = 1000 * ( uxPreviousSeconds - ulLowest ) + uxPreviousMS;
|
||||||
xTimeStruct.tm_mon + 1,
|
ilDiff = iCurMS - iPrevMS;
|
||||||
xTimeStruct.tm_year + 1900,
|
}
|
||||||
xTimeStruct.tm_hour,
|
|
||||||
xTimeStruct.tm_min,
|
uxCurrentSeconds -= iTimeZone;
|
||||||
xTimeStruct.tm_sec,
|
|
||||||
( unsigned )uxCurrentMS,
|
FreeRTOS_gmtime_r( &uxCurrentSeconds, &xTimeStruct );
|
||||||
( unsigned )ilDiff,
|
|
||||||
pcTimeUnit,
|
/*
|
||||||
uxTravelTime ) );
|
* 378.067 [NTP client] NTP time: 9/11/2015 16:11:19.559 Diff -20 ms (289 ms)
|
||||||
|
* 379.441 [NTP client] NTP time: 9/11/2015 16:11:20.933 Diff 0 ms (263 ms)
|
||||||
/* Remove compiler warnings in case FreeRTOS_printf() is not used. */
|
*/
|
||||||
( void ) pcTimeUnit;
|
|
||||||
( void ) uxTravelTime;
|
FreeRTOS_printf( ( "NTP time: %d/%d/%02d %2d:%02d:%02d.%03u Diff %d %s (%lu ms)\n",
|
||||||
}
|
xTimeStruct.tm_mday,
|
||||||
/*-----------------------------------------------------------*/
|
xTimeStruct.tm_mon + 1,
|
||||||
|
xTimeStruct.tm_year + 1900,
|
||||||
#if( ipconfigUSE_CALLBACKS != 0 )
|
xTimeStruct.tm_hour,
|
||||||
|
xTimeStruct.tm_min,
|
||||||
static BaseType_t xOnUDPReceive( Socket_t xSocket, void * pvData, size_t xLength,
|
xTimeStruct.tm_sec,
|
||||||
const struct freertos_sockaddr *pxFrom, const struct freertos_sockaddr *pxDest )
|
( unsigned ) uxCurrentMS,
|
||||||
{
|
( unsigned ) ilDiff,
|
||||||
if( xLength >= sizeof( xNTPPacket ) )
|
pcTimeUnit,
|
||||||
{
|
uxTravelTime ) );
|
||||||
prvReadTime( ( struct SNtpPacket *)pvData );
|
|
||||||
if( xStatus != EStatusPause )
|
/* Remove compiler warnings in case FreeRTOS_printf() is not used. */
|
||||||
{
|
( void ) pcTimeUnit;
|
||||||
xStatus = EStatusPause;
|
( void ) uxTravelTime;
|
||||||
}
|
}
|
||||||
}
|
/*-----------------------------------------------------------*/
|
||||||
vSignalTask();
|
|
||||||
/* Tell the driver not to store the RX data */
|
#if ( ipconfigUSE_CALLBACKS != 0 )
|
||||||
return 1;
|
|
||||||
}
|
static BaseType_t xOnUDPReceive( Socket_t xSocket,
|
||||||
/*-----------------------------------------------------------*/
|
void * pvData,
|
||||||
|
size_t xLength,
|
||||||
#endif /* ipconfigUSE_CALLBACKS != 0 */
|
const struct freertos_sockaddr * pxFrom,
|
||||||
|
const struct freertos_sockaddr * pxDest )
|
||||||
static void prvNTPTask( void *pvParameters )
|
{
|
||||||
{
|
if( xLength >= sizeof( xNTPPacket ) )
|
||||||
BaseType_t xServerIndex = 3;
|
{
|
||||||
struct freertos_sockaddr xAddress;
|
prvReadTime( ( struct SNtpPacket * ) pvData );
|
||||||
#if( ipconfigUSE_CALLBACKS != 0 )
|
|
||||||
F_TCP_UDP_Handler_t xHandler;
|
if( xStatus != EStatusPause )
|
||||||
#endif /* ipconfigUSE_CALLBACKS != 0 */
|
{
|
||||||
|
xStatus = EStatusPause;
|
||||||
xStatus = EStatusLookup;
|
}
|
||||||
#if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) || ( ipconfigUSE_CALLBACKS != 0 )
|
}
|
||||||
{
|
|
||||||
xNTPWakeupSem = xSemaphoreCreateBinary();
|
vSignalTask();
|
||||||
}
|
/* Tell the driver not to store the RX data */
|
||||||
#endif
|
return 1;
|
||||||
|
}
|
||||||
#if( ipconfigUSE_CALLBACKS != 0 )
|
/*-----------------------------------------------------------*/
|
||||||
{
|
|
||||||
memset( &xHandler, '\0', sizeof( xHandler ) );
|
#endif /* ipconfigUSE_CALLBACKS != 0 */
|
||||||
xHandler.pxOnUDPReceive = xOnUDPReceive;
|
|
||||||
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_UDP_RECV_HANDLER, ( void * ) &xHandler, sizeof( xHandler ) );
|
static void prvNTPTask( void * pvParameters )
|
||||||
}
|
{
|
||||||
#endif
|
BaseType_t xServerIndex = 3;
|
||||||
#if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 )
|
struct freertos_sockaddr xAddress;
|
||||||
{
|
|
||||||
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xNTPWakeupSem, sizeof( xNTPWakeupSem ) );
|
#if ( ipconfigUSE_CALLBACKS != 0 )
|
||||||
}
|
F_TCP_UDP_Handler_t xHandler;
|
||||||
#endif
|
#endif /* ipconfigUSE_CALLBACKS != 0 */
|
||||||
for( ; ; )
|
|
||||||
{
|
xStatus = EStatusLookup;
|
||||||
switch( xStatus )
|
#if ( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) || ( ipconfigUSE_CALLBACKS != 0 )
|
||||||
{
|
{
|
||||||
case EStatusLookup:
|
xNTPWakeupSem = xSemaphoreCreateBinary();
|
||||||
if( ( ulIPAddressFound == 0ul ) || ( ulIPAddressFound == ~0ul ) )
|
}
|
||||||
{
|
#endif
|
||||||
if( ++xServerIndex == sizeof( pcTimeServers ) / sizeof( pcTimeServers[ 0 ] ) )
|
|
||||||
{
|
#if ( ipconfigUSE_CALLBACKS != 0 )
|
||||||
xServerIndex = 0;
|
{
|
||||||
}
|
memset( &xHandler, '\0', sizeof( xHandler ) );
|
||||||
FreeRTOS_printf( ( "Looking up server '%s'\n", pcTimeServers[ xServerIndex ] ) );
|
xHandler.pxOnUDPReceive = xOnUDPReceive;
|
||||||
FreeRTOS_gethostbyname_a( pcTimeServers[ xServerIndex ], vDNS_callback, (void *)NULL, 1200 );
|
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_UDP_RECV_HANDLER, ( void * ) &xHandler, sizeof( xHandler ) );
|
||||||
}
|
}
|
||||||
else
|
#endif
|
||||||
{
|
#if ( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 )
|
||||||
xStatus = EStatusAsking;
|
{
|
||||||
}
|
FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xNTPWakeupSem, sizeof( xNTPWakeupSem ) );
|
||||||
break;
|
}
|
||||||
|
#endif
|
||||||
case EStatusAsking:
|
|
||||||
{
|
for( ; ; )
|
||||||
char pcBuf[16];
|
{
|
||||||
|
switch( xStatus )
|
||||||
prvNTPPacketInit( );
|
{
|
||||||
|
case EStatusLookup:
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
|
||||||
{
|
if( ( ulIPAddressFound == 0ul ) || ( ulIPAddressFound == ~0ul ) )
|
||||||
xAddress.sin_address.ulIP_IPv4 = ulIPAddressFound;
|
{
|
||||||
xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
|
if( ++xServerIndex == sizeof( pcTimeServers ) / sizeof( pcTimeServers[ 0 ] ) )
|
||||||
FreeRTOS_inet_ntoa( xAddress.sin_address.ulIP_IPv4, pcBuf );
|
{
|
||||||
}
|
xServerIndex = 0;
|
||||||
#else
|
}
|
||||||
{
|
|
||||||
xAddress.sin_addr = ulIPAddressFound;
|
FreeRTOS_printf( ( "Looking up server '%s'\n", pcTimeServers[ xServerIndex ] ) );
|
||||||
xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
|
FreeRTOS_gethostbyname_a( pcTimeServers[ xServerIndex ], vDNS_callback, ( void * ) NULL, 1200 );
|
||||||
FreeRTOS_inet_ntoa( xAddress.sin_addr, pcBuf );
|
}
|
||||||
}
|
else
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
{
|
||||||
|
xStatus = EStatusAsking;
|
||||||
xAddress.sin_family = FREERTOS_AF_INET;
|
}
|
||||||
|
|
||||||
FreeRTOS_printf( ( "Sending UDP message to %s:%u\n",
|
break;
|
||||||
pcBuf,
|
|
||||||
FreeRTOS_ntohs( xAddress.sin_port ) ) );
|
case EStatusAsking:
|
||||||
|
{
|
||||||
uxSendTime = xTaskGetTickCount( );
|
char pcBuf[ 16 ];
|
||||||
FreeRTOS_sendto( xUDPSocket, ( void * )&xNTPPacket, sizeof( xNTPPacket ), 0, &xAddress, sizeof( xAddress ) );
|
|
||||||
}
|
prvNTPPacketInit();
|
||||||
break;
|
|
||||||
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
case EStatusPause:
|
{
|
||||||
break;
|
xAddress.sin_address.ulIP_IPv4 = ulIPAddressFound;
|
||||||
|
xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
|
||||||
case EStatusFailed:
|
FreeRTOS_inet_ntoa( xAddress.sin_address.ulIP_IPv4, pcBuf );
|
||||||
break;
|
}
|
||||||
}
|
#else
|
||||||
|
{
|
||||||
#if( ipconfigUSE_CALLBACKS != 0 )
|
xAddress.sin_addr = ulIPAddressFound;
|
||||||
{
|
xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
|
||||||
xSemaphoreTake( xNTPWakeupSem, 5000 );
|
FreeRTOS_inet_ntoa( xAddress.sin_addr, pcBuf );
|
||||||
}
|
}
|
||||||
#else
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
{
|
|
||||||
uint32_t xAddressSize;
|
xAddress.sin_family = FREERTOS_AF_INET;
|
||||||
BaseType_t xReturned;
|
|
||||||
|
FreeRTOS_printf( ( "Sending UDP message to %s:%u\n",
|
||||||
xAddressSize = sizeof( xAddress );
|
pcBuf,
|
||||||
xReturned = FreeRTOS_recvfrom( xUDPSocket, ( void * ) cRecvBuffer, sizeof( cRecvBuffer ), 0, &xAddress, &xAddressSize );
|
FreeRTOS_ntohs( xAddress.sin_port ) ) );
|
||||||
switch( xReturned )
|
|
||||||
{
|
uxSendTime = xTaskGetTickCount();
|
||||||
case 0:
|
FreeRTOS_sendto( xUDPSocket, ( void * ) &xNTPPacket, sizeof( xNTPPacket ), 0, &xAddress, sizeof( xAddress ) );
|
||||||
case -pdFREERTOS_ERRNO_EAGAIN:
|
}
|
||||||
case -pdFREERTOS_ERRNO_EINTR:
|
break;
|
||||||
break;
|
|
||||||
default:
|
case EStatusPause:
|
||||||
if( xReturned < sizeof( xNTPPacket ) )
|
break;
|
||||||
{
|
|
||||||
FreeRTOS_printf( ( "FreeRTOS_recvfrom: returns %ld\n", xReturned ) );
|
case EStatusFailed:
|
||||||
}
|
break;
|
||||||
else
|
}
|
||||||
{
|
|
||||||
prvReadTime( ( struct SNtpPacket *)cRecvBuffer );
|
#if ( ipconfigUSE_CALLBACKS != 0 )
|
||||||
if( xStatus != EStatusPause )
|
{
|
||||||
{
|
xSemaphoreTake( xNTPWakeupSem, 5000 );
|
||||||
xStatus = EStatusPause;
|
}
|
||||||
}
|
#else
|
||||||
}
|
{
|
||||||
break;
|
uint32_t xAddressSize;
|
||||||
}
|
BaseType_t xReturned;
|
||||||
}
|
|
||||||
#endif
|
xAddressSize = sizeof( xAddress );
|
||||||
}
|
xReturned = FreeRTOS_recvfrom( xUDPSocket, ( void * ) cRecvBuffer, sizeof( cRecvBuffer ), 0, &xAddress, &xAddressSize );
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
switch( xReturned )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
case -pdFREERTOS_ERRNO_EAGAIN:
|
||||||
|
case -pdFREERTOS_ERRNO_EINTR:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
if( xReturned < sizeof( xNTPPacket ) )
|
||||||
|
{
|
||||||
|
FreeRTOS_printf( ( "FreeRTOS_recvfrom: returns %ld\n", xReturned ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prvReadTime( ( struct SNtpPacket * ) cRecvBuffer );
|
||||||
|
|
||||||
|
if( xStatus != EStatusPause )
|
||||||
|
{
|
||||||
|
xStatus = EStatusPause;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* if ( ipconfigUSE_CALLBACKS != 0 ) */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
FreeRTOS 2020107.00 adds a new SNTPv4 client library, [FreeRTOS/coreSNTP](https://github.com/FreeRTOS/coreSNTP),
|
FreeRTOS 2020107.00 adds a new SNTPv4 client library, [FreeRTOS/coreSNTP](https://github.com/FreeRTOS/coreSNTP),
|
||||||
and an [accompanying demo](..\..\..\coreSNTP_Windows_Simulator) to showcase the setup of an SNTP client and system
|
and an [accompanying demo](..\..\..\coreSNTP_Windows_Simulator) to showcase the setup of an SNTP client and system
|
||||||
wall-clock time using the library. Refer to
|
wall-clock time using the library. Refer to
|
||||||
The protocols implemented in this directory are intended to be demo quality
|
The protocols implemented in this directory are intended to be demo quality
|
||||||
examples only. They are not intended for inclusion in production devices.
|
examples only. They are not intended for inclusion in production devices.
|
||||||
|
|
|
@ -1,133 +1,136 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS+TCP V2.0.1
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://aws.amazon.com/freertos
|
* https://www.FreeRTOS.org
|
||||||
* https://www.FreeRTOS.org
|
* https://github.com/FreeRTOS
|
||||||
*/
|
*
|
||||||
|
*/
|
||||||
#ifndef __FTPCMD_H__
|
|
||||||
|
#ifndef __FTPCMD_H__
|
||||||
#define __FTPCMD_H__
|
|
||||||
|
#define __FTPCMD_H__
|
||||||
#define REPL_110 "110 Restart marker reply.\r\n"
|
|
||||||
#define REPL_120 "120 Try again in 2 minutes.\r\n"
|
#define REPL_110 "110 Restart marker reply.\r\n"
|
||||||
#define REPL_125 "125 Data connection already open; transfer starting.\r\n"
|
#define REPL_120 "120 Try again in 2 minutes.\r\n"
|
||||||
#define REPL_150 "150 File status okay; about to open data connection.\r\n"
|
#define REPL_125 "125 Data connection already open; transfer starting.\r\n"
|
||||||
#define REPL_200 "200 NOOP command successful.\r\n"
|
#define REPL_150 "150 File status okay; about to open data connection.\r\n"
|
||||||
#define REPL_200_PROGRESS "200 NOOP: data transfer in progress.\r\n"
|
#define REPL_200 "200 NOOP command successful.\r\n"
|
||||||
#define REPL_202 "202 Command not implemented, superfluous at this site.\r\n"
|
#define REPL_200_PROGRESS "200 NOOP: data transfer in progress.\r\n"
|
||||||
#define REPL_211 "221 System status, or system help reply.\r\n"
|
#define REPL_202 "202 Command not implemented, superfluous at this site.\r\n"
|
||||||
#define REPL_211_STATUS "221-status of %s.\r\n"
|
#define REPL_211 "221 System status, or system help reply.\r\n"
|
||||||
#define REPL_211_END "221 End of status.\r\n"
|
#define REPL_211_STATUS "221-status of %s.\r\n"
|
||||||
#define REPL_212 "212 Directory status.\r\n"
|
#define REPL_211_END "221 End of status.\r\n"
|
||||||
#define REPL_213 "213 File status.\r\n"
|
#define REPL_212 "212 Directory status.\r\n"
|
||||||
#define REPL_214 "214 Help message.\r\n"
|
#define REPL_213 "213 File status.\r\n"
|
||||||
#define REPL_214_END "214 End Help message.\r\n"
|
#define REPL_214 "214 Help message.\r\n"
|
||||||
#define REPL_215 "215 %s system type.\r\n"
|
#define REPL_214_END "214 End Help message.\r\n"
|
||||||
#define REPL_220 "220 Service ready for new user.\r\n"
|
#define REPL_215 "215 %s system type.\r\n"
|
||||||
#define REPL_221 "221 Service closing control connection.\r\n"
|
#define REPL_220 "220 Service ready for new user.\r\n"
|
||||||
#define REPL_225 "225 Data connection open; no transfer in progress.\r\n"
|
#define REPL_221 "221 Service closing control connection.\r\n"
|
||||||
#define REPL_226 "226 Closing data connection.\r\n"
|
#define REPL_225 "225 Data connection open; no transfer in progress.\r\n"
|
||||||
#define REPL_227 "227 Entering Passive Mode (%s,%s,%s,%s,%s,%s).\r\n"
|
#define REPL_226 "226 Closing data connection.\r\n"
|
||||||
#define REPL_227_D "227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n"
|
#define REPL_227 "227 Entering Passive Mode (%s,%s,%s,%s,%s,%s).\r\n"
|
||||||
#define REPL_230 "230 User logged in, proceed.\r\n"
|
#define REPL_227_D "227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n"
|
||||||
#define REPL_250 "250 Requested file action okay, completed.\r\n"
|
#define REPL_230 "230 User logged in, proceed.\r\n"
|
||||||
#define REPL_257 "257 %s created.\r\n"
|
#define REPL_250 "250 Requested file action okay, completed.\r\n"
|
||||||
// #define REPL_257_PWD "257 \"%s\" is current working dir.\r\n"
|
#define REPL_257 "257 %s created.\r\n"
|
||||||
#define REPL_257_PWD "257 \"%s\"\r\n"
|
/* #define REPL_257_PWD "257 \"%s\" is current working dir.\r\n" */
|
||||||
#define REPL_331 "331 Only anonymous user is accepted.\r\n"
|
#define REPL_257_PWD "257 \"%s\"\r\n"
|
||||||
#define REPL_331_ANON "331 Anonymous login okay\r\n"
|
#define REPL_331 "331 Only anonymous user is accepted.\r\n"
|
||||||
#define REPL_332 "332 Need account for login.\r\n"
|
#define REPL_331_ANON "331 Anonymous login okay\r\n"
|
||||||
#define REPL_350 "350 Requested file action pending further information.\r\n"
|
#define REPL_332 "332 Need account for login.\r\n"
|
||||||
#define REPL_421 "421 Service not available, closing control connection.\r\n"
|
#define REPL_350 "350 Requested file action pending further information.\r\n"
|
||||||
#define REPL_425 "425 Can't open data connection.\r\n"
|
#define REPL_421 "421 Service not available, closing control connection.\r\n"
|
||||||
#define REPL_426 "426 Connection closed; transfer aborted.\r\n"
|
#define REPL_425 "425 Can't open data connection.\r\n"
|
||||||
#define REPL_450 "450 Requested file action not taken.\r\n"
|
#define REPL_426 "426 Connection closed; transfer aborted.\r\n"
|
||||||
#define REPL_451 "451 Requested action aborted. Local error in processing.\r\n"
|
#define REPL_450 "450 Requested file action not taken.\r\n"
|
||||||
#define REPL_452 "452 Requested action not taken.\r\n"
|
#define REPL_451 "451 Requested action aborted. Local error in processing.\r\n"
|
||||||
#define REPL_500 "500 Syntax error, command unrecognized.\r\n"
|
#define REPL_452 "452 Requested action not taken.\r\n"
|
||||||
#define REPL_501 "501 Syntax error in parameters or arguments.\r\n"
|
#define REPL_500 "500 Syntax error, command unrecognized.\r\n"
|
||||||
#define REPL_502 "502 Command not implemented.\r\n"
|
#define REPL_501 "501 Syntax error in parameters or arguments.\r\n"
|
||||||
#define REPL_503 "503 Bad sequence of commands.\r\n"
|
#define REPL_502 "502 Command not implemented.\r\n"
|
||||||
#define REPL_504 "504 Command not implemented for that parameter.\r\n"
|
#define REPL_503 "503 Bad sequence of commands.\r\n"
|
||||||
#define REPL_530 "530 Not logged in.\r\n"
|
#define REPL_504 "504 Command not implemented for that parameter.\r\n"
|
||||||
#define REPL_532 "532 Need account for storing files.\r\n"
|
#define REPL_530 "530 Not logged in.\r\n"
|
||||||
#define REPL_550 "550 Requested action not taken.\r\n"
|
#define REPL_532 "532 Need account for storing files.\r\n"
|
||||||
#define REPL_551 "551 Requested action aborted. Page type unknown.\r\n"
|
#define REPL_550 "550 Requested action not taken.\r\n"
|
||||||
#define REPL_552 "552 Requested file action aborted.\r\n"
|
#define REPL_551 "551 Requested action aborted. Page type unknown.\r\n"
|
||||||
#define REPL_553 "553 Requested action not taken.\r\n"
|
#define REPL_552 "552 Requested file action aborted.\r\n"
|
||||||
#define REPL_553_READ_ONLY "553 Read-only file-system.\r\n"
|
#define REPL_553 "553 Requested action not taken.\r\n"
|
||||||
|
#define REPL_553_READ_ONLY "553 Read-only file-system.\r\n"
|
||||||
enum EFTPCommand {
|
|
||||||
ECMD_USER,
|
enum EFTPCommand
|
||||||
ECMD_PASS,
|
{
|
||||||
ECMD_ACCT,
|
ECMD_USER,
|
||||||
ECMD_CWD,
|
ECMD_PASS,
|
||||||
ECMD_CDUP,
|
ECMD_ACCT,
|
||||||
ECMD_SMNT,
|
ECMD_CWD,
|
||||||
ECMD_QUIT,
|
ECMD_CDUP,
|
||||||
ECMD_REIN,
|
ECMD_SMNT,
|
||||||
ECMD_PORT,
|
ECMD_QUIT,
|
||||||
ECMD_PASV,
|
ECMD_REIN,
|
||||||
ECMD_TYPE,
|
ECMD_PORT,
|
||||||
ECMD_STRU,
|
ECMD_PASV,
|
||||||
ECMD_MODE,
|
ECMD_TYPE,
|
||||||
ECMD_RETR,
|
ECMD_STRU,
|
||||||
ECMD_STOR,
|
ECMD_MODE,
|
||||||
ECMD_STOU,
|
ECMD_RETR,
|
||||||
ECMD_APPE,
|
ECMD_STOR,
|
||||||
ECMD_ALLO,
|
ECMD_STOU,
|
||||||
ECMD_REST,
|
ECMD_APPE,
|
||||||
ECMD_RNFR,
|
ECMD_ALLO,
|
||||||
ECMD_RNTO,
|
ECMD_REST,
|
||||||
ECMD_ABOR,
|
ECMD_RNFR,
|
||||||
ECMD_SIZE,
|
ECMD_RNTO,
|
||||||
ECMD_MDTM,
|
ECMD_ABOR,
|
||||||
ECMD_DELE,
|
ECMD_SIZE,
|
||||||
ECMD_RMD,
|
ECMD_MDTM,
|
||||||
ECMD_MKD,
|
ECMD_DELE,
|
||||||
ECMD_PWD,
|
ECMD_RMD,
|
||||||
ECMD_LIST,
|
ECMD_MKD,
|
||||||
ECMD_NLST,
|
ECMD_PWD,
|
||||||
ECMD_SITE,
|
ECMD_LIST,
|
||||||
ECMD_SYST,
|
ECMD_NLST,
|
||||||
ECMD_FEAT,
|
ECMD_SITE,
|
||||||
ECMD_STAT,
|
ECMD_SYST,
|
||||||
ECMD_HELP,
|
ECMD_FEAT,
|
||||||
ECMD_NOOP,
|
ECMD_STAT,
|
||||||
ECMD_EMPTY,
|
ECMD_HELP,
|
||||||
ECMD_CLOSE,
|
ECMD_NOOP,
|
||||||
ECMD_UNKNOWN,
|
ECMD_EMPTY,
|
||||||
};
|
ECMD_CLOSE,
|
||||||
|
ECMD_UNKNOWN,
|
||||||
typedef struct xFTP_COMMAND {
|
};
|
||||||
BaseType_t xCommandLength;
|
|
||||||
const char pcCommandName[7];
|
typedef struct xFTP_COMMAND
|
||||||
const unsigned char ucCommandType;
|
{
|
||||||
const unsigned char checkLogin;
|
BaseType_t xCommandLength;
|
||||||
const unsigned char checkNullArg;
|
const char pcCommandName[ 7 ];
|
||||||
} FTPCommand_t;
|
const unsigned char ucCommandType;
|
||||||
|
const unsigned char checkLogin;
|
||||||
#define FTP_CMD_COUNT (ECMD_UNKNOWN+1)
|
const unsigned char checkNullArg;
|
||||||
|
} FTPCommand_t;
|
||||||
extern const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ];
|
|
||||||
|
#define FTP_CMD_COUNT ( ECMD_UNKNOWN + 1 )
|
||||||
#endif // __FTPCMD_H__
|
|
||||||
|
extern const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ];
|
||||||
|
|
||||||
|
#endif // __FTPCMD_H__
|
||||||
|
|
|
@ -1,67 +1,68 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS+TCP V2.0.3
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://aws.amazon.com/freertos
|
* https://www.FreeRTOS.org
|
||||||
* https://www.FreeRTOS.org
|
* https://github.com/FreeRTOS
|
||||||
*/
|
*
|
||||||
#ifndef FREERTOS_HTTP_COMMANDS_H
|
*/
|
||||||
#define FREERTOS_HTTP_COMMANDS_H
|
#ifndef FREERTOS_HTTP_COMMANDS_H
|
||||||
|
#define FREERTOS_HTTP_COMMANDS_H
|
||||||
enum {
|
|
||||||
WEB_REPLY_OK = 200,
|
enum
|
||||||
WEB_NO_CONTENT = 204,
|
{
|
||||||
WEB_BAD_REQUEST = 400,
|
WEB_REPLY_OK = 200,
|
||||||
WEB_UNAUTHORIZED = 401,
|
WEB_NO_CONTENT = 204,
|
||||||
WEB_NOT_FOUND = 404,
|
WEB_BAD_REQUEST = 400,
|
||||||
WEB_GONE = 410,
|
WEB_UNAUTHORIZED = 401,
|
||||||
WEB_PRECONDITION_FAILED = 412,
|
WEB_NOT_FOUND = 404,
|
||||||
WEB_INTERNAL_SERVER_ERROR = 500,
|
WEB_GONE = 410,
|
||||||
};
|
WEB_PRECONDITION_FAILED = 412,
|
||||||
|
WEB_INTERNAL_SERVER_ERROR = 500,
|
||||||
enum EWebCommand {
|
};
|
||||||
ECMD_GET,
|
|
||||||
ECMD_HEAD,
|
enum EWebCommand
|
||||||
ECMD_POST,
|
{
|
||||||
ECMD_PUT,
|
ECMD_GET,
|
||||||
ECMD_DELETE,
|
ECMD_HEAD,
|
||||||
ECMD_TRACE,
|
ECMD_POST,
|
||||||
ECMD_OPTIONS,
|
ECMD_PUT,
|
||||||
ECMD_CONNECT,
|
ECMD_DELETE,
|
||||||
ECMD_PATCH,
|
ECMD_TRACE,
|
||||||
ECMD_UNK,
|
ECMD_OPTIONS,
|
||||||
};
|
ECMD_CONNECT,
|
||||||
|
ECMD_PATCH,
|
||||||
struct xWEB_COMMAND
|
ECMD_UNK,
|
||||||
{
|
};
|
||||||
BaseType_t xCommandLength;
|
|
||||||
const char *pcCommandName;
|
struct xWEB_COMMAND
|
||||||
const unsigned char ucCommandType;
|
{
|
||||||
};
|
BaseType_t xCommandLength;
|
||||||
|
const char * pcCommandName;
|
||||||
#define WEB_CMD_COUNT (ECMD_UNK+1)
|
const unsigned char ucCommandType;
|
||||||
|
};
|
||||||
extern const struct xWEB_COMMAND xWebCommands[WEB_CMD_COUNT];
|
|
||||||
|
#define WEB_CMD_COUNT ( ECMD_UNK + 1 )
|
||||||
extern const char *webCodename (int aCode);
|
|
||||||
|
extern const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ];
|
||||||
#endif /* FREERTOS_HTTP_COMMANDS_H */
|
|
||||||
|
extern const char * webCodename( int aCode );
|
||||||
|
|
||||||
|
#endif /* FREERTOS_HTTP_COMMANDS_H */
|
||||||
|
|
|
@ -1,125 +1,141 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS+TCP V2.0.3
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://aws.amazon.com/freertos
|
* https://www.FreeRTOS.org
|
||||||
* https://www.FreeRTOS.org
|
* https://github.com/FreeRTOS
|
||||||
*/
|
*
|
||||||
|
*/
|
||||||
/*
|
|
||||||
Some code which is common to TCP servers like HTTP en FTP
|
/*
|
||||||
*/
|
* Some code which is common to TCP servers like HTTP en FTP
|
||||||
|
*/
|
||||||
#ifndef FREERTOS_TCP_SERVER_H
|
|
||||||
#define FREERTOS_TCP_SERVER_H
|
#ifndef FREERTOS_TCP_SERVER_H
|
||||||
|
#define FREERTOS_TCP_SERVER_H
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
#ifdef __cplusplus
|
||||||
#endif
|
extern "C" {
|
||||||
|
#endif
|
||||||
#ifndef FTP_SERVER_USES_RELATIVE_DIRECTORY
|
|
||||||
#define FTP_SERVER_USES_RELATIVE_DIRECTORY 0
|
#ifndef FTP_SERVER_USES_RELATIVE_DIRECTORY
|
||||||
#endif
|
#define FTP_SERVER_USES_RELATIVE_DIRECTORY 0
|
||||||
|
#endif
|
||||||
enum eSERVER_TYPE
|
|
||||||
{
|
enum eSERVER_TYPE
|
||||||
eSERVER_NONE,
|
{
|
||||||
eSERVER_HTTP,
|
eSERVER_NONE,
|
||||||
eSERVER_FTP,
|
eSERVER_HTTP,
|
||||||
};
|
eSERVER_FTP,
|
||||||
|
};
|
||||||
struct xFTP_CLIENT;
|
|
||||||
|
struct xFTP_CLIENT;
|
||||||
#if( ipconfigFTP_HAS_RECEIVED_HOOK != 0 )
|
|
||||||
extern void vApplicationFTPReceivedHook( const char *pcFileName, uint32_t ulSize, struct xFTP_CLIENT *pxFTPClient );
|
#if ( ipconfigFTP_HAS_RECEIVED_HOOK != 0 )
|
||||||
extern void vFTPReplyMessage( struct xFTP_CLIENT *pxFTPClient, const char *pcMessage );
|
extern void vApplicationFTPReceivedHook( const char * pcFileName,
|
||||||
#endif /* ipconfigFTP_HAS_RECEIVED_HOOK != 0 */
|
uint32_t ulSize,
|
||||||
|
struct xFTP_CLIENT * pxFTPClient );
|
||||||
#if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
|
extern void vFTPReplyMessage( struct xFTP_CLIENT * pxFTPClient,
|
||||||
/*
|
const char * pcMessage );
|
||||||
* Function is called when a user name has been submitted.
|
#endif /* ipconfigFTP_HAS_RECEIVED_HOOK != 0 */
|
||||||
* The function may return a string such as: "331 Please enter your password"
|
|
||||||
* or return NULL to use the default reply.
|
#if ( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
|
||||||
*/
|
|
||||||
extern const char *pcApplicationFTPUserHook( const char *pcUserName );
|
/*
|
||||||
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
|
* Function is called when a user name has been submitted.
|
||||||
|
* The function may return a string such as: "331 Please enter your password"
|
||||||
#if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
|
* or return NULL to use the default reply.
|
||||||
/*
|
*/
|
||||||
* Function is called when a password was received.
|
extern const char * pcApplicationFTPUserHook( const char * pcUserName );
|
||||||
* Return positive value to allow the user
|
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
|
||||||
*/
|
|
||||||
extern BaseType_t xApplicationFTPPasswordHook( const char *pcUserName, const char *pcPassword );
|
#if ( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
|
||||||
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
|
|
||||||
|
/*
|
||||||
#if( ipconfigFTP_HAS_USER_PROPERTIES_HOOK != 0 )
|
* Function is called when a password was received.
|
||||||
/*
|
* Return positive value to allow the user
|
||||||
* The FTP server is asking for user-specific properties
|
*/
|
||||||
*/
|
extern BaseType_t xApplicationFTPPasswordHook( const char * pcUserName,
|
||||||
typedef struct
|
const char * pcPassword );
|
||||||
{
|
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
|
||||||
uint16_t usPortNumber; /* For reference only. Host-endian. */
|
|
||||||
const char *pcRootDir;
|
#if ( ipconfigFTP_HAS_USER_PROPERTIES_HOOK != 0 )
|
||||||
BaseType_t xReadOnly;
|
|
||||||
}
|
/*
|
||||||
FTPUserProperties_t;
|
* The FTP server is asking for user-specific properties
|
||||||
extern void vApplicationFTPUserPropertiesHook( const char *pcUserName, FTPUserProperties_t *pxProperties );
|
*/
|
||||||
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
|
typedef struct
|
||||||
|
{
|
||||||
#if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
|
uint16_t usPortNumber; /* For reference only. Host-endian. */
|
||||||
/*
|
const char * pcRootDir;
|
||||||
* A GET request is received containing a special character,
|
BaseType_t xReadOnly;
|
||||||
* usually a question mark.
|
}
|
||||||
* const char *pcURLData; // A request, e.g. "/request?limit=75"
|
FTPUserProperties_t;
|
||||||
* char *pcBuffer; // Here the answer can be written
|
extern void vApplicationFTPUserPropertiesHook( const char * pcUserName,
|
||||||
* size_t uxBufferLength; // Size of the buffer
|
FTPUserProperties_t * pxProperties );
|
||||||
*
|
#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
|
||||||
*/
|
|
||||||
extern size_t uxApplicationHTTPHandleRequestHook( const char *pcURLData, char *pcBuffer, size_t uxBufferLength );
|
#if ( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
|
||||||
#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
|
|
||||||
|
/*
|
||||||
struct xSERVER_CONFIG
|
* A GET request is received containing a special character,
|
||||||
{
|
* usually a question mark.
|
||||||
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
|
* const char *pcURLData; // A request, e.g. "/request?limit=75"
|
||||||
BaseType_t xPortNumber; /* e.g. 80, 8080, 21 */
|
* char *pcBuffer; // Here the answer can be written
|
||||||
BaseType_t xBackLog; /* e.g. 10, maximum number of connected TCP clients */
|
* size_t uxBufferLength; // Size of the buffer
|
||||||
const char * const pcRootDir; /* Treat this directory as the root directory */
|
*
|
||||||
};
|
*/
|
||||||
|
extern size_t uxApplicationHTTPHandleRequestHook( const char * pcURLData,
|
||||||
struct xTCP_SERVER;
|
char * pcBuffer,
|
||||||
typedef struct xTCP_SERVER TCPServer_t;
|
size_t uxBufferLength );
|
||||||
|
#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
|
||||||
TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount );
|
|
||||||
void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime );
|
struct xSERVER_CONFIG
|
||||||
|
{
|
||||||
#if( ipconfigSUPPORT_SIGNALS != 0 )
|
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
|
||||||
/* FreeRTOS_TCPServerWork() calls select().
|
BaseType_t xPortNumber; /* e.g. 80, 8080, 21 */
|
||||||
The two functions below provide a possibility to interrupt
|
BaseType_t xBackLog; /* e.g. 10, maximum number of connected TCP clients */
|
||||||
the call to select(). After the interruption, resume
|
const char * const pcRootDir; /* Treat this directory as the root directory */
|
||||||
by calling FreeRTOS_TCPServerWork() again. */
|
};
|
||||||
BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer );
|
|
||||||
BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken );
|
struct xTCP_SERVER;
|
||||||
#endif
|
typedef struct xTCP_SERVER TCPServer_t;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
TCPServer_t * FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG * pxConfigs,
|
||||||
} /* extern "C" */
|
BaseType_t xCount );
|
||||||
#endif
|
void FreeRTOS_TCPServerWork( TCPServer_t * pxServer,
|
||||||
|
TickType_t xBlockingTime );
|
||||||
#endif /* FREERTOS_TCP_SERVER_H */
|
|
||||||
|
#if ( ipconfigSUPPORT_SIGNALS != 0 )
|
||||||
|
|
||||||
|
/* FreeRTOS_TCPServerWork() calls select().
|
||||||
|
* The two functions below provide a possibility to interrupt
|
||||||
|
* the call to select(). After the interruption, resume
|
||||||
|
* by calling FreeRTOS_TCPServerWork() again. */
|
||||||
|
BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t * pxServer );
|
||||||
|
BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t * pxServer,
|
||||||
|
BaseType_t * pxHigherPriorityTaskWoken );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* FREERTOS_TCP_SERVER_H */
|
||||||
|
|
|
@ -1,185 +1,201 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS+TCP V2.0.3
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://aws.amazon.com/freertos
|
* https://www.FreeRTOS.org
|
||||||
* https://www.FreeRTOS.org
|
* https://github.com/FreeRTOS
|
||||||
*/
|
*
|
||||||
|
*/
|
||||||
/*
|
|
||||||
Some code which is common to TCP servers like HTTP and FTP
|
/*
|
||||||
*/
|
* Some code which is common to TCP servers like HTTP and FTP
|
||||||
|
*/
|
||||||
#ifndef FREERTOS_SERVER_PRIVATE_H
|
|
||||||
#define FREERTOS_SERVER_PRIVATE_H
|
#ifndef FREERTOS_SERVER_PRIVATE_H
|
||||||
|
#define FREERTOS_SERVER_PRIVATE_H
|
||||||
#define FREERTOS_NO_SOCKET NULL
|
|
||||||
|
#define FREERTOS_NO_SOCKET NULL
|
||||||
/* FreeRTOS+FAT */
|
|
||||||
#include "ff_stdio.h"
|
/* FreeRTOS+FAT */
|
||||||
|
#include "ff_stdio.h"
|
||||||
/* Each HTTP server has 1, at most 2 sockets */
|
|
||||||
#define HTTP_SOCKET_COUNT 2
|
/* Each HTTP server has 1, at most 2 sockets */
|
||||||
|
#define HTTP_SOCKET_COUNT 2
|
||||||
/*
|
|
||||||
* ipconfigTCP_COMMAND_BUFFER_SIZE sets the size of:
|
/*
|
||||||
* pcCommandBuffer': a buffer to receive and send TCP commands
|
* ipconfigTCP_COMMAND_BUFFER_SIZE sets the size of:
|
||||||
*
|
* pcCommandBuffer': a buffer to receive and send TCP commands
|
||||||
* ipconfigTCP_FILE_BUFFER_SIZE sets the size of:
|
*
|
||||||
* pcFileBuffer' : a buffer to access the file system: read or write data.
|
* ipconfigTCP_FILE_BUFFER_SIZE sets the size of:
|
||||||
*
|
* pcFileBuffer' : a buffer to access the file system: read or write data.
|
||||||
* The buffers are both used for FTP as well as HTTP.
|
*
|
||||||
*/
|
* The buffers are both used for FTP as well as HTTP.
|
||||||
|
*/
|
||||||
#ifndef ipconfigTCP_COMMAND_BUFFER_SIZE
|
|
||||||
#define ipconfigTCP_COMMAND_BUFFER_SIZE ( 2048 )
|
#ifndef ipconfigTCP_COMMAND_BUFFER_SIZE
|
||||||
#endif
|
#define ipconfigTCP_COMMAND_BUFFER_SIZE ( 2048 )
|
||||||
|
#endif
|
||||||
#ifndef ipconfigTCP_FILE_BUFFER_SIZE
|
|
||||||
#define ipconfigTCP_FILE_BUFFER_SIZE ( 2048 )
|
#ifndef ipconfigTCP_FILE_BUFFER_SIZE
|
||||||
#endif
|
#define ipconfigTCP_FILE_BUFFER_SIZE ( 2048 )
|
||||||
|
#endif
|
||||||
struct xTCP_CLIENT;
|
|
||||||
|
struct xTCP_CLIENT;
|
||||||
typedef BaseType_t ( * FTCPWorkFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
|
|
||||||
typedef void ( * FTCPDeleteFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
|
typedef BaseType_t ( * FTCPWorkFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
|
||||||
|
typedef void ( * FTCPDeleteFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
|
||||||
#define TCP_CLIENT_FIELDS \
|
|
||||||
enum eSERVER_TYPE eType; \
|
#define TCP_CLIENT_FIELDS \
|
||||||
struct xTCP_SERVER *pxParent; \
|
enum eSERVER_TYPE eType; \
|
||||||
Socket_t xSocket; \
|
struct xTCP_SERVER * pxParent; \
|
||||||
const char *pcRootDir; \
|
Socket_t xSocket; \
|
||||||
FTCPWorkFunction fWorkFunction; \
|
const char * pcRootDir; \
|
||||||
FTCPDeleteFunction fDeleteFunction; \
|
FTCPWorkFunction fWorkFunction; \
|
||||||
struct xTCP_CLIENT *pxNextClient
|
FTCPDeleteFunction fDeleteFunction; \
|
||||||
|
struct xTCP_CLIENT * pxNextClient
|
||||||
typedef struct xTCP_CLIENT
|
|
||||||
{
|
typedef struct xTCP_CLIENT
|
||||||
/* This define contains fields which must come first within each of the client structs */
|
{
|
||||||
TCP_CLIENT_FIELDS;
|
/* This define contains fields which must come first within each of the client structs */
|
||||||
/* --- Keep at the top --- */
|
TCP_CLIENT_FIELDS;
|
||||||
|
/* --- Keep at the top --- */
|
||||||
} TCPClient_t;
|
} TCPClient_t;
|
||||||
|
|
||||||
struct xHTTP_CLIENT
|
struct xHTTP_CLIENT
|
||||||
{
|
{
|
||||||
/* This define contains fields which must come first within each of the client structs */
|
/* This define contains fields which must come first within each of the client structs */
|
||||||
TCP_CLIENT_FIELDS;
|
TCP_CLIENT_FIELDS;
|
||||||
/* --- Keep at the top --- */
|
/* --- Keep at the top --- */
|
||||||
|
|
||||||
const char *pcUrlData;
|
const char * pcUrlData;
|
||||||
const char *pcRestData;
|
const char * pcRestData;
|
||||||
char pcCurrentFilename[ ffconfigMAX_FILENAME ];
|
char pcCurrentFilename[ ffconfigMAX_FILENAME ];
|
||||||
size_t uxBytesLeft;
|
size_t uxBytesLeft;
|
||||||
FF_FILE *pxFileHandle;
|
FF_FILE * pxFileHandle;
|
||||||
union {
|
union
|
||||||
struct {
|
{
|
||||||
uint32_t
|
struct
|
||||||
bReplySent : 1;
|
{
|
||||||
};
|
uint32_t
|
||||||
uint32_t ulFlags;
|
bReplySent : 1;
|
||||||
} bits;
|
};
|
||||||
};
|
uint32_t ulFlags;
|
||||||
|
}
|
||||||
typedef struct xHTTP_CLIENT HTTPClient_t;
|
bits;
|
||||||
|
};
|
||||||
struct xFTP_CLIENT
|
|
||||||
{
|
typedef struct xHTTP_CLIENT HTTPClient_t;
|
||||||
/* This define contains fields which must come first within each of the client structs */
|
|
||||||
TCP_CLIENT_FIELDS;
|
struct xFTP_CLIENT
|
||||||
/* --- Keep at the top --- */
|
{
|
||||||
|
/* This define contains fields which must come first within each of the client structs */
|
||||||
uint32_t ulRestartOffset;
|
TCP_CLIENT_FIELDS;
|
||||||
uint32_t ulRecvBytes;
|
/* --- Keep at the top --- */
|
||||||
size_t uxBytesLeft; /* Bytes left to send */
|
|
||||||
uint32_t ulClientIP;
|
uint32_t ulRestartOffset;
|
||||||
TickType_t xStartTime;
|
uint32_t ulRecvBytes;
|
||||||
uint16_t usClientPort;
|
size_t uxBytesLeft; /* Bytes left to send */
|
||||||
Socket_t xTransferSocket;
|
uint32_t ulClientIP;
|
||||||
BaseType_t xTransType;
|
TickType_t xStartTime;
|
||||||
BaseType_t xDirCount;
|
uint16_t usClientPort;
|
||||||
FF_FindData_t xFindData;
|
Socket_t xTransferSocket;
|
||||||
FF_FILE *pxReadHandle;
|
BaseType_t xTransType;
|
||||||
FF_FILE *pxWriteHandle;
|
BaseType_t xDirCount;
|
||||||
char pcCurrentDir[ ffconfigMAX_FILENAME ];
|
FF_FindData_t xFindData;
|
||||||
char pcFileName[ ffconfigMAX_FILENAME ];
|
FF_FILE * pxReadHandle;
|
||||||
char pcConnectionAck[ 128 ];
|
FF_FILE * pxWriteHandle;
|
||||||
char pcClientAck[ 128 ];
|
char pcCurrentDir[ ffconfigMAX_FILENAME ];
|
||||||
union {
|
char pcFileName[ ffconfigMAX_FILENAME ];
|
||||||
struct {
|
char pcConnectionAck[ 128 ];
|
||||||
uint32_t
|
char pcClientAck[ 128 ];
|
||||||
bHelloSent : 1,
|
union
|
||||||
bLoggedIn : 1,
|
{
|
||||||
bStatusUser : 1,
|
struct
|
||||||
bInRename : 1,
|
{
|
||||||
bReadOnly : 1;
|
uint32_t
|
||||||
};
|
bHelloSent : 1,
|
||||||
uint32_t ulFTPFlags;
|
bLoggedIn : 1,
|
||||||
} bits;
|
bStatusUser : 1,
|
||||||
union {
|
bInRename : 1,
|
||||||
struct {
|
bReadOnly : 1;
|
||||||
uint32_t
|
};
|
||||||
bIsListen : 1, /* pdTRUE for passive data connections (using list()). */
|
uint32_t ulFTPFlags;
|
||||||
bDirHasEntry : 1, /* pdTRUE if ff_findfirst() was successful. */
|
}
|
||||||
bClientConnected : 1, /* pdTRUE after connect() or accept() has succeeded. */
|
bits;
|
||||||
bEmptyFile : 1, /* pdTRUE if a connection-without-data was received. */
|
union
|
||||||
bHadError : 1; /* pdTRUE if a transfer got aborted because of an error. */
|
{
|
||||||
};
|
struct
|
||||||
uint32_t ulConnFlags;
|
{
|
||||||
} bits1;
|
uint32_t
|
||||||
};
|
bIsListen : 1, /* pdTRUE for passive data connections (using list()). */
|
||||||
|
bDirHasEntry : 1, /* pdTRUE if ff_findfirst() was successful. */
|
||||||
typedef struct xFTP_CLIENT FTPClient_t;
|
bClientConnected : 1, /* pdTRUE after connect() or accept() has succeeded. */
|
||||||
|
bEmptyFile : 1, /* pdTRUE if a connection-without-data was received. */
|
||||||
BaseType_t xHTTPClientWork( TCPClient_t *pxClient );
|
bHadError : 1; /* pdTRUE if a transfer got aborted because of an error. */
|
||||||
BaseType_t xFTPClientWork( TCPClient_t *pxClient );
|
};
|
||||||
|
uint32_t ulConnFlags;
|
||||||
void vHTTPClientDelete( TCPClient_t *pxClient );
|
}
|
||||||
void vFTPClientDelete( TCPClient_t *pxClient );
|
bits1;
|
||||||
|
};
|
||||||
BaseType_t xMakeAbsolute( struct xFTP_CLIENT *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName );
|
|
||||||
BaseType_t xMakeRelative( FTPClient_t *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName );
|
typedef struct xFTP_CLIENT FTPClient_t;
|
||||||
|
|
||||||
struct xTCP_SERVER
|
BaseType_t xHTTPClientWork( TCPClient_t * pxClient );
|
||||||
{
|
BaseType_t xFTPClientWork( TCPClient_t * pxClient );
|
||||||
SocketSet_t xSocketSet;
|
|
||||||
/* A buffer to receive and send TCP commands, either HTTP of FTP. */
|
void vHTTPClientDelete( TCPClient_t * pxClient );
|
||||||
char pcCommandBuffer[ ipconfigTCP_COMMAND_BUFFER_SIZE ];
|
void vFTPClientDelete( TCPClient_t * pxClient );
|
||||||
/* A buffer to access the file system: read or write data. */
|
|
||||||
char pcFileBuffer[ ipconfigTCP_FILE_BUFFER_SIZE ];
|
BaseType_t xMakeAbsolute( struct xFTP_CLIENT * pxClient,
|
||||||
|
char * pcBuffer,
|
||||||
#if( ipconfigUSE_FTP != 0 )
|
BaseType_t xBufferLength,
|
||||||
char pcNewDir[ ffconfigMAX_FILENAME ];
|
const char * pcFileName );
|
||||||
#endif
|
BaseType_t xMakeRelative( FTPClient_t * pxClient,
|
||||||
#if( ipconfigUSE_HTTP != 0 )
|
char * pcBuffer,
|
||||||
char pcContentsType[40]; /* Space for the msg: "text/javascript" */
|
BaseType_t xBufferLength,
|
||||||
char pcExtraContents[40]; /* Space for the msg: "Content-Length: 346500" */
|
const char * pcFileName );
|
||||||
#endif
|
|
||||||
BaseType_t xServerCount;
|
struct xTCP_SERVER
|
||||||
TCPClient_t *pxClients;
|
{
|
||||||
struct xSERVER
|
SocketSet_t xSocketSet;
|
||||||
{
|
/* A buffer to receive and send TCP commands, either HTTP of FTP. */
|
||||||
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
|
char pcCommandBuffer[ ipconfigTCP_COMMAND_BUFFER_SIZE ];
|
||||||
const char *pcRootDir;
|
/* A buffer to access the file system: read or write data. */
|
||||||
Socket_t xSocket;
|
char pcFileBuffer[ ipconfigTCP_FILE_BUFFER_SIZE ];
|
||||||
} xServers[ 1 ];
|
|
||||||
};
|
#if ( ipconfigUSE_FTP != 0 )
|
||||||
|
char pcNewDir[ ffconfigMAX_FILENAME ];
|
||||||
#endif /* FREERTOS_SERVER_PRIVATE_H */
|
#endif
|
||||||
|
#if ( ipconfigUSE_HTTP != 0 )
|
||||||
|
char pcContentsType[ 40 ]; /* Space for the msg: "text/javascript" */
|
||||||
|
char pcExtraContents[ 40 ]; /* Space for the msg: "Content-Length: 346500" */
|
||||||
|
#endif
|
||||||
|
BaseType_t xServerCount;
|
||||||
|
TCPClient_t * pxClients;
|
||||||
|
struct xSERVER
|
||||||
|
{
|
||||||
|
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
|
||||||
|
const char * pcRootDir;
|
||||||
|
Socket_t xSocket;
|
||||||
|
}
|
||||||
|
xServers[ 1 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* FREERTOS_SERVER_PRIVATE_H */
|
||||||
|
|
|
@ -1,71 +1,98 @@
|
||||||
//
|
/*
|
||||||
// ntpClient.h
|
* FreeRTOS V202212.00
|
||||||
//
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
#ifndef __NTPCLIENT_H__
|
* 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
|
||||||
#define __NTPCLIENT_H__
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
#define NTP_PORT 123
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
typedef uint32_t quint32;
|
*
|
||||||
typedef int32_t qint32;
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
typedef uint8_t quint8;
|
* copies or substantial portions of the Software.
|
||||||
typedef int8_t qint8;
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
typedef union _SNtpFlags SNtpFlags;
|
* 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
|
||||||
* 64-bit NTP timestamp.
|
* 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.
|
||||||
struct __attribute__ ((__packed__)) _SNtpTimestamp {
|
*
|
||||||
/** Number of seconds passed since Jan 1 1900, in big-endian format. */
|
* https://www.FreeRTOS.org
|
||||||
quint32 seconds;
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
/** Fractional time part, in <tt>1/0xFFFFFFFF</tt>s of a second. */
|
*/
|
||||||
quint32 fraction;
|
|
||||||
};
|
/* ntpClient.h */
|
||||||
|
|
||||||
typedef struct _SNtpTimestamp SNtpTimestamp;
|
#ifndef __NTPCLIENT_H__
|
||||||
/**
|
|
||||||
* Mandatory part of an NTP packet
|
#define __NTPCLIENT_H__
|
||||||
*/
|
|
||||||
struct SNtpPacket {
|
#define NTP_PORT 123
|
||||||
/** Flags. */
|
|
||||||
unsigned char flags; // value 0xDB : mode 3 (client), version 3, leap indicator unknown 3
|
typedef uint32_t quint32;
|
||||||
|
typedef int32_t qint32;
|
||||||
/** Stratum of the clock. */
|
typedef uint8_t quint8;
|
||||||
quint8 stratum; // value 0 : unspecified
|
typedef int8_t qint8;
|
||||||
|
|
||||||
/** Maximum interval between successive messages, in log2 seconds. Note that the value is signed. */
|
typedef union _SNtpFlags SNtpFlags;
|
||||||
qint8 poll; // 10 means 1 << 10 = 1024 seconds
|
|
||||||
|
/**
|
||||||
/** Precision of the clock, in log2 seconds. Note that the value is signed. */
|
* 64-bit NTP timestamp.
|
||||||
qint8 precision; // 0xFA = 250 = 0.015625 seconds
|
*/
|
||||||
|
struct __attribute__( ( __packed__ ) ) _SNtpTimestamp
|
||||||
/** Round trip time to the primary reference source, in NTP short format. */
|
{
|
||||||
qint32 rootDelay; // 0x5D2E = 23854 or (23854/65535)= 0.3640 sec
|
/** Number of seconds passed since Jan 1 1900, in big-endian format. */
|
||||||
|
quint32 seconds;
|
||||||
/** Nominal error relative to the primary reference source. */
|
|
||||||
qint32 rootDispersion; // 0x0008 CAC8 = 8.7912 seconds
|
/** Fractional time part, in <tt>1/0xFFFFFFFF</tt>s of a second. */
|
||||||
|
quint32 fraction;
|
||||||
/** Reference identifier (either a 4 character string or an IP address). */
|
};
|
||||||
qint8 referenceID[4]; // or just 0000
|
|
||||||
|
typedef struct _SNtpTimestamp SNtpTimestamp;
|
||||||
/** The time at which the clock was last set or corrected. */
|
|
||||||
SNtpTimestamp referenceTimestamp; // Current time
|
/**
|
||||||
|
* Mandatory part of an NTP packet
|
||||||
/** The time at which the request departed the client for the server. */
|
*/
|
||||||
SNtpTimestamp originateTimestamp; // Keep 0
|
struct SNtpPacket
|
||||||
|
{
|
||||||
/** The time at which the request arrived at the server. */
|
/** Flags. */
|
||||||
SNtpTimestamp receiveTimestamp; // Keep 0
|
unsigned char flags; /* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */
|
||||||
|
|
||||||
/** The time at which the reply departed the server for client. */
|
/** Stratum of the clock. */
|
||||||
SNtpTimestamp transmitTimestamp;
|
quint8 stratum; /* value 0 : unspecified */
|
||||||
};
|
|
||||||
|
/** Maximum interval between successive messages, in log2 seconds. Note that the value is signed. */
|
||||||
/* Add this number to get secs since 1-1-1900 */
|
qint8 poll; /* 10 means 1 << 10 = 1024 seconds */
|
||||||
#define TIME1970 2208988800UL
|
|
||||||
|
/** Precision of the clock, in log2 seconds. Note that the value is signed. */
|
||||||
#endif // __NTPCLIENT_H__
|
qint8 precision; /* 0xFA = 250 = 0.015625 seconds */
|
||||||
|
|
||||||
|
/** Round trip time to the primary reference source, in NTP short format. */
|
||||||
|
qint32 rootDelay; /* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */
|
||||||
|
|
||||||
|
/** Nominal error relative to the primary reference source. */
|
||||||
|
qint32 rootDispersion; /* 0x0008 CAC8 = 8.7912 seconds */
|
||||||
|
|
||||||
|
/** Reference identifier (either a 4 character string or an IP address). */
|
||||||
|
qint8 referenceID[ 4 ]; /* or just 0000 */
|
||||||
|
|
||||||
|
/** The time at which the clock was last set or corrected. */
|
||||||
|
SNtpTimestamp referenceTimestamp; /* Current time */
|
||||||
|
|
||||||
|
/** The time at which the request departed the client for the server. */
|
||||||
|
SNtpTimestamp originateTimestamp; /* Keep 0 */
|
||||||
|
|
||||||
|
/** The time at which the request arrived at the server. */
|
||||||
|
SNtpTimestamp receiveTimestamp; /* Keep 0 */
|
||||||
|
|
||||||
|
/** The time at which the reply departed the server for client. */
|
||||||
|
SNtpTimestamp transmitTimestamp;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Add this number to get secs since 1-1-1900 */
|
||||||
|
#define TIME1970 2208988800UL
|
||||||
|
|
||||||
|
#endif // __NTPCLIENT_H__
|
||||||
|
|
|
@ -1,11 +1,34 @@
|
||||||
/*
|
/*
|
||||||
* A simple demo for NTP using FreeRTOS+TCP
|
* FreeRTOS V202212.00
|
||||||
*/
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
#ifndef NTPDEMO_H
|
* 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
|
||||||
#define NTPDEMO_H
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority );
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
#endif
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* https://www.FreeRTOS.org
|
||||||
|
* https://github.com/FreeRTOS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NTPDEMO_H
|
||||||
|
|
||||||
|
#define NTPDEMO_H
|
||||||
|
|
||||||
|
void vStartNTPTask( uint16_t usTaskStackSize,
|
||||||
|
UBaseType_t uxTaskPriority );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,479 +1,507 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org/cli
|
* https://www.FreeRTOS.org/cli
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/* FreeRTOS+CLI includes. */
|
/* FreeRTOS+CLI includes. */
|
||||||
#include "FreeRTOS_CLI.h"
|
#include "FreeRTOS_CLI.h"
|
||||||
|
|
||||||
#ifndef configINCLUDE_TRACE_RELATED_CLI_COMMANDS
|
#ifndef configINCLUDE_TRACE_RELATED_CLI_COMMANDS
|
||||||
#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0
|
#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef configINCLUDE_QUERY_HEAP_COMMAND
|
#ifndef configINCLUDE_QUERY_HEAP_COMMAND
|
||||||
#define configINCLUDE_QUERY_HEAP_COMMAND 0
|
#define configINCLUDE_QUERY_HEAP_COMMAND 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The function that registers the commands that are defined within this file.
|
* The function that registers the commands that are defined within this file.
|
||||||
*/
|
*/
|
||||||
void vRegisterSampleCLICommands( void );
|
void vRegisterSampleCLICommands( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Implements the task-stats command.
|
* Implements the task-stats command.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
static BaseType_t prvTaskStatsCommand( char * pcWriteBuffer,
|
||||||
|
size_t xWriteBufferLen,
|
||||||
/*
|
const char * pcCommandString );
|
||||||
* Implements the run-time-stats command.
|
|
||||||
*/
|
/*
|
||||||
#if( configGENERATE_RUN_TIME_STATS == 1 )
|
* Implements the run-time-stats command.
|
||||||
static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
*/
|
||||||
#endif /* configGENERATE_RUN_TIME_STATS */
|
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
||||||
|
static BaseType_t prvRunTimeStatsCommand( char * pcWriteBuffer,
|
||||||
/*
|
size_t xWriteBufferLen,
|
||||||
* Implements the echo-three-parameters command.
|
const char * pcCommandString );
|
||||||
*/
|
#endif /* configGENERATE_RUN_TIME_STATS */
|
||||||
static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
|
||||||
|
/*
|
||||||
/*
|
* Implements the echo-three-parameters command.
|
||||||
* Implements the echo-parameters command.
|
*/
|
||||||
*/
|
static BaseType_t prvThreeParameterEchoCommand( char * pcWriteBuffer,
|
||||||
static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
size_t xWriteBufferLen,
|
||||||
|
const char * pcCommandString );
|
||||||
/*
|
|
||||||
* Implements the "query heap" command.
|
/*
|
||||||
*/
|
* Implements the echo-parameters command.
|
||||||
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
*/
|
||||||
static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
static BaseType_t prvParameterEchoCommand( char * pcWriteBuffer,
|
||||||
#endif
|
size_t xWriteBufferLen,
|
||||||
|
const char * pcCommandString );
|
||||||
/*
|
|
||||||
* Implements the "trace start" and "trace stop" commands;
|
/*
|
||||||
*/
|
* Implements the "query heap" command.
|
||||||
#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
|
*/
|
||||||
static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
#if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
||||||
#endif
|
static BaseType_t prvQueryHeapCommand( char * pcWriteBuffer,
|
||||||
|
size_t xWriteBufferLen,
|
||||||
/* Structure that defines the "task-stats" command line command. This generates
|
const char * pcCommandString );
|
||||||
a table that gives information on each task in the system. */
|
#endif
|
||||||
static const CLI_Command_Definition_t xTaskStats =
|
|
||||||
{
|
/*
|
||||||
"task-stats", /* The command string to type. */
|
* Implements the "trace start" and "trace stop" commands;
|
||||||
"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n",
|
*/
|
||||||
prvTaskStatsCommand, /* The function to run. */
|
#if ( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
|
||||||
0 /* No parameters are expected. */
|
static BaseType_t prvStartStopTraceCommand( char * pcWriteBuffer,
|
||||||
};
|
size_t xWriteBufferLen,
|
||||||
|
const char * pcCommandString );
|
||||||
/* Structure that defines the "echo_3_parameters" command line command. This
|
#endif
|
||||||
takes exactly three parameters that the command simply echos back one at a
|
|
||||||
time. */
|
/* Structure that defines the "task-stats" command line command. This generates
|
||||||
static const CLI_Command_Definition_t xThreeParameterEcho =
|
* a table that gives information on each task in the system. */
|
||||||
{
|
static const CLI_Command_Definition_t xTaskStats =
|
||||||
"echo-3-parameters",
|
{
|
||||||
"\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n",
|
"task-stats", /* The command string to type. */
|
||||||
prvThreeParameterEchoCommand, /* The function to run. */
|
"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n",
|
||||||
3 /* Three parameters are expected, which can take any value. */
|
prvTaskStatsCommand, /* The function to run. */
|
||||||
};
|
0 /* No parameters are expected. */
|
||||||
|
};
|
||||||
/* Structure that defines the "echo_parameters" command line command. This
|
|
||||||
takes a variable number of parameters that the command simply echos back one at
|
/* Structure that defines the "echo_3_parameters" command line command. This
|
||||||
a time. */
|
* takes exactly three parameters that the command simply echos back one at a
|
||||||
static const CLI_Command_Definition_t xParameterEcho =
|
* time. */
|
||||||
{
|
static const CLI_Command_Definition_t xThreeParameterEcho =
|
||||||
"echo-parameters",
|
{
|
||||||
"\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n",
|
"echo-3-parameters",
|
||||||
prvParameterEchoCommand, /* The function to run. */
|
"\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n",
|
||||||
-1 /* The user can enter any number of commands. */
|
prvThreeParameterEchoCommand, /* The function to run. */
|
||||||
};
|
3 /* Three parameters are expected, which can take any value. */
|
||||||
|
};
|
||||||
#if( configGENERATE_RUN_TIME_STATS == 1 )
|
|
||||||
/* Structure that defines the "run-time-stats" command line command. This
|
/* Structure that defines the "echo_parameters" command line command. This
|
||||||
generates a table that shows how much run time each task has */
|
* takes a variable number of parameters that the command simply echos back one at
|
||||||
static const CLI_Command_Definition_t xRunTimeStats =
|
* a time. */
|
||||||
{
|
static const CLI_Command_Definition_t xParameterEcho =
|
||||||
"run-time-stats", /* The command string to type. */
|
{
|
||||||
"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n",
|
"echo-parameters",
|
||||||
prvRunTimeStatsCommand, /* The function to run. */
|
"\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n",
|
||||||
0 /* No parameters are expected. */
|
prvParameterEchoCommand, /* The function to run. */
|
||||||
};
|
-1 /* The user can enter any number of commands. */
|
||||||
#endif /* configGENERATE_RUN_TIME_STATS */
|
};
|
||||||
|
|
||||||
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
||||||
/* Structure that defines the "query_heap" command line command. */
|
|
||||||
static const CLI_Command_Definition_t xQueryHeap =
|
/* Structure that defines the "run-time-stats" command line command. This
|
||||||
{
|
* generates a table that shows how much run time each task has */
|
||||||
"query-heap",
|
static const CLI_Command_Definition_t xRunTimeStats =
|
||||||
"\r\nquery-heap:\r\n Displays the free heap space, and minimum ever free heap space.\r\n",
|
{
|
||||||
prvQueryHeapCommand, /* The function to run. */
|
"run-time-stats", /* The command string to type. */
|
||||||
0 /* The user can enter any number of commands. */
|
"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n",
|
||||||
};
|
prvRunTimeStatsCommand, /* The function to run. */
|
||||||
#endif /* configQUERY_HEAP_COMMAND */
|
0 /* No parameters are expected. */
|
||||||
|
};
|
||||||
#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
|
#endif /* configGENERATE_RUN_TIME_STATS */
|
||||||
/* Structure that defines the "trace" command line command. This takes a single
|
|
||||||
parameter, which can be either "start" or "stop". */
|
#if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
||||||
static const CLI_Command_Definition_t xStartStopTrace =
|
/* Structure that defines the "query_heap" command line command. */
|
||||||
{
|
static const CLI_Command_Definition_t xQueryHeap =
|
||||||
"trace",
|
{
|
||||||
"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n",
|
"query-heap",
|
||||||
prvStartStopTraceCommand, /* The function to run. */
|
"\r\nquery-heap:\r\n Displays the free heap space, and minimum ever free heap space.\r\n",
|
||||||
1 /* One parameter is expected. Valid values are "start" and "stop". */
|
prvQueryHeapCommand, /* The function to run. */
|
||||||
};
|
0 /* The user can enter any number of commands. */
|
||||||
#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */
|
};
|
||||||
|
#endif /* configQUERY_HEAP_COMMAND */
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
|
||||||
void vRegisterSampleCLICommands( void )
|
|
||||||
{
|
/* Structure that defines the "trace" command line command. This takes a single
|
||||||
/* Register all the command line commands defined immediately above. */
|
* parameter, which can be either "start" or "stop". */
|
||||||
FreeRTOS_CLIRegisterCommand( &xTaskStats );
|
static const CLI_Command_Definition_t xStartStopTrace =
|
||||||
FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );
|
{
|
||||||
FreeRTOS_CLIRegisterCommand( &xParameterEcho );
|
"trace",
|
||||||
|
"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n",
|
||||||
#if( configGENERATE_RUN_TIME_STATS == 1 )
|
prvStartStopTraceCommand, /* The function to run. */
|
||||||
{
|
1 /* One parameter is expected. Valid values are "start" and "stop". */
|
||||||
FreeRTOS_CLIRegisterCommand( &xRunTimeStats );
|
};
|
||||||
}
|
#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */
|
||||||
#endif
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
|
||||||
{
|
void vRegisterSampleCLICommands( void )
|
||||||
FreeRTOS_CLIRegisterCommand( &xQueryHeap );
|
{
|
||||||
}
|
/* Register all the command line commands defined immediately above. */
|
||||||
#endif
|
FreeRTOS_CLIRegisterCommand( &xTaskStats );
|
||||||
|
FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );
|
||||||
#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
|
FreeRTOS_CLIRegisterCommand( &xParameterEcho );
|
||||||
{
|
|
||||||
FreeRTOS_CLIRegisterCommand( &xStartStopTrace );
|
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
||||||
}
|
{
|
||||||
#endif
|
FreeRTOS_CLIRegisterCommand( &xRunTimeStats );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
#endif
|
||||||
|
|
||||||
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
#if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
||||||
{
|
{
|
||||||
const char *const pcHeader = " State Priority Stack #\r\n************************************************\r\n";
|
FreeRTOS_CLIRegisterCommand( &xQueryHeap );
|
||||||
BaseType_t xSpacePadding;
|
}
|
||||||
|
#endif
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
#if ( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
{
|
||||||
( void ) pcCommandString;
|
FreeRTOS_CLIRegisterCommand( &xStartStopTrace );
|
||||||
( void ) xWriteBufferLen;
|
}
|
||||||
configASSERT( pcWriteBuffer );
|
#endif
|
||||||
|
}
|
||||||
/* Generate a table of task stats. */
|
/*-----------------------------------------------------------*/
|
||||||
strcpy( pcWriteBuffer, "Task" );
|
|
||||||
pcWriteBuffer += strlen( pcWriteBuffer );
|
static BaseType_t prvTaskStatsCommand( char * pcWriteBuffer,
|
||||||
|
size_t xWriteBufferLen,
|
||||||
/* Minus three for the null terminator and half the number of characters in
|
const char * pcCommandString )
|
||||||
"Task" so the column lines up with the centre of the heading. */
|
{
|
||||||
configASSERT( configMAX_TASK_NAME_LEN > 3 );
|
const char * const pcHeader = " State Priority Stack #\r\n************************************************\r\n";
|
||||||
for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ )
|
BaseType_t xSpacePadding;
|
||||||
{
|
|
||||||
/* Add a space to align columns after the task's name. */
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
*pcWriteBuffer = ' ';
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
pcWriteBuffer++;
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
|
( void ) pcCommandString;
|
||||||
/* Ensure always terminated. */
|
( void ) xWriteBufferLen;
|
||||||
*pcWriteBuffer = 0x00;
|
configASSERT( pcWriteBuffer );
|
||||||
}
|
|
||||||
strcpy( pcWriteBuffer, pcHeader );
|
/* Generate a table of task stats. */
|
||||||
vTaskList( pcWriteBuffer + strlen( pcHeader ) );
|
strcpy( pcWriteBuffer, "Task" );
|
||||||
|
pcWriteBuffer += strlen( pcWriteBuffer );
|
||||||
/* There is no more data to return after this single string, so return
|
|
||||||
pdFALSE. */
|
/* Minus three for the null terminator and half the number of characters in
|
||||||
return pdFALSE;
|
* "Task" so the column lines up with the centre of the heading. */
|
||||||
}
|
configASSERT( configMAX_TASK_NAME_LEN > 3 );
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ )
|
||||||
#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
{
|
||||||
|
/* Add a space to align columns after the task's name. */
|
||||||
static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
*pcWriteBuffer = ' ';
|
||||||
{
|
pcWriteBuffer++;
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
/* Ensure always terminated. */
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
*pcWriteBuffer = 0x00;
|
||||||
( void ) pcCommandString;
|
}
|
||||||
( void ) xWriteBufferLen;
|
|
||||||
configASSERT( pcWriteBuffer );
|
strcpy( pcWriteBuffer, pcHeader );
|
||||||
|
vTaskList( pcWriteBuffer + strlen( pcHeader ) );
|
||||||
sprintf( pcWriteBuffer, "Current free heap %d bytes, minimum ever free heap %d bytes\r\n", ( int ) xPortGetFreeHeapSize(), ( int ) xPortGetMinimumEverFreeHeapSize() );
|
|
||||||
|
/* There is no more data to return after this single string, so return
|
||||||
/* There is no more data to return after this single string, so return
|
* pdFALSE. */
|
||||||
pdFALSE. */
|
return pdFALSE;
|
||||||
return pdFALSE;
|
}
|
||||||
}
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#endif /* configINCLUDE_QUERY_HEAP */
|
#if ( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
static BaseType_t prvQueryHeapCommand( char * pcWriteBuffer,
|
||||||
#if( configGENERATE_RUN_TIME_STATS == 1 )
|
size_t xWriteBufferLen,
|
||||||
|
const char * pcCommandString )
|
||||||
static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
{
|
||||||
{
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
const char * const pcHeader = " Abs Time % Time\r\n****************************************\r\n";
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
BaseType_t xSpacePadding;
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
|
( void ) pcCommandString;
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
( void ) xWriteBufferLen;
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
configASSERT( pcWriteBuffer );
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
|
||||||
( void ) pcCommandString;
|
sprintf( pcWriteBuffer, "Current free heap %d bytes, minimum ever free heap %d bytes\r\n", ( int ) xPortGetFreeHeapSize(), ( int ) xPortGetMinimumEverFreeHeapSize() );
|
||||||
( void ) xWriteBufferLen;
|
|
||||||
configASSERT( pcWriteBuffer );
|
/* There is no more data to return after this single string, so return
|
||||||
|
* pdFALSE. */
|
||||||
/* Generate a table of task stats. */
|
return pdFALSE;
|
||||||
strcpy( pcWriteBuffer, "Task" );
|
}
|
||||||
pcWriteBuffer += strlen( pcWriteBuffer );
|
|
||||||
|
#endif /* configINCLUDE_QUERY_HEAP */
|
||||||
/* Pad the string "task" with however many bytes necessary to make it the
|
/*-----------------------------------------------------------*/
|
||||||
length of a task name. Minus three for the null terminator and half the
|
|
||||||
number of characters in "Task" so the column lines up with the centre of
|
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
||||||
the heading. */
|
|
||||||
for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ )
|
static BaseType_t prvRunTimeStatsCommand( char * pcWriteBuffer,
|
||||||
{
|
size_t xWriteBufferLen,
|
||||||
/* Add a space to align columns after the task's name. */
|
const char * pcCommandString )
|
||||||
*pcWriteBuffer = ' ';
|
{
|
||||||
pcWriteBuffer++;
|
const char * const pcHeader = " Abs Time % Time\r\n****************************************\r\n";
|
||||||
|
BaseType_t xSpacePadding;
|
||||||
/* Ensure always terminated. */
|
|
||||||
*pcWriteBuffer = 0x00;
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
}
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
strcpy( pcWriteBuffer, pcHeader );
|
( void ) pcCommandString;
|
||||||
vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );
|
( void ) xWriteBufferLen;
|
||||||
|
configASSERT( pcWriteBuffer );
|
||||||
/* There is no more data to return after this single string, so return
|
|
||||||
pdFALSE. */
|
/* Generate a table of task stats. */
|
||||||
return pdFALSE;
|
strcpy( pcWriteBuffer, "Task" );
|
||||||
}
|
pcWriteBuffer += strlen( pcWriteBuffer );
|
||||||
|
|
||||||
#endif /* configGENERATE_RUN_TIME_STATS */
|
/* Pad the string "task" with however many bytes necessary to make it the
|
||||||
/*-----------------------------------------------------------*/
|
* length of a task name. Minus three for the null terminator and half the
|
||||||
|
* number of characters in "Task" so the column lines up with the centre of
|
||||||
static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
* the heading. */
|
||||||
{
|
for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ )
|
||||||
const char *pcParameter;
|
{
|
||||||
BaseType_t xParameterStringLength, xReturn;
|
/* Add a space to align columns after the task's name. */
|
||||||
static UBaseType_t uxParameterNumber = 0;
|
*pcWriteBuffer = ' ';
|
||||||
|
pcWriteBuffer++;
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
/* Ensure always terminated. */
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
*pcWriteBuffer = 0x00;
|
||||||
( void ) pcCommandString;
|
}
|
||||||
( void ) xWriteBufferLen;
|
|
||||||
configASSERT( pcWriteBuffer );
|
strcpy( pcWriteBuffer, pcHeader );
|
||||||
|
vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );
|
||||||
if( uxParameterNumber == 0 )
|
|
||||||
{
|
/* There is no more data to return after this single string, so return
|
||||||
/* The first time the function is called after the command has been
|
* pdFALSE. */
|
||||||
entered just a header string is returned. */
|
return pdFALSE;
|
||||||
sprintf( pcWriteBuffer, "The three parameters were:\r\n" );
|
}
|
||||||
|
|
||||||
/* Next time the function is called the first parameter will be echoed
|
#endif /* configGENERATE_RUN_TIME_STATS */
|
||||||
back. */
|
/*-----------------------------------------------------------*/
|
||||||
uxParameterNumber = 1U;
|
|
||||||
|
static BaseType_t prvThreeParameterEchoCommand( char * pcWriteBuffer,
|
||||||
/* There is more data to be returned as no parameters have been echoed
|
size_t xWriteBufferLen,
|
||||||
back yet. */
|
const char * pcCommandString )
|
||||||
xReturn = pdPASS;
|
{
|
||||||
}
|
const char * pcParameter;
|
||||||
else
|
BaseType_t xParameterStringLength, xReturn;
|
||||||
{
|
static UBaseType_t uxParameterNumber = 0;
|
||||||
/* Obtain the parameter string. */
|
|
||||||
pcParameter = FreeRTOS_CLIGetParameter
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
(
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
pcCommandString, /* The command string itself. */
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
uxParameterNumber, /* Return the next parameter. */
|
( void ) pcCommandString;
|
||||||
&xParameterStringLength /* Store the parameter string length. */
|
( void ) xWriteBufferLen;
|
||||||
);
|
configASSERT( pcWriteBuffer );
|
||||||
|
|
||||||
/* Sanity check something was returned. */
|
if( uxParameterNumber == 0 )
|
||||||
configASSERT( pcParameter );
|
{
|
||||||
|
/* The first time the function is called after the command has been
|
||||||
/* Return the parameter string. */
|
* entered just a header string is returned. */
|
||||||
memset( pcWriteBuffer, 0x00, xWriteBufferLen );
|
sprintf( pcWriteBuffer, "The three parameters were:\r\n" );
|
||||||
sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber );
|
|
||||||
strncat( pcWriteBuffer, pcParameter, ( size_t ) xParameterStringLength );
|
/* Next time the function is called the first parameter will be echoed
|
||||||
strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
|
* back. */
|
||||||
|
uxParameterNumber = 1U;
|
||||||
/* If this is the last of the three parameters then there are no more
|
|
||||||
strings to return after this one. */
|
/* There is more data to be returned as no parameters have been echoed
|
||||||
if( uxParameterNumber == 3U )
|
* back yet. */
|
||||||
{
|
xReturn = pdPASS;
|
||||||
/* If this is the last of the three parameters then there are no more
|
}
|
||||||
strings to return after this one. */
|
else
|
||||||
xReturn = pdFALSE;
|
{
|
||||||
uxParameterNumber = 0;
|
/* Obtain the parameter string. */
|
||||||
}
|
pcParameter = FreeRTOS_CLIGetParameter
|
||||||
else
|
(
|
||||||
{
|
pcCommandString, /* The command string itself. */
|
||||||
/* There are more parameters to return after this one. */
|
uxParameterNumber, /* Return the next parameter. */
|
||||||
xReturn = pdTRUE;
|
&xParameterStringLength /* Store the parameter string length. */
|
||||||
uxParameterNumber++;
|
);
|
||||||
}
|
|
||||||
}
|
/* Sanity check something was returned. */
|
||||||
|
configASSERT( pcParameter );
|
||||||
return xReturn;
|
|
||||||
}
|
/* Return the parameter string. */
|
||||||
/*-----------------------------------------------------------*/
|
memset( pcWriteBuffer, 0x00, xWriteBufferLen );
|
||||||
|
sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber );
|
||||||
static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
strncat( pcWriteBuffer, pcParameter, ( size_t ) xParameterStringLength );
|
||||||
{
|
strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
|
||||||
const char *pcParameter;
|
|
||||||
BaseType_t xParameterStringLength, xReturn;
|
/* If this is the last of the three parameters then there are no more
|
||||||
static UBaseType_t uxParameterNumber = 0;
|
* strings to return after this one. */
|
||||||
|
if( uxParameterNumber == 3U )
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
{
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
/* If this is the last of the three parameters then there are no more
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
* strings to return after this one. */
|
||||||
( void ) pcCommandString;
|
xReturn = pdFALSE;
|
||||||
( void ) xWriteBufferLen;
|
uxParameterNumber = 0;
|
||||||
configASSERT( pcWriteBuffer );
|
}
|
||||||
|
else
|
||||||
if( uxParameterNumber == 0 )
|
{
|
||||||
{
|
/* There are more parameters to return after this one. */
|
||||||
/* The first time the function is called after the command has been
|
xReturn = pdTRUE;
|
||||||
entered just a header string is returned. */
|
uxParameterNumber++;
|
||||||
sprintf( pcWriteBuffer, "The parameters were:\r\n" );
|
}
|
||||||
|
}
|
||||||
/* Next time the function is called the first parameter will be echoed
|
|
||||||
back. */
|
return xReturn;
|
||||||
uxParameterNumber = 1U;
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
/* There is more data to be returned as no parameters have been echoed
|
|
||||||
back yet. */
|
static BaseType_t prvParameterEchoCommand( char * pcWriteBuffer,
|
||||||
xReturn = pdPASS;
|
size_t xWriteBufferLen,
|
||||||
}
|
const char * pcCommandString )
|
||||||
else
|
{
|
||||||
{
|
const char * pcParameter;
|
||||||
/* Obtain the parameter string. */
|
BaseType_t xParameterStringLength, xReturn;
|
||||||
pcParameter = FreeRTOS_CLIGetParameter
|
static UBaseType_t uxParameterNumber = 0;
|
||||||
(
|
|
||||||
pcCommandString, /* The command string itself. */
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
uxParameterNumber, /* Return the next parameter. */
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
&xParameterStringLength /* Store the parameter string length. */
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
);
|
( void ) pcCommandString;
|
||||||
|
( void ) xWriteBufferLen;
|
||||||
if( pcParameter != NULL )
|
configASSERT( pcWriteBuffer );
|
||||||
{
|
|
||||||
/* Return the parameter string. */
|
if( uxParameterNumber == 0 )
|
||||||
memset( pcWriteBuffer, 0x00, xWriteBufferLen );
|
{
|
||||||
sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber );
|
/* The first time the function is called after the command has been
|
||||||
strncat( pcWriteBuffer, ( char * ) pcParameter, ( size_t ) xParameterStringLength );
|
* entered just a header string is returned. */
|
||||||
strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
|
sprintf( pcWriteBuffer, "The parameters were:\r\n" );
|
||||||
|
|
||||||
/* There might be more parameters to return after this one. */
|
/* Next time the function is called the first parameter will be echoed
|
||||||
xReturn = pdTRUE;
|
* back. */
|
||||||
uxParameterNumber++;
|
uxParameterNumber = 1U;
|
||||||
}
|
|
||||||
else
|
/* There is more data to be returned as no parameters have been echoed
|
||||||
{
|
* back yet. */
|
||||||
/* No more parameters were found. Make sure the write buffer does
|
xReturn = pdPASS;
|
||||||
not contain a valid string. */
|
}
|
||||||
pcWriteBuffer[ 0 ] = 0x00;
|
else
|
||||||
|
{
|
||||||
/* No more data to return. */
|
/* Obtain the parameter string. */
|
||||||
xReturn = pdFALSE;
|
pcParameter = FreeRTOS_CLIGetParameter
|
||||||
|
(
|
||||||
/* Start over the next time this command is executed. */
|
pcCommandString, /* The command string itself. */
|
||||||
uxParameterNumber = 0;
|
uxParameterNumber, /* Return the next parameter. */
|
||||||
}
|
&xParameterStringLength /* Store the parameter string length. */
|
||||||
}
|
);
|
||||||
|
|
||||||
return xReturn;
|
if( pcParameter != NULL )
|
||||||
}
|
{
|
||||||
/*-----------------------------------------------------------*/
|
/* Return the parameter string. */
|
||||||
|
memset( pcWriteBuffer, 0x00, xWriteBufferLen );
|
||||||
#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
|
sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber );
|
||||||
|
strncat( pcWriteBuffer, ( char * ) pcParameter, ( size_t ) xParameterStringLength );
|
||||||
static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
|
||||||
{
|
|
||||||
const char *pcParameter;
|
/* There might be more parameters to return after this one. */
|
||||||
BaseType_t lParameterStringLength;
|
xReturn = pdTRUE;
|
||||||
|
uxParameterNumber++;
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
}
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
else
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
{
|
||||||
( void ) pcCommandString;
|
/* No more parameters were found. Make sure the write buffer does
|
||||||
( void ) xWriteBufferLen;
|
* not contain a valid string. */
|
||||||
configASSERT( pcWriteBuffer );
|
pcWriteBuffer[ 0 ] = 0x00;
|
||||||
|
|
||||||
/* Obtain the parameter string. */
|
/* No more data to return. */
|
||||||
pcParameter = FreeRTOS_CLIGetParameter
|
xReturn = pdFALSE;
|
||||||
(
|
|
||||||
pcCommandString, /* The command string itself. */
|
/* Start over the next time this command is executed. */
|
||||||
1, /* Return the first parameter. */
|
uxParameterNumber = 0;
|
||||||
&lParameterStringLength /* Store the parameter string length. */
|
}
|
||||||
);
|
}
|
||||||
|
|
||||||
/* Sanity check something was returned. */
|
return xReturn;
|
||||||
configASSERT( pcParameter );
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
/* There are only two valid parameter values. */
|
|
||||||
if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )
|
#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
|
||||||
{
|
|
||||||
/* Start or restart the trace. */
|
static BaseType_t prvStartStopTraceCommand( char * pcWriteBuffer,
|
||||||
vTraceStop();
|
size_t xWriteBufferLen,
|
||||||
vTraceClear();
|
const char * pcCommandString )
|
||||||
vTraceStart();
|
{
|
||||||
|
const char * pcParameter;
|
||||||
sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );
|
BaseType_t lParameterStringLength;
|
||||||
}
|
|
||||||
else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
{
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
/* End the trace, if one is running. */
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
vTraceStop();
|
( void ) pcCommandString;
|
||||||
sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );
|
( void ) xWriteBufferLen;
|
||||||
}
|
configASSERT( pcWriteBuffer );
|
||||||
else
|
|
||||||
{
|
/* Obtain the parameter string. */
|
||||||
sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );
|
pcParameter = FreeRTOS_CLIGetParameter
|
||||||
}
|
(
|
||||||
|
pcCommandString, /* The command string itself. */
|
||||||
/* There is no more data to return after this single string, so return
|
1, /* Return the first parameter. */
|
||||||
pdFALSE. */
|
&lParameterStringLength /* Store the parameter string length. */
|
||||||
return pdFALSE;
|
);
|
||||||
}
|
|
||||||
|
/* Sanity check something was returned. */
|
||||||
#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */
|
configASSERT( pcParameter );
|
||||||
|
|
||||||
|
/* There are only two valid parameter values. */
|
||||||
|
if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )
|
||||||
|
{
|
||||||
|
/* Start or restart the trace. */
|
||||||
|
vTraceStop();
|
||||||
|
vTraceClear();
|
||||||
|
vTraceStart();
|
||||||
|
|
||||||
|
sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );
|
||||||
|
}
|
||||||
|
else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )
|
||||||
|
{
|
||||||
|
/* End the trace, if one is running. */
|
||||||
|
vTraceStop();
|
||||||
|
sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* There is no more data to return after this single string, so return
|
||||||
|
* pdFALSE. */
|
||||||
|
return pdFALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */
|
||||||
|
|
|
@ -1,225 +1,227 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: This file uses a third party USB CDC driver.
|
* NOTE: This file uses a third party USB CDC driver.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "semphr.h"
|
#include "semphr.h"
|
||||||
|
|
||||||
/* Example includes. */
|
/* Example includes. */
|
||||||
#include "FreeRTOS_CLI.h"
|
#include "FreeRTOS_CLI.h"
|
||||||
|
|
||||||
/* Demo application includes. */
|
/* Demo application includes. */
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
|
||||||
/* Dimensions the buffer into which input characters are placed. */
|
/* Dimensions the buffer into which input characters are placed. */
|
||||||
#define cmdMAX_INPUT_SIZE 50
|
#define cmdMAX_INPUT_SIZE 50
|
||||||
|
|
||||||
/* Dimentions a buffer to be used by the UART driver, if the UART driver uses a
|
/* Dimensions a buffer to be used by the UART driver, if the UART driver uses a
|
||||||
buffer at all. */
|
* buffer at all. */
|
||||||
#define cmdQUEUE_LENGTH 25
|
#define cmdQUEUE_LENGTH 25
|
||||||
|
|
||||||
/* DEL acts as a backspace. */
|
/* DEL acts as a backspace. */
|
||||||
#define cmdASCII_DEL ( 0x7F )
|
#define cmdASCII_DEL ( 0x7F )
|
||||||
|
|
||||||
/* The maximum time to wait for the mutex that guards the UART to become
|
/* The maximum time to wait for the mutex that guards the UART to become
|
||||||
available. */
|
* available. */
|
||||||
#define cmdMAX_MUTEX_WAIT pdMS_TO_TICKS( 300 )
|
#define cmdMAX_MUTEX_WAIT pdMS_TO_TICKS( 300 )
|
||||||
|
|
||||||
#ifndef configCLI_BAUD_RATE
|
#ifndef configCLI_BAUD_RATE
|
||||||
#define configCLI_BAUD_RATE 115200
|
#define configCLI_BAUD_RATE 115200
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The task that implements the command console processing.
|
* The task that implements the command console processing.
|
||||||
*/
|
*/
|
||||||
static void prvUARTCommandConsoleTask( void *pvParameters );
|
static void prvUARTCommandConsoleTask( void * pvParameters );
|
||||||
void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority );
|
void vUARTCommandConsoleStart( uint16_t usStackSize,
|
||||||
|
UBaseType_t uxPriority );
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
/* Const messages output by the command console. */
|
|
||||||
static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";
|
/* Const messages output by the command console. */
|
||||||
static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";
|
static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";
|
||||||
static const char * const pcNewLine = "\r\n";
|
static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";
|
||||||
|
static const char * const pcNewLine = "\r\n";
|
||||||
/* Used to guard access to the UART in case messages are sent to the UART from
|
|
||||||
more than one task. */
|
/* Used to guard access to the UART in case messages are sent to the UART from
|
||||||
static SemaphoreHandle_t xTxMutex = NULL;
|
* more than one task. */
|
||||||
|
static SemaphoreHandle_t xTxMutex = NULL;
|
||||||
/* The handle to the UART port, which is not used by all ports. */
|
|
||||||
static xComPortHandle xPort = 0;
|
/* The handle to the UART port, which is not used by all ports. */
|
||||||
|
static xComPortHandle xPort = 0;
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority )
|
|
||||||
{
|
void vUARTCommandConsoleStart( uint16_t usStackSize,
|
||||||
/* Create the semaphore used to access the UART Tx. */
|
UBaseType_t uxPriority )
|
||||||
xTxMutex = xSemaphoreCreateMutex();
|
{
|
||||||
configASSERT( xTxMutex );
|
/* Create the semaphore used to access the UART Tx. */
|
||||||
|
xTxMutex = xSemaphoreCreateMutex();
|
||||||
/* Create that task that handles the console itself. */
|
configASSERT( xTxMutex );
|
||||||
xTaskCreate( prvUARTCommandConsoleTask, /* The task that implements the command console. */
|
|
||||||
"CLI", /* Text name assigned to the task. This is just to assist debugging. The kernel does not use this name itself. */
|
/* Create that task that handles the console itself. */
|
||||||
usStackSize, /* The size of the stack allocated to the task. */
|
xTaskCreate( prvUARTCommandConsoleTask, /* The task that implements the command console. */
|
||||||
NULL, /* The parameter is not used, so NULL is passed. */
|
"CLI", /* Text name assigned to the task. This is just to assist debugging. The kernel does not use this name itself. */
|
||||||
uxPriority, /* The priority allocated to the task. */
|
usStackSize, /* The size of the stack allocated to the task. */
|
||||||
NULL ); /* A handle is not required, so just pass NULL. */
|
NULL, /* The parameter is not used, so NULL is passed. */
|
||||||
}
|
uxPriority, /* The priority allocated to the task. */
|
||||||
/*-----------------------------------------------------------*/
|
NULL ); /* A handle is not required, so just pass NULL. */
|
||||||
|
}
|
||||||
static void prvUARTCommandConsoleTask( void *pvParameters )
|
/*-----------------------------------------------------------*/
|
||||||
{
|
|
||||||
signed char cRxedChar;
|
static void prvUARTCommandConsoleTask( void * pvParameters )
|
||||||
uint8_t ucInputIndex = 0;
|
{
|
||||||
char *pcOutputString;
|
signed char cRxedChar;
|
||||||
static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
|
uint8_t ucInputIndex = 0;
|
||||||
BaseType_t xReturned;
|
char * pcOutputString;
|
||||||
xComPortHandle xPort;
|
static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
|
||||||
|
BaseType_t xReturned;
|
||||||
( void ) pvParameters;
|
xComPortHandle xPort;
|
||||||
|
|
||||||
/* Obtain the address of the output buffer. Note there is no mutual
|
( void ) pvParameters;
|
||||||
exclusion on this buffer as it is assumed only one command console interface
|
|
||||||
will be used at any one time. */
|
/* Obtain the address of the output buffer. Note there is no mutual
|
||||||
pcOutputString = FreeRTOS_CLIGetOutputBuffer();
|
* exclusion on this buffer as it is assumed only one command console interface
|
||||||
|
* will be used at any one time. */
|
||||||
/* Initialise the UART. */
|
pcOutputString = FreeRTOS_CLIGetOutputBuffer();
|
||||||
xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );
|
|
||||||
|
/* Initialise the UART. */
|
||||||
/* Send the welcome message. */
|
xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );
|
||||||
vSerialPutString( xPort, ( signed char * ) pcWelcomeMessage, ( unsigned short ) strlen( pcWelcomeMessage ) );
|
|
||||||
|
/* Send the welcome message. */
|
||||||
for( ;; )
|
vSerialPutString( xPort, ( signed char * ) pcWelcomeMessage, ( unsigned short ) strlen( pcWelcomeMessage ) );
|
||||||
{
|
|
||||||
/* Wait for the next character. The while loop is used in case
|
for( ; ; )
|
||||||
INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will
|
{
|
||||||
be a genuine block time rather than an infinite block time. */
|
/* Wait for the next character. The while loop is used in case
|
||||||
while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS );
|
* INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will
|
||||||
|
* be a genuine block time rather than an infinite block time. */
|
||||||
/* Ensure exclusive access to the UART Tx. */
|
while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS )
|
||||||
if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
|
{
|
||||||
{
|
}
|
||||||
/* Echo the character back. */
|
|
||||||
xSerialPutChar( xPort, cRxedChar, portMAX_DELAY );
|
/* Ensure exclusive access to the UART Tx. */
|
||||||
|
if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
|
||||||
/* Was it the end of the line? */
|
{
|
||||||
if( cRxedChar == '\n' || cRxedChar == '\r' )
|
/* Echo the character back. */
|
||||||
{
|
xSerialPutChar( xPort, cRxedChar, portMAX_DELAY );
|
||||||
/* Just to space the output from the input. */
|
|
||||||
vSerialPutString( xPort, ( signed char * ) pcNewLine, ( unsigned short ) strlen( pcNewLine ) );
|
/* Was it the end of the line? */
|
||||||
|
if( ( cRxedChar == '\n' ) || ( cRxedChar == '\r' ) )
|
||||||
/* See if the command is empty, indicating that the last command
|
{
|
||||||
is to be executed again. */
|
/* Just to space the output from the input. */
|
||||||
if( ucInputIndex == 0 )
|
vSerialPutString( xPort, ( signed char * ) pcNewLine, ( unsigned short ) strlen( pcNewLine ) );
|
||||||
{
|
|
||||||
/* Copy the last command back into the input string. */
|
/* See if the command is empty, indicating that the last command
|
||||||
strcpy( cInputString, cLastInputString );
|
* is to be executed again. */
|
||||||
}
|
if( ucInputIndex == 0 )
|
||||||
|
{
|
||||||
/* Pass the received command to the command interpreter. The
|
/* Copy the last command back into the input string. */
|
||||||
command interpreter is called repeatedly until it returns
|
strcpy( cInputString, cLastInputString );
|
||||||
pdFALSE (indicating there is no more output) as it might
|
}
|
||||||
generate more than one string. */
|
|
||||||
do
|
/* Pass the received command to the command interpreter. The
|
||||||
{
|
* command interpreter is called repeatedly until it returns
|
||||||
/* Get the next output string from the command interpreter. */
|
* pdFALSE (indicating there is no more output) as it might
|
||||||
xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
|
* generate more than one string. */
|
||||||
|
do
|
||||||
/* Write the generated string to the UART. */
|
{
|
||||||
vSerialPutString( xPort, ( signed char * ) pcOutputString, ( unsigned short ) strlen( pcOutputString ) );
|
/* Get the next output string from the command interpreter. */
|
||||||
|
xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
|
||||||
} while( xReturned != pdFALSE );
|
|
||||||
|
/* Write the generated string to the UART. */
|
||||||
/* All the strings generated by the input command have been
|
vSerialPutString( xPort, ( signed char * ) pcOutputString, ( unsigned short ) strlen( pcOutputString ) );
|
||||||
sent. Clear the input string ready to receive the next command.
|
} while( xReturned != pdFALSE );
|
||||||
Remember the command that was just processed first in case it is
|
|
||||||
to be processed again. */
|
/* All the strings generated by the input command have been
|
||||||
strcpy( cLastInputString, cInputString );
|
* sent. Clear the input string ready to receive the next command.
|
||||||
ucInputIndex = 0;
|
* Remember the command that was just processed first in case it is
|
||||||
memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
|
* to be processed again. */
|
||||||
|
strcpy( cLastInputString, cInputString );
|
||||||
vSerialPutString( xPort, ( signed char * ) pcEndOfOutputMessage, ( unsigned short ) strlen( pcEndOfOutputMessage ) );
|
ucInputIndex = 0;
|
||||||
}
|
memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
|
||||||
else
|
|
||||||
{
|
vSerialPutString( xPort, ( signed char * ) pcEndOfOutputMessage, ( unsigned short ) strlen( pcEndOfOutputMessage ) );
|
||||||
if( cRxedChar == '\r' )
|
}
|
||||||
{
|
else
|
||||||
/* Ignore the character. */
|
{
|
||||||
}
|
if( cRxedChar == '\r' )
|
||||||
else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
|
{
|
||||||
{
|
/* Ignore the character. */
|
||||||
/* Backspace was pressed. Erase the last character in the
|
}
|
||||||
string - if any. */
|
else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
|
||||||
if( ucInputIndex > 0 )
|
{
|
||||||
{
|
/* Backspace was pressed. Erase the last character in the
|
||||||
ucInputIndex--;
|
* string - if any. */
|
||||||
cInputString[ ucInputIndex ] = '\0';
|
if( ucInputIndex > 0 )
|
||||||
}
|
{
|
||||||
}
|
ucInputIndex--;
|
||||||
else
|
cInputString[ ucInputIndex ] = '\0';
|
||||||
{
|
}
|
||||||
/* A character was entered. Add it to the string entered so
|
}
|
||||||
far. When a \n is entered the complete string will be
|
else
|
||||||
passed to the command interpreter. */
|
{
|
||||||
if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
|
/* A character was entered. Add it to the string entered so
|
||||||
{
|
* far. When a \n is entered the complete string will be
|
||||||
if( ucInputIndex < cmdMAX_INPUT_SIZE )
|
* passed to the command interpreter. */
|
||||||
{
|
if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
|
||||||
cInputString[ ucInputIndex ] = cRxedChar;
|
{
|
||||||
ucInputIndex++;
|
if( ucInputIndex < cmdMAX_INPUT_SIZE )
|
||||||
}
|
{
|
||||||
}
|
cInputString[ ucInputIndex ] = cRxedChar;
|
||||||
}
|
ucInputIndex++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* Must ensure to give the mutex back. */
|
}
|
||||||
xSemaphoreGive( xTxMutex );
|
}
|
||||||
}
|
|
||||||
}
|
/* Must ensure to give the mutex back. */
|
||||||
}
|
xSemaphoreGive( xTxMutex );
|
||||||
/*-----------------------------------------------------------*/
|
}
|
||||||
|
}
|
||||||
void vOutputString( const char * const pcMessage )
|
}
|
||||||
{
|
/*-----------------------------------------------------------*/
|
||||||
if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
|
|
||||||
{
|
void vOutputString( const char * const pcMessage )
|
||||||
vSerialPutString( xPort, ( signed char * ) pcMessage, ( unsigned short ) strlen( pcMessage ) );
|
{
|
||||||
xSemaphoreGive( xTxMutex );
|
if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
|
||||||
}
|
{
|
||||||
}
|
vSerialPutString( xPort, ( signed char * ) pcMessage, ( unsigned short ) strlen( pcMessage ) );
|
||||||
/*-----------------------------------------------------------*/
|
xSemaphoreGive( xTxMutex );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -1,328 +1,339 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://github.com/FreeRTOS
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* See the following URL for information on the commands defined in this file:
|
* See the following URL for information on the commands defined in this file:
|
||||||
* https://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml
|
* https://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* FreeRTOS+CLI includes. */
|
/* FreeRTOS+CLI includes. */
|
||||||
#include "FreeRTOS_CLI.h"
|
#include "FreeRTOS_CLI.h"
|
||||||
|
|
||||||
/* FreeRTOS+UDP includes, just to make the stats available to the CLI
|
/* FreeRTOS+UDP includes, just to make the stats available to the CLI
|
||||||
commands. */
|
* commands. */
|
||||||
#include "FreeRTOS_UDP_IP.h"
|
#include "FreeRTOS_UDP_IP.h"
|
||||||
#include "FreeRTOS_Sockets.h"
|
#include "FreeRTOS_Sockets.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defines a command that prints out IP address information.
|
* Defines a command that prints out IP address information.
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
static BaseType_t prvDisplayIPConfig( char * pcWriteBuffer,
|
||||||
|
size_t xWriteBufferLen,
|
||||||
/*
|
const char * pcCommandString );
|
||||||
* Defines a command that prints out the gathered demo debug stats.
|
|
||||||
*/
|
/*
|
||||||
static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
* Defines a command that prints out the gathered demo debug stats.
|
||||||
|
*/
|
||||||
/*
|
static BaseType_t prvDisplayIPDebugStats( char * pcWriteBuffer,
|
||||||
* Defines a command that sends an ICMP ping request to an IP address.
|
size_t xWriteBufferLen,
|
||||||
*/
|
const char * pcCommandString );
|
||||||
static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
|
|
||||||
|
/*
|
||||||
/* Structure that defines the "ip-config" command line command. */
|
* Defines a command that sends an ICMP ping request to an IP address.
|
||||||
static const CLI_Command_Definition_t xIPConfig =
|
*/
|
||||||
{
|
static BaseType_t prvPingCommand( char * pcWriteBuffer,
|
||||||
"ip-config",
|
size_t xWriteBufferLen,
|
||||||
"ip-config:\r\n Displays IP address configuration\r\n\r\n",
|
const char * pcCommandString );
|
||||||
prvDisplayIPConfig,
|
|
||||||
0
|
/* Structure that defines the "ip-config" command line command. */
|
||||||
};
|
static const CLI_Command_Definition_t xIPConfig =
|
||||||
|
{
|
||||||
#if configINCLUDE_DEMO_DEBUG_STATS != 0
|
"ip-config",
|
||||||
/* Structure that defines the "ip-debug-stats" command line command. */
|
"ip-config:\r\n Displays IP address configuration\r\n\r\n",
|
||||||
static const CLI_Command_Definition_t xIPDebugStats =
|
prvDisplayIPConfig,
|
||||||
{
|
0
|
||||||
"ip-debug-stats", /* The command string to type. */
|
};
|
||||||
"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n",
|
|
||||||
prvDisplayIPDebugStats, /* The function to run. */
|
#if configINCLUDE_DEMO_DEBUG_STATS != 0
|
||||||
0 /* No parameters are expected. */
|
/* Structure that defines the "ip-debug-stats" command line command. */
|
||||||
};
|
static const CLI_Command_Definition_t xIPDebugStats =
|
||||||
#endif /* configINCLUDE_DEMO_DEBUG_STATS */
|
{
|
||||||
|
"ip-debug-stats", /* The command string to type. */
|
||||||
#if ipconfigSUPPORT_OUTGOING_PINGS == 1
|
"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n",
|
||||||
|
prvDisplayIPDebugStats, /* The function to run. */
|
||||||
/* Structure that defines the "ping" command line command. This takes an IP
|
0 /* No parameters are expected. */
|
||||||
address or host name and (optionally) the number of bytes to ping as
|
};
|
||||||
parameters. */
|
#endif /* configINCLUDE_DEMO_DEBUG_STATS */
|
||||||
static const CLI_Command_Definition_t xPing =
|
|
||||||
{
|
#if ipconfigSUPPORT_OUTGOING_PINGS == 1
|
||||||
"ping",
|
|
||||||
"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n",
|
/* Structure that defines the "ping" command line command. This takes an IP
|
||||||
prvPingCommand, /* The function to run. */
|
* address or host name and (optionally) the number of bytes to ping as
|
||||||
-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */
|
* parameters. */
|
||||||
};
|
static const CLI_Command_Definition_t xPing =
|
||||||
|
{
|
||||||
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
|
"ping",
|
||||||
|
"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n",
|
||||||
|
prvPingCommand, /* The function to run. */
|
||||||
/*-----------------------------------------------------------*/
|
-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */
|
||||||
|
};
|
||||||
void vRegisterUDPCLICommands( void )
|
|
||||||
{
|
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
|
||||||
/* Register all the command line commands defined immediately above. */
|
|
||||||
FreeRTOS_CLIRegisterCommand( &xIPConfig );
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
#if configINCLUDE_DEMO_DEBUG_STATS == 1
|
|
||||||
{
|
void vRegisterUDPCLICommands( void )
|
||||||
FreeRTOS_CLIRegisterCommand( &xIPDebugStats );
|
{
|
||||||
}
|
/* Register all the command line commands defined immediately above. */
|
||||||
#endif /* configINCLUDE_DEMO_DEBUG_STATS */
|
FreeRTOS_CLIRegisterCommand( &xIPConfig );
|
||||||
|
|
||||||
#if ipconfigSUPPORT_OUTGOING_PINGS == 1
|
#if configINCLUDE_DEMO_DEBUG_STATS == 1
|
||||||
{
|
{
|
||||||
FreeRTOS_CLIRegisterCommand( &xPing );
|
FreeRTOS_CLIRegisterCommand( &xIPDebugStats );
|
||||||
}
|
}
|
||||||
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
|
#endif /* configINCLUDE_DEMO_DEBUG_STATS */
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
#if ipconfigSUPPORT_OUTGOING_PINGS == 1
|
||||||
|
{
|
||||||
#if ipconfigSUPPORT_OUTGOING_PINGS == 1
|
FreeRTOS_CLIRegisterCommand( &xPing );
|
||||||
|
}
|
||||||
static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
|
||||||
{
|
}
|
||||||
char * pcParameter;
|
/*-----------------------------------------------------------*/
|
||||||
BaseType_t lParameterStringLength, xReturn;
|
|
||||||
uint32_t ulIPAddress, ulBytesToPing;
|
#if ipconfigSUPPORT_OUTGOING_PINGS == 1
|
||||||
const uint32_t ulDefaultBytesToPing = 8UL;
|
|
||||||
char cBuffer[ 16 ];
|
static BaseType_t prvPingCommand( char * pcWriteBuffer,
|
||||||
|
size_t xWriteBufferLen,
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
const char * pcCommandString )
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
{
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
char * pcParameter;
|
||||||
( void ) pcCommandString;
|
BaseType_t lParameterStringLength, xReturn;
|
||||||
( void ) xWriteBufferLen;
|
uint32_t ulIPAddress, ulBytesToPing;
|
||||||
configASSERT( pcWriteBuffer );
|
const uint32_t ulDefaultBytesToPing = 8UL;
|
||||||
|
char cBuffer[ 16 ];
|
||||||
/* Start with an empty string. */
|
|
||||||
pcWriteBuffer[ 0 ] = 0x00;
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
/* Obtain the number of bytes to ping. */
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
pcParameter = ( char * ) FreeRTOS_CLIGetParameter
|
( void ) pcCommandString;
|
||||||
(
|
( void ) xWriteBufferLen;
|
||||||
pcCommandString, /* The command string itself. */
|
configASSERT( pcWriteBuffer );
|
||||||
2, /* Return the second parameter. */
|
|
||||||
&lParameterStringLength /* Store the parameter string length. */
|
/* Start with an empty string. */
|
||||||
);
|
pcWriteBuffer[ 0 ] = 0x00;
|
||||||
|
|
||||||
if( pcParameter == NULL )
|
/* Obtain the number of bytes to ping. */
|
||||||
{
|
pcParameter = ( char * ) FreeRTOS_CLIGetParameter
|
||||||
/* The number of bytes was not specified, so default it. */
|
(
|
||||||
ulBytesToPing = ulDefaultBytesToPing;
|
pcCommandString, /* The command string itself. */
|
||||||
}
|
2, /* Return the second parameter. */
|
||||||
else
|
&lParameterStringLength /* Store the parameter string length. */
|
||||||
{
|
);
|
||||||
ulBytesToPing = atol( pcParameter );
|
|
||||||
}
|
if( pcParameter == NULL )
|
||||||
|
{
|
||||||
/* Obtain the IP address string. */
|
/* The number of bytes was not specified, so default it. */
|
||||||
pcParameter = ( char * ) FreeRTOS_CLIGetParameter
|
ulBytesToPing = ulDefaultBytesToPing;
|
||||||
(
|
}
|
||||||
pcCommandString, /* The command string itself. */
|
else
|
||||||
1, /* Return the first parameter. */
|
{
|
||||||
&lParameterStringLength /* Store the parameter string length. */
|
ulBytesToPing = atol( pcParameter );
|
||||||
);
|
}
|
||||||
|
|
||||||
/* Sanity check something was returned. */
|
/* Obtain the IP address string. */
|
||||||
configASSERT( pcParameter );
|
pcParameter = ( char * ) FreeRTOS_CLIGetParameter
|
||||||
|
(
|
||||||
/* Attempt to obtain the IP address. If the first character is not a
|
pcCommandString, /* The command string itself. */
|
||||||
digit, assume the host name has been passed in. */
|
1, /* Return the first parameter. */
|
||||||
if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) )
|
&lParameterStringLength /* Store the parameter string length. */
|
||||||
{
|
);
|
||||||
ulIPAddress = FreeRTOS_inet_addr( pcParameter );
|
|
||||||
}
|
/* Sanity check something was returned. */
|
||||||
else
|
configASSERT( pcParameter );
|
||||||
{
|
|
||||||
/* Terminate the host name. */
|
/* Attempt to obtain the IP address. If the first character is not a
|
||||||
pcParameter[ lParameterStringLength ] = 0x00;
|
* digit, assume the host name has been passed in. */
|
||||||
|
if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) )
|
||||||
/* Attempt to resolve host. */
|
{
|
||||||
ulIPAddress = FreeRTOS_gethostbyname( pcParameter );
|
ulIPAddress = FreeRTOS_inet_addr( pcParameter );
|
||||||
}
|
}
|
||||||
|
else
|
||||||
/* Convert IP address, which may have come from a DNS lookup, to string. */
|
{
|
||||||
FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );
|
/* Terminate the host name. */
|
||||||
|
pcParameter[ lParameterStringLength ] = 0x00;
|
||||||
if( ulIPAddress != 0 )
|
|
||||||
{
|
/* Attempt to resolve host. */
|
||||||
xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY );
|
ulIPAddress = FreeRTOS_gethostbyname( pcParameter );
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
/* Convert IP address, which may have come from a DNS lookup, to string. */
|
||||||
xReturn = pdFALSE;
|
FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );
|
||||||
}
|
|
||||||
|
if( ulIPAddress != 0 )
|
||||||
if( xReturn == pdFALSE )
|
{
|
||||||
{
|
xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY );
|
||||||
sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" );
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
xReturn = pdFALSE;
|
||||||
sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, ( int ) xReturn );
|
}
|
||||||
}
|
|
||||||
|
if( xReturn == pdFALSE )
|
||||||
return pdFALSE;
|
{
|
||||||
}
|
sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" );
|
||||||
/*-----------------------------------------------------------*/
|
}
|
||||||
|
else
|
||||||
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
|
{
|
||||||
|
sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, ( int ) xReturn );
|
||||||
#if configINCLUDE_DEMO_DEBUG_STATS != 0
|
}
|
||||||
|
|
||||||
static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
return pdFALSE;
|
||||||
{
|
}
|
||||||
static BaseType_t xIndex = -1;
|
/*-----------------------------------------------------------*/
|
||||||
extern xExampleDebugStatEntry_t xIPTraceValues[];
|
|
||||||
BaseType_t xReturn;
|
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
|
||||||
|
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
#if configINCLUDE_DEMO_DEBUG_STATS != 0
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
static BaseType_t prvDisplayIPDebugStats( char * pcWriteBuffer,
|
||||||
( void ) pcCommandString;
|
size_t xWriteBufferLen,
|
||||||
( void ) xWriteBufferLen;
|
const char * pcCommandString )
|
||||||
configASSERT( pcWriteBuffer );
|
{
|
||||||
|
static BaseType_t xIndex = -1;
|
||||||
xIndex++;
|
extern xExampleDebugStatEntry_t xIPTraceValues[];
|
||||||
|
BaseType_t xReturn;
|
||||||
if( xIndex < xExampleDebugStatEntries() )
|
|
||||||
{
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
sprintf( pcWriteBuffer, "%s %d\r\n", ( char * ) xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData );
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
xReturn = pdPASS;
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
}
|
( void ) pcCommandString;
|
||||||
else
|
( void ) xWriteBufferLen;
|
||||||
{
|
configASSERT( pcWriteBuffer );
|
||||||
/* Reset the index for the next time it is called. */
|
|
||||||
xIndex = -1;
|
xIndex++;
|
||||||
|
|
||||||
/* Ensure nothing remains in the write buffer. */
|
if( xIndex < xExampleDebugStatEntries() )
|
||||||
pcWriteBuffer[ 0 ] = 0x00;
|
{
|
||||||
xReturn = pdFALSE;
|
sprintf( pcWriteBuffer, "%s %d\r\n", ( char * ) xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData );
|
||||||
}
|
xReturn = pdPASS;
|
||||||
|
}
|
||||||
return xReturn;
|
else
|
||||||
}
|
{
|
||||||
/*-----------------------------------------------------------*/
|
/* Reset the index for the next time it is called. */
|
||||||
|
xIndex = -1;
|
||||||
#endif /* configINCLUDE_DEMO_DEBUG_STATS */
|
|
||||||
|
/* Ensure nothing remains in the write buffer. */
|
||||||
static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
|
pcWriteBuffer[ 0 ] = 0x00;
|
||||||
{
|
xReturn = pdFALSE;
|
||||||
static BaseType_t xIndex = 0;
|
}
|
||||||
BaseType_t xReturn;
|
|
||||||
uint32_t ulAddress;
|
return xReturn;
|
||||||
|
}
|
||||||
/* Remove compile time warnings about unused parameters, and check the
|
/*-----------------------------------------------------------*/
|
||||||
write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
|
||||||
write buffer length is adequate, so does not check for buffer overflows. */
|
#endif /* configINCLUDE_DEMO_DEBUG_STATS */
|
||||||
( void ) pcCommandString;
|
|
||||||
( void ) xWriteBufferLen;
|
static BaseType_t prvDisplayIPConfig( char * pcWriteBuffer,
|
||||||
configASSERT( pcWriteBuffer );
|
size_t xWriteBufferLen,
|
||||||
|
const char * pcCommandString )
|
||||||
switch( xIndex )
|
{
|
||||||
{
|
static BaseType_t xIndex = 0;
|
||||||
case 0 :
|
BaseType_t xReturn;
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
uint32_t ulAddress;
|
||||||
FreeRTOS_GetEndPointConfiguration( &ulAddress, NULL, NULL, NULL, pxNetworkEndPoints );
|
|
||||||
#else
|
/* Remove compile time warnings about unused parameters, and check the
|
||||||
FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL );
|
* write buffer is not NULL. NOTE - for simplicity, this example assumes the
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
* write buffer length is adequate, so does not check for buffer overflows. */
|
||||||
sprintf( pcWriteBuffer, "\r\nIP address " );
|
( void ) pcCommandString;
|
||||||
xReturn = pdTRUE;
|
( void ) xWriteBufferLen;
|
||||||
xIndex++;
|
configASSERT( pcWriteBuffer );
|
||||||
break;
|
|
||||||
|
switch( xIndex )
|
||||||
case 1 :
|
{
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
case 0:
|
||||||
FreeRTOS_GetEndPointConfiguration( NULL, &ulAddress, NULL, NULL, pxNetworkEndPoints );
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
#else
|
FreeRTOS_GetEndPointConfiguration( &ulAddress, NULL, NULL, NULL, pxNetworkEndPoints );
|
||||||
FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL );
|
#else
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL );
|
||||||
sprintf( pcWriteBuffer, "\r\nNet mask " );
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
xReturn = pdTRUE;
|
sprintf( pcWriteBuffer, "\r\nIP address " );
|
||||||
xIndex++;
|
xReturn = pdTRUE;
|
||||||
break;
|
xIndex++;
|
||||||
|
break;
|
||||||
case 2 :
|
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
case 1:
|
||||||
FreeRTOS_GetEndPointConfiguration( NULL, NULL, &ulAddress, NULL, pxNetworkEndPoints );
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
#else
|
FreeRTOS_GetEndPointConfiguration( NULL, &ulAddress, NULL, NULL, pxNetworkEndPoints );
|
||||||
FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL );
|
#else
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL );
|
||||||
sprintf( pcWriteBuffer, "\r\nGateway address " );
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
xReturn = pdTRUE;
|
sprintf( pcWriteBuffer, "\r\nNet mask " );
|
||||||
xIndex++;
|
xReturn = pdTRUE;
|
||||||
break;
|
xIndex++;
|
||||||
|
break;
|
||||||
case 3 :
|
|
||||||
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
case 2:
|
||||||
FreeRTOS_GetEndPointConfiguration( NULL, NULL, NULL, &ulAddress, pxNetworkEndPoints );
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
#else
|
FreeRTOS_GetEndPointConfiguration( NULL, NULL, &ulAddress, NULL, pxNetworkEndPoints );
|
||||||
FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress );
|
#else
|
||||||
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL );
|
||||||
sprintf( pcWriteBuffer, "\r\nDNS server address " );
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
xReturn = pdTRUE;
|
sprintf( pcWriteBuffer, "\r\nGateway address " );
|
||||||
xIndex++;
|
xReturn = pdTRUE;
|
||||||
break;
|
xIndex++;
|
||||||
|
break;
|
||||||
default :
|
|
||||||
ulAddress = 0;
|
case 3:
|
||||||
sprintf( pcWriteBuffer, "\r\n\r\n" );
|
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
|
||||||
xReturn = pdFALSE;
|
FreeRTOS_GetEndPointConfiguration( NULL, NULL, NULL, &ulAddress, pxNetworkEndPoints );
|
||||||
xIndex = 0;
|
#else
|
||||||
break;
|
FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress );
|
||||||
}
|
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
|
||||||
|
sprintf( pcWriteBuffer, "\r\nDNS server address " );
|
||||||
if( ulAddress != 0 )
|
xReturn = pdTRUE;
|
||||||
{
|
xIndex++;
|
||||||
FreeRTOS_inet_ntoa( ulAddress, ( &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ) );
|
break;
|
||||||
}
|
|
||||||
|
default:
|
||||||
return xReturn;
|
ulAddress = 0;
|
||||||
}
|
sprintf( pcWriteBuffer, "\r\n\r\n" );
|
||||||
/*-----------------------------------------------------------*/
|
xReturn = pdFALSE;
|
||||||
|
xIndex = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ulAddress != 0 )
|
||||||
|
{
|
||||||
|
FreeRTOS_inet_ntoa( ulAddress, ( &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xReturn;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -1,320 +1,316 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* See the URL in the comments within main.c for the location of the online
|
* See the URL in the comments within main.c for the location of the online
|
||||||
* documentation.
|
* documentation.
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/* FreeRTOS includes. */
|
/* FreeRTOS includes. */
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
|
|
||||||
/* File system includes. */
|
/* File system includes. */
|
||||||
#include "fat_sl.h"
|
#include "fat_sl.h"
|
||||||
#include "api_mdriver_ram.h"
|
#include "api_mdriver_ram.h"
|
||||||
|
|
||||||
/* 8.3 format, plus null terminator. */
|
/* 8.3 format, plus null terminator. */
|
||||||
#define fsMAX_FILE_NAME_LEN 13
|
#define fsMAX_FILE_NAME_LEN 13
|
||||||
|
|
||||||
/* The number of bytes read/written to the example files at a time. */
|
/* The number of bytes read/written to the example files at a time. */
|
||||||
#define fsRAM_BUFFER_SIZE 200
|
#define fsRAM_BUFFER_SIZE 200
|
||||||
|
|
||||||
/* The number of bytes written to the file that uses f_putc() and f_getc(). */
|
/* The number of bytes written to the file that uses f_putc() and f_getc(). */
|
||||||
#define fsPUTC_FILE_SIZE 100
|
#define fsPUTC_FILE_SIZE 100
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Creates and verifies different files on the volume, demonstrating the use of
|
* Creates and verifies different files on the volume, demonstrating the use of
|
||||||
* various different API functions.
|
* various different API functions.
|
||||||
*/
|
*/
|
||||||
void vCreateAndVerifySampleFiles( void );
|
void vCreateAndVerifySampleFiles( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a set of example files in the root directory of the volume using
|
* Create a set of example files in the root directory of the volume using
|
||||||
* f_write().
|
* f_write().
|
||||||
*/
|
*/
|
||||||
static void prvCreateDemoFilesUsing_f_write( void );
|
static void prvCreateDemoFilesUsing_f_write( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use f_read() to read back and verify the files that were created by
|
* Use f_read() to read back and verify the files that were created by
|
||||||
* prvCreateDemoFilesUsing_f_write().
|
* prvCreateDemoFilesUsing_f_write().
|
||||||
*/
|
*/
|
||||||
static void prvVerifyDemoFileUsing_f_read( void );
|
static void prvVerifyDemoFileUsing_f_read( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create an example file in a sub-directory using f_putc().
|
* Create an example file in a sub-directory using f_putc().
|
||||||
*/
|
*/
|
||||||
static void prvCreateDemoFileUsing_f_putc( void );
|
static void prvCreateDemoFileUsing_f_putc( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use f_getc() to read back and verify the file that was created by
|
* Use f_getc() to read back and verify the file that was created by
|
||||||
* prvCreateDemoFileUsing_f_putc().
|
* prvCreateDemoFileUsing_f_putc().
|
||||||
*/
|
*/
|
||||||
static void prvVerifyDemoFileUsing_f_getc( void );
|
static void prvVerifyDemoFileUsing_f_getc( void );
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* A buffer used to both create content to write to disk, and read content back
|
/* A buffer used to both create content to write to disk, and read content back
|
||||||
from a disk. Note there is no mutual exclusion on this buffer. */
|
* from a disk. Note there is no mutual exclusion on this buffer. */
|
||||||
static char cRAMBuffer[ fsRAM_BUFFER_SIZE ];
|
static char cRAMBuffer[ fsRAM_BUFFER_SIZE ];
|
||||||
|
|
||||||
/* Names of directories that are created. */
|
/* Names of directories that are created. */
|
||||||
static const char *pcRoot = "/", *pcDirectory1 = "SUB1", *pcDirectory2 = "SUB2", *pcFullPath = "/SUB1/SUB2";
|
static const char * pcRoot = "/", * pcDirectory1 = "SUB1", * pcDirectory2 = "SUB2", * pcFullPath = "/SUB1/SUB2";
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vCreateAndVerifySampleFiles( void )
|
void vCreateAndVerifySampleFiles( void )
|
||||||
{
|
{
|
||||||
unsigned char ucStatus;
|
unsigned char ucStatus;
|
||||||
|
|
||||||
/* First create the volume. */
|
/* First create the volume. */
|
||||||
ucStatus = f_initvolume( ram_initfunc );
|
ucStatus = f_initvolume( ram_initfunc );
|
||||||
|
|
||||||
/* It is expected that the volume is not formatted. */
|
/* It is expected that the volume is not formatted. */
|
||||||
if( ucStatus == F_ERR_NOTFORMATTED )
|
if( ucStatus == F_ERR_NOTFORMATTED )
|
||||||
{
|
{
|
||||||
/* Format the created volume. */
|
/* Format the created volume. */
|
||||||
ucStatus = f_format( F_FAT12_MEDIA );
|
ucStatus = f_format( F_FAT12_MEDIA );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ucStatus == F_NO_ERROR )
|
if( ucStatus == F_NO_ERROR )
|
||||||
{
|
{
|
||||||
/* Create a set of files using f_write(). */
|
/* Create a set of files using f_write(). */
|
||||||
prvCreateDemoFilesUsing_f_write();
|
prvCreateDemoFilesUsing_f_write();
|
||||||
|
|
||||||
/* Read back and verify the files that were created using f_write(). */
|
/* Read back and verify the files that were created using f_write(). */
|
||||||
prvVerifyDemoFileUsing_f_read();
|
prvVerifyDemoFileUsing_f_read();
|
||||||
|
|
||||||
/* Create sub directories two deep then create a file using putc. */
|
/* Create sub directories two deep then create a file using putc. */
|
||||||
prvCreateDemoFileUsing_f_putc();
|
prvCreateDemoFileUsing_f_putc();
|
||||||
|
|
||||||
/* Read back and verify the file created by
|
/* Read back and verify the file created by
|
||||||
prvCreateDemoFileUsing_f_putc(). */
|
* prvCreateDemoFileUsing_f_putc(). */
|
||||||
prvVerifyDemoFileUsing_f_getc();
|
prvVerifyDemoFileUsing_f_getc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static void prvCreateDemoFilesUsing_f_write( void )
|
static void prvCreateDemoFilesUsing_f_write( void )
|
||||||
{
|
{
|
||||||
BaseType_t xFileNumber, xWriteNumber;
|
BaseType_t xFileNumber, xWriteNumber;
|
||||||
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
||||||
const BaseType_t xMaxFiles = 5;
|
const BaseType_t xMaxFiles = 5;
|
||||||
long lItemsWritten;
|
long lItemsWritten;
|
||||||
F_FILE *pxFile;
|
F_FILE * pxFile;
|
||||||
|
|
||||||
/* Create xMaxFiles files. Each created file will be
|
/* Create xMaxFiles files. Each created file will be
|
||||||
( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled
|
* ( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled
|
||||||
with a different repeating character. */
|
* with a different repeating character. */
|
||||||
for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
|
for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
|
||||||
{
|
{
|
||||||
/* Generate a file name. */
|
/* Generate a file name. */
|
||||||
sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
|
sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
|
||||||
|
|
||||||
/* Obtain the current working directory and print out the file name and
|
/* Obtain the current working directory and print out the file name and
|
||||||
the directory into which the file is being written. */
|
* the directory into which the file is being written. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
|
|
||||||
/* Open the file, creating the file if it does not already exist. */
|
/* Open the file, creating the file if it does not already exist. */
|
||||||
pxFile = f_open( cFileName, "w" );
|
pxFile = f_open( cFileName, "w" );
|
||||||
configASSERT( pxFile );
|
configASSERT( pxFile );
|
||||||
|
|
||||||
/* Fill the RAM buffer with data that will be written to the file. This
|
/* Fill the RAM buffer with data that will be written to the file. This
|
||||||
is just a repeating ascii character that indicates the file number. */
|
* is just a repeating ascii character that indicates the file number. */
|
||||||
memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE );
|
memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE );
|
||||||
|
|
||||||
/* Write the RAM buffer to the opened file a number of times. The
|
/* Write the RAM buffer to the opened file a number of times. The
|
||||||
number of times the RAM buffer is written to the file depends on the
|
* number of times the RAM buffer is written to the file depends on the
|
||||||
file number, so the length of each created file will be different. */
|
* file number, so the length of each created file will be different. */
|
||||||
for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ )
|
for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ )
|
||||||
{
|
{
|
||||||
lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
|
lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
|
||||||
configASSERT( lItemsWritten == 1 );
|
configASSERT( lItemsWritten == 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the file so another file can be created. */
|
/* Close the file so another file can be created. */
|
||||||
f_close( pxFile );
|
f_close( pxFile );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static void prvVerifyDemoFileUsing_f_read( void )
|
static void prvVerifyDemoFileUsing_f_read( void )
|
||||||
{
|
{
|
||||||
BaseType_t xFileNumber, xReadNumber;
|
BaseType_t xFileNumber, xReadNumber;
|
||||||
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
||||||
const BaseType_t xMaxFiles = 5;
|
const BaseType_t xMaxFiles = 5;
|
||||||
long lItemsRead, lChar;
|
long lItemsRead, lChar;
|
||||||
F_FILE *pxFile;
|
F_FILE * pxFile;
|
||||||
|
|
||||||
/* Read back the files that were created by
|
/* Read back the files that were created by
|
||||||
prvCreateDemoFilesUsing_f_write(). */
|
* prvCreateDemoFilesUsing_f_write(). */
|
||||||
for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
|
for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
|
||||||
{
|
{
|
||||||
/* Generate the file name. */
|
/* Generate the file name. */
|
||||||
sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
|
sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
|
||||||
|
|
||||||
/* Obtain the current working directory and print out the file name and
|
/* Obtain the current working directory and print out the file name and
|
||||||
the directory from which the file is being read. */
|
* the directory from which the file is being read. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
|
|
||||||
/* Open the file for reading. */
|
/* Open the file for reading. */
|
||||||
pxFile = f_open( cFileName, "r" );
|
pxFile = f_open( cFileName, "r" );
|
||||||
configASSERT( pxFile );
|
configASSERT( pxFile );
|
||||||
|
|
||||||
/* Read the file into the RAM buffer, checking the file contents are as
|
/* Read the file into the RAM buffer, checking the file contents are as
|
||||||
expected. The size of the file depends on the file number. */
|
* expected. The size of the file depends on the file number. */
|
||||||
for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ )
|
for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ )
|
||||||
{
|
{
|
||||||
/* Start with the RAM buffer clear. */
|
/* Start with the RAM buffer clear. */
|
||||||
memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );
|
memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );
|
||||||
|
|
||||||
lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
|
lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
|
||||||
configASSERT( lItemsRead == 1 );
|
configASSERT( lItemsRead == 1 );
|
||||||
|
|
||||||
/* Check the RAM buffer is filled with the expected data. Each
|
/* Check the RAM buffer is filled with the expected data. Each
|
||||||
file contains a different repeating ascii character that indicates
|
* file contains a different repeating ascii character that indicates
|
||||||
the number of the file. */
|
* the number of the file. */
|
||||||
for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ )
|
for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ )
|
||||||
{
|
{
|
||||||
configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) );
|
configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the file. */
|
/* Close the file. */
|
||||||
f_close( pxFile );
|
f_close( pxFile );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static void prvCreateDemoFileUsing_f_putc( void )
|
static void prvCreateDemoFileUsing_f_putc( void )
|
||||||
{
|
{
|
||||||
unsigned char ucReturn;
|
unsigned char ucReturn;
|
||||||
int iByte, iReturned;
|
int iByte, iReturned;
|
||||||
F_FILE *pxFile;
|
F_FILE * pxFile;
|
||||||
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
||||||
|
|
||||||
/* Obtain and print out the working directory. */
|
/* Obtain and print out the working directory. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
|
|
||||||
/* Create a sub directory. */
|
/* Create a sub directory. */
|
||||||
ucReturn = f_mkdir( pcDirectory1 );
|
ucReturn = f_mkdir( pcDirectory1 );
|
||||||
configASSERT( ucReturn == F_NO_ERROR );
|
configASSERT( ucReturn == F_NO_ERROR );
|
||||||
|
|
||||||
/* Move into the created sub-directory. */
|
/* Move into the created sub-directory. */
|
||||||
ucReturn = f_chdir( pcDirectory1 );
|
ucReturn = f_chdir( pcDirectory1 );
|
||||||
configASSERT( ucReturn == F_NO_ERROR );
|
configASSERT( ucReturn == F_NO_ERROR );
|
||||||
|
|
||||||
/* Obtain and print out the working directory. */
|
/* Obtain and print out the working directory. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
|
|
||||||
/* Create a subdirectory in the new directory. */
|
/* Create a subdirectory in the new directory. */
|
||||||
ucReturn = f_mkdir( pcDirectory2 );
|
ucReturn = f_mkdir( pcDirectory2 );
|
||||||
configASSERT( ucReturn == F_NO_ERROR );
|
configASSERT( ucReturn == F_NO_ERROR );
|
||||||
|
|
||||||
/* Move into the directory just created - now two directories down from
|
/* Move into the directory just created - now two directories down from
|
||||||
the root. */
|
* the root. */
|
||||||
ucReturn = f_chdir( pcDirectory2 );
|
ucReturn = f_chdir( pcDirectory2 );
|
||||||
configASSERT( ucReturn == F_NO_ERROR );
|
configASSERT( ucReturn == F_NO_ERROR );
|
||||||
|
|
||||||
/* Obtain and print out the working directory. */
|
/* Obtain and print out the working directory. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
|
configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
|
||||||
|
|
||||||
/* Generate the file name. */
|
/* Generate the file name. */
|
||||||
sprintf( cFileName, "%s.txt", pcDirectory2 );
|
sprintf( cFileName, "%s.txt", pcDirectory2 );
|
||||||
|
|
||||||
/* Print out the file name and the directory into which the file is being
|
/* Print out the file name and the directory into which the file is being
|
||||||
written. */
|
* written. */
|
||||||
pxFile = f_open( cFileName, "w" );
|
pxFile = f_open( cFileName, "w" );
|
||||||
|
|
||||||
/* Create a file 1 byte at a time. The file is filled with incrementing
|
/* Create a file 1 byte at a time. The file is filled with incrementing
|
||||||
ascii characters starting from '0'. */
|
* ascii characters starting from '0'. */
|
||||||
for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
|
for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
|
||||||
{
|
{
|
||||||
iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile );
|
iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile );
|
||||||
configASSERT( iReturned == ( ( int ) '0' + iByte ) );
|
configASSERT( iReturned == ( ( int ) '0' + iByte ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finished so close the file. */
|
/* Finished so close the file. */
|
||||||
f_close( pxFile );
|
f_close( pxFile );
|
||||||
|
|
||||||
/* Move back to the root directory. */
|
/* Move back to the root directory. */
|
||||||
ucReturn = f_chdir( "../.." );
|
ucReturn = f_chdir( "../.." );
|
||||||
configASSERT( ucReturn == F_NO_ERROR );
|
configASSERT( ucReturn == F_NO_ERROR );
|
||||||
|
|
||||||
/* Obtain and print out the working directory. */
|
/* Obtain and print out the working directory. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 );
|
configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static void prvVerifyDemoFileUsing_f_getc( void )
|
static void prvVerifyDemoFileUsing_f_getc( void )
|
||||||
{
|
{
|
||||||
unsigned char ucReturn;
|
unsigned char ucReturn;
|
||||||
int iByte, iReturned;
|
int iByte, iReturned;
|
||||||
F_FILE *pxFile;
|
F_FILE * pxFile;
|
||||||
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
char cFileName[ fsMAX_FILE_NAME_LEN ];
|
||||||
|
|
||||||
/* Move into the directory in which the file was created. */
|
/* Move into the directory in which the file was created. */
|
||||||
ucReturn = f_chdir( pcFullPath );
|
ucReturn = f_chdir( pcFullPath );
|
||||||
configASSERT( ucReturn == F_NO_ERROR );
|
configASSERT( ucReturn == F_NO_ERROR );
|
||||||
|
|
||||||
/* Obtain and print out the working directory. */
|
/* Obtain and print out the working directory. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
|
configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
|
||||||
|
|
||||||
/* Generate the file name. */
|
/* Generate the file name. */
|
||||||
sprintf( cFileName, "%s.txt", pcDirectory2 );
|
sprintf( cFileName, "%s.txt", pcDirectory2 );
|
||||||
|
|
||||||
/* This time the file is opened for reading. */
|
/* This time the file is opened for reading. */
|
||||||
pxFile = f_open( cFileName, "r" );
|
pxFile = f_open( cFileName, "r" );
|
||||||
|
|
||||||
/* Read the file 1 byte at a time. */
|
/* Read the file 1 byte at a time. */
|
||||||
for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
|
for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
|
||||||
{
|
{
|
||||||
iReturned = f_getc( pxFile );
|
iReturned = f_getc( pxFile );
|
||||||
configASSERT( iReturned == ( ( int ) '0' + iByte ) );
|
configASSERT( iReturned == ( ( int ) '0' + iByte ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finished so close the file. */
|
/* Finished so close the file. */
|
||||||
f_close( pxFile );
|
f_close( pxFile );
|
||||||
|
|
||||||
/* Move back to the root directory. */
|
/* Move back to the root directory. */
|
||||||
ucReturn = f_chdir( "../.." );
|
ucReturn = f_chdir( "../.." );
|
||||||
configASSERT( ucReturn == F_NO_ERROR );
|
configASSERT( ucReturn == F_NO_ERROR );
|
||||||
|
|
||||||
/* Obtain and print out the working directory. */
|
/* Obtain and print out the working directory. */
|
||||||
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,32 +1,34 @@
|
||||||
/*
|
/*
|
||||||
* FreeRTOS V202212.00
|
* FreeRTOS V202212.00
|
||||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* 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
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
* the Software without restriction, including without limitation the rights to
|
* the Software without restriction, including without limitation the rights to
|
||||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* 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,
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
* subject to the following conditions:
|
* subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
* copies or substantial portions of the Software.
|
* copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* 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
|
* 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
|
* 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* https://www.FreeRTOS.org
|
* https://www.FreeRTOS.org
|
||||||
* https://aws.amazon.com/freertos
|
* https://github.com/FreeRTOS
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef UDP_COMMAND_INTERPRETER_H
|
#ifndef UDP_COMMAND_INTERPRETER_H
|
||||||
#define UDP_COMMAND_INTERPRETER_H
|
#define UDP_COMMAND_INTERPRETER_H
|
||||||
|
|
||||||
void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority );
|
void vStartUDPCommandInterpreterTask( uint16_t usStackSize,
|
||||||
|
uint32_t ulPort,
|
||||||
#endif /* UDP_COMMAND_INTERPRETER_H */
|
UBaseType_t uxPriority );
|
||||||
|
|
||||||
|
#endif /* UDP_COMMAND_INTERPRETER_H */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue