diff --git a/.gitignore b/.gitignore
index 7012a89..8430683 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,8 @@ cmake_install.cmake
CTestTestfile.cmake
InfineonDoxyGenerator/
docs/doxygen/doxyfile_auto
+/docs/_build
+/docs/exhale-auto-docs
+docs/doxyoutput
+.pio/
+/workflow/
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index e6ccede..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-os:
- - linux
-
-language: python
-
-python:
- - 3.7
-
-sudo: required
-
-branches:
- - master
- - /^v.*$/
- - develop
-
-# Builds Test
-
-env:
- - PLATFORMIO_CI_SRC=examples/high-side-switch
- - PLATFORMIO_CI_SRC=examples/high-side-switch
-
-install:
- - pip install -U platformio==4.1.0
- - platformio platform install -f infineonxmc@1.1.3
- - platformio platform install -f atmelavr@2.0.0
-
-script:
- - platformio ci --lib="." --board=xmc1100_boot_kit --board=xmc4700_relax_kit --board=uno
-
-jobs:
- include:
- - stage: "Deploy"
- name: "GitHub Pages Deployment"
- #if: tag IS present
- addons:
- apt:
- packages:
- - doxygen
- - graphviz
- sources:
- - ubuntu-toolchain-r-test
- install:
- - git clone https://github.com/Infineon/InfineonDoxyGenerator.git --branch v.0.2.1
- script:
- - cd InfineonDoxyGenerator
- - python doxyifx.py html
- - python doxyifx.py release $GH_USER $GH_PASS_TOKEN
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 064058a..390a4a4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,9 @@
-cmake_minimum_required(VERSION 3.12.4)
+cmake_minimum_required(VERSION 3.12.4)
-# Arduino Library Template
-set(lib high-side-switch)
+# Arduino Library Template
+set(corelib high-side-switch)
-project(${lib} CXX C)
+project(${corelib} CXX C)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
@@ -14,22 +14,25 @@ set(CMAKE_C_OUTPUT_EXTENSION_REPLACE ON)
set(CMAKE_CXX_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage")
set(CMAKE_C_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage")
+include_directories(
+ src/corelib
+ src/pal
+)
# Header & Source Files
set(Headers
- src/corelib/hss.hpp
+ src/corelib
+ src/pal
)
-set(Sources
- src/corelib/hss.cpp
- )
+file(GLOB Sources CONFIGURE_DEPENDS src/corelib/*.cpp)
# Add Library
-add_library(${lib} ${Sources} ${Headers})
+add_library(${corelib} ${Sources} ${Headers})
# Enable Testing with CTest
enable_testing()
-# Add GoogleTest
+# Add GoogleTest
add_subdirectory(googletest)
# Add Tests Folder
-add_subdirectory(test)
+add_subdirectory(test/unit)
\ No newline at end of file
diff --git a/Contributing.md b/Contributing.md
new file mode 100644
index 0000000..a6fd222
--- /dev/null
+++ b/Contributing.md
@@ -0,0 +1,95 @@
+## How to contribute to Infineon examples, libraries and code
+
+
+
+#### **Did you find a bug?**
+
+
+
+* **verify that the library belongs to you hardware**, sometimes certain sensors look similar but have different functionality and
+
+different software repositories. Check if you have the right combination.
+
+
+
+* **Ensure the bug was not already reported** by searching on GitHub under issues for this particular repository
+
+
+
+* If you're unable to find an open issue addressing the problem, open a new one. Be sure to include
+
+ - a **title and clear description**, as much relevant information as possible
+
+ - a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring
+
+ - a **hardware list** the exact name of a sensors or microcontroller you used
+
+ - a **circuit diagram** if you have a such a problem
+
+
+
+#### **Did you write a patch that fixes a bug?**
+
+
+
+* Before you write a patch open an issue and wait for answer an answer from the repository admin. Maybe a patch or a new release is already and the way.
+
+
+
+* Open a new GitHub pull request with the patch.
+
+
+
+* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable.
+
+
+
+#### **Did you fix whitespace, format code, or make a purely cosmetic patch?**
+
+
+
+Changes that are cosmetic in nature and do not add anything substantial to the stability, functionality, or testability of Rails will generally not be accepted
+
+as a patch, but you can still raise an issue so that these changes can be fixed with a new official release.
+
+
+
+#### **Do you intend to add a new feature or change an existing one?**
+
+
+
+* Suggest your change in by raising an issue before you start writing code.
+
+
+
+* Do not open an issue on GitHub until you have collected positive feedback about the change.
+
+
+
+* Start a discussion with the [Infineon Maker Team](https://github.com/orgs/Infineon/teams/maker-hackathon-team)
+
+
+
+#### **Do you have questions about the source code?**
+
+
+
+* Please start a discussion with the [Infineon Maker Team](https://github.com/orgs/Infineon/teams/maker-hackathon-team)
+
+
+
+#### **Do you want to contribute to the documentation?**
+
+
+
+* Same, start a discussion with the [Infineon Maker Team](https://github.com/orgs/Infineon/teams/maker-hackathon-team)
+
+
+
+
+
+Thanks! :heart: :heart: :heart:
+
+
+
+Infineon Technologies AG, GitHub Team
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 1fc27ae..277fcb1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2019 Infineon Technologies AG
+Copyright (c) 2019-2021 Infineon Technologies AG
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 8d82fca..6a9ff2e 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,47 @@
# Smart High-Side Switch
-[](https://travis-ci.com/github/Infineon/high-side-switch)
-
-C++ library for Infineon's Arduino shield SHIELD_BTS700x-1EPP with the **Smart High-Side Power Switch BTS700x-1EPP**
-
-## Supported Hardware
-
-### SHIELD_BTS7002-1EPP
-The library has been customized for the Arduino-Adapter-Shield ***SHIELD_BTS700x-1EPP*** and for the Arduino environment. It works with all available versions of the board (SHIELD_BTS7002-1EPP, SHIELD_BTS7004-1EPP, SHIELD_BTS7006-1EPP, SHIELD_BTS7008-1EPP).
-
-
-
-A detailed explanation of the board and its features can be found in the [user manual](https://www.infineon.com/dgdl/Infineon-PROFET+2_12V_Arduino_Shield-UserManual-v01_00-EN.pdf?fileId=5546d4626df6ee62016dfe3f1eff118b). The user manual also contains the pinout as well as the schematics of the board. The data sheet of the BTS7002-1EPP can be found [here](https://www.infineon.com/dgdl/Infineon-BTS7002-1EPP-DataSheet-v01_04-EN.pdf?fileId=5546d4626eab8fbf016ead699aef00b3).
-
-### Verified Hardware
-The shield is designed to be directly stacked on boards which have the Arduino UNO form factor.
-Therefore, the library has been built and successfully deployed to the following platforms:
-
-MCU Platforms |
---- |
-[XMC1100 Boot Kit](https://www.infineon.com/cms/en/product/evaluation-boards/kit_xmc11_boot_001/#ispnTab1) |
-[Arduino Uno Rev3](https://store.arduino.cc/arduino-uno-rev3) |
-
-### Additional hardware platforms
-The library should be directly compatible with other platforms that support the Arduino API (Arduino reference language). The library is also written in a way that porting the library to another platform requires the developer only to provide a API for the specific platform, using the platform specific low level drivers. A porting guide is available in the [Wiki](https://github.com/Infineon/high-side-switch/wiki).
-
-## Software documentation
-A detailed explanation of the software structure as well as the API can be found [here](https://github.com/Infineon/high-side-switch/wiki/Library-Details). And there is also a ***Doxygen-File*** available, which can be found [here](https://infineon.github.io/high-side-switch/).
+C++ library for Infineon's Arduino shields for **PROFET™ Smart High-Side Power Switches** Automotive grade
+
+## Supported Products
+
+
+
+## Supported Frameworks
+
+
## More information
-The complete documentation of the library as well as detailed information about the PROFET-shield, can be found in the [Wiki](https://github.com/Infineon/high-side-switch/wiki).
-## License
-This project is licensed under the MIT License - click [here](https://github.com/Infineon/high-side-switch/blob/master/LICENSE) for details.
+The complete documentation of the library as well as detailed information about the PROFET-shield, can be found in the [Wiki](https://high-side-switch.readthedocs.io/en/latest/index.html).
+## License
+This project is licensed under the MIT License - click [here](https://github.com/Infineon/high-side-switch/blob/master/LICENSE) for details.
\ No newline at end of file
diff --git a/devops/xfpbuild/Jenkinsfile b/devops/xfpbuild/Jenkinsfile
new file mode 100644
index 0000000..1bc7ef5
--- /dev/null
+++ b/devops/xfpbuild/Jenkinsfile
@@ -0,0 +1,631 @@
+/*
+ * ##################################################################################
+ *
+ * XFP internal build pipeline
+ * should run fast (<10min) with following parts
+ * - unit test and report
+ * - SonarQube report
+ * - compilation (if for more than one framework, than in parallel)
+ * - doxygen build and deploy on internal server
+ *
+ */
+library("jenkins-pipeline-ifx-library")
+
+def send_email(email_subject, email_to, email_body) {
+ providers = [culprits(), developers(), requestor()]
+ emailext recipientProviders: providers, body: email_body, subject: email_subject, to: email_to, compressLog: true, attachLog: true
+}
+
+// Artifactory settings
+def artifactoryServer = 'Artifactory'
+def artifactoryRepo = 'gen-des-epe-sw-development-local'
+def artifactoryTarget = 'gen-des-tools-prod-eden-local'
+def artifactorySW = 'https://artifactory.intra.infineon.com/artifactory/gen-des-epe-sw-development-local/'
+// Arduino settings
+def inoVER = '0.18.3'
+def cliLinux = 'arduino-cli_0.18.3_Linux_64bit.tar.gz'
+def cliWindows = 'arduino-cli_0.18.3_Windows_64bit.tar.gz'
+def brdLTGZ = 'arduino-board-package_0.18.3_Linux_64bit.tar.gz'
+def brdWTGZ = 'arduino-board-package_0.18.3_Windows_64bit.tar.gz'
+// Common settings
+def linuxTools = '/home/xfpjenki/tools'
+def winTools = 'D:/tools'
+
+pipeline {
+ /**
+ * node where to run on
+ */
+ agent any
+
+ /**
+ * Parameter choice settings for manual start
+ */
+ parameters {
+ choice(name: 'SERVER', choices:['vihlarazweb3','vihlarazweb2'], description: 'server')
+ choice(name: 'SONARINSTANCE', choices:['Sonar-Dev','Sonar-Prod'], description: 'SonarQube instance')
+
+ booleanParam(name: 'ARDUINO', defaultValue: true, description: 'should we do a Arduino compilation?')
+ booleanParam(name: 'PLATFORMIO', defaultValue: false, description: 'should we do a PlatformIO compilation?')
+ booleanParam(name: 'MTB', defaultValue: false, description: 'should we do a ModusToolbox compilation?')
+ booleanParam(name: 'RASPBERRYPI', defaultValue: false, description: 'should we do a RaspberryPI compilation?')
+ booleanParam(name: 'WICED', defaultValue: false, description: 'should we do a WiCED compilation?')
+ booleanParam(name: 'DOCU', defaultValue: true, description: 'should we generate the documentation?')
+
+ booleanParam(name: 'ALLHARDWARE', defaultValue: false, description: 'should we do a compilation for all availabe or default hardware platforms?')
+ }
+
+ /**
+ * Environment settings for shell calls
+ */
+ environment {
+ WEB_ROOT = "/home/razweb/htdocs-${params.SERVER}"
+ REPO_NAME = "${JOB_NAME.replaceFirst(/^.*\/XFP (.*)\/.*$/, '$1')}"
+ DOCS_TARGET = "${env.WEB_ROOT}/itec/xfp/high-side-switch-test/${env.BRANCH_NAME}"
+ DOCS_SOURCE = "${env.WORKSPACE}/docs/doxygen/build"
+ ROOT_URL = "https://${params.SERVER}.vih.infineon.com"
+ SONARINSTANCE = "${params.SONARINSTANCE}"
+
+ cliPath = "arduinoCLI/${-> inoVER}"
+ boardPath = "arduinoBoardPackage/${-> inoVER}"
+ }
+
+ /**
+ * Keep only the last 2 artifacts on the server to prevent from
+ * locking massive amount of disk space. The number should <= 5.
+ */
+ options {
+ ansiColor('xterm')
+ buildDiscarder(
+ logRotator(
+ numToKeepStr: '2',
+ artifactNumToKeepStr: '2'
+ )
+ )
+ disableConcurrentBuilds()
+ }
+
+ /**
+ * Set up cron triggers for constant pipeline builds if this is needed
+ */
+ /*
+ triggers {
+ cron('H H(0-1) * * *')
+ }
+ */
+
+ stages {
+
+ // *
+ // * ************************************************************DevCI TRIGGER
+ // *
+ stage('Vars') {
+ steps {
+ cleanWs()
+ script {
+ def result = sh(
+ script: '''
+ echo "WEB_ROOT :" ${WEB_ROOT}
+ echo "ROOT_URL :" ${ROOT_URL}
+ echo "BRANCH_NAME :" ${BRANCH_NAME}
+ echo "BUILD_NUMBER :" ${BUILD_NUMBER}
+ echo "WORKSPACE :" ${WORKSPACE}
+ echo "SONARINSTANCE :" ${SONARINSTANCE}
+ echo "SERVER :" ${SERVER}
+ echo "REPO_NAME :" ${REPO_NAME}
+ echo "JOB_URL :" ${JOB_URL}
+ echo "DOCS_SOURCE :" ${DOCS_SOURCE}
+ echo "DOCS_TARGET :" ${DOCS_TARGET}
+ echo "BOOLEAN ARDUINO :" ${ARDUINO}
+ echo "BOOLEAN PLATFORMIO :" ${PLATFORMIO}
+ echo "BOOLEAN MTB :" ${MTB}
+ echo "BOOLEAN RASPBERRYPI :" ${RASPBERRYPI}
+ echo "BOOLEAN WICED :" ${WICED}
+ echo "BOOLEAN DOCUMETATION :" ${DOCU}
+ echo "/"${REPO_NAME}"/"${BRANCH_NAME}"/"
+ echo "/"${REPO_NAME}"/"${BRANCH_NAME}"/documentation"
+ echo "/"${REPO_NAME}"/"${BRANCH_NAME}"/build/html"
+ echo "/"${REPO_NAME}"/"${BRANCH_NAME}"/build/doxygen-log.txt"
+ echo "_"${REPO_NAME}
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+ } // end steps
+ } // end DevCI trigger
+
+ // *
+ // * ************************************************************DevCI UNITTEST
+ // *
+ stage('Check') {
+ parallel {
+ /*-----------------------------------------------------------------------------
+ * cppcheck
+ * -----------------------------------------------------------------------------
+ */
+ stage('CPP') {
+ agent {
+ node {
+ label 'epelinux3'
+ }
+ }
+ steps {
+ echo "cppcheck"
+ script {
+ def result = sh(
+ script: '''
+ cd ./
+ export PATH=/opt/sofit/cppcheck/1.76.1/bin:$PATH
+ mkdir -p build
+ /opt/sofit/cppcheck/1.76.1/bin/cppcheck -v --enable=all --xml-version=2 -I src test 2> build/cppcheck-report.xml
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+ } // end steps
+ } // end cppcheck
+
+ /*-----------------------------------------------------------------------------
+ * unit test
+ *-----------------------------------------------------------------------------
+ */
+ stage('unit test') {
+ steps {
+ echo "unit test"
+ //sh ("export DOXY_BIN_PATH=/usr/local/bin/;cd ${env.WORKSPACE}/docs;/usr/bin/make html")
+ }
+ }
+
+ } // parallel
+ } // end stage
+
+
+
+
+ stage('build') {
+ parallel {
+
+ /*-----------------------------------------------------------------------------
+ * Arduino Linux CLI
+ *-----------------------------------------------------------------------------
+ */
+ stage('INO') {
+ agent {
+ node {
+ label 'epelinux2'
+ }
+ }
+ when {
+ beforeAgent true
+ expression { params.ARDUINO }
+ }
+
+ stages('Arduino') {
+
+ // Artifactory
+ stage('Arduino CLI') {
+
+ steps {
+ script {
+ if (isUnix()) {
+ env.toolsA = linuxTools
+ env.cli = cliLinux
+ env.board = brdLTGZ
+ echo "Linux"
+ }else{
+ env.toolsA = winTools
+ env.cli = cliWindows
+ env.board = brdWTGZ
+ echo "Windows"
+ }
+ }
+ // ArduinoCLI package
+ rtDownload (
+ serverId: artifactoryServer,
+ spec: """
+ { "files": [
+ {
+ "pattern": "${artifactoryRepo}/${env.cliPath}/${env.cli}",
+ "target": "${env.toolsA}/"
+ }
+ ]
+ }
+ """
+ )
+ // Arduino Board package
+ rtDownload (
+ serverId: artifactoryServer,
+ spec: """
+ { "files": [
+ {
+ "pattern": "${artifactoryRepo}/${env.boardPath}/${env.board}",
+ "target": "${env.toolsA}/",
+ "flat": "true"
+ }
+ ]
+ }
+ """
+ )
+ // Arduino library package
+ rtDownload (
+ serverId: artifactoryServer,
+ spec: """
+ { "files": [
+ {
+ "pattern": "${artifactoryRepo}/arduino/libraries/",
+ "target": "${env.toolsA}/arduino/libraries/",
+ "flat": "true",
+ "explode": "true"
+ }
+ ]
+ }
+ """
+ )
+ // unpacking
+ sh(
+ script: '''
+ cd ${toolsA}
+ tar -xf ${board}
+ tar -xf ${cliPath}/${cli} --directory ${cliPath}
+ rm ${cliPath}/${cli}
+ rm ${board}
+ '''
+ )
+
+ }
+ when {
+ beforeAgent true
+ expression { return fileExists ('${env.toolsA}/${env.boardPath}/arduino-cli')}
+ }
+
+ }
+
+ // INO generation
+ stage('Generate INO') {
+ steps {
+ // prepares the build directory and runs
+ // xfp-dev to generate the arduino only directory structure
+ script {
+ if (isUnix()) {
+ env.toolsA1 = linuxTools
+ echo "Linux"
+ }else{
+ env.toolsA1 = winTools
+ echo "Windows"
+ }
+ }
+ echo "NODE_NAME = ${env.NODE_NAME}"
+ script {
+ def result = sh(
+ script: '''
+ cd ./
+ export PATH=/opt/python/3.9/linux/RHEL60/bin:$PATH
+ export PYTHONPATH=/opt/python/3.9/linux//RHEL60//../pyperl/python/lib/python3.9/site-packages:/home/xfpjenki/tools/python3
+ rm -rf ./build/Arduino
+ mkdir -p ./build/Arduino
+ ${toolsA1}/python3/bin/xfp-dev arduino lib-pack --path=./build/Arduino
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+ } // end xfp-dev
+ }
+
+ // example compilation
+ stage('CLI Build') {
+ steps {
+ // checks for OS system and than compiles all
+ // examples with the arduino-cli tool
+ script {
+ if (isUnix()) {
+ env.toolsA2 = linuxTools
+ }else{
+ env.toolsA2 = winTools
+ }
+ }
+ echo "NODE_NAME = ${env.NODE_NAME}"
+ script {
+ def result = sh(
+ script: '''
+ cd ./
+ export lib=`ls -1 ./build/Arduino/`
+ export examples=(`ls -1 ./build/Arduino/${lib}/examples/`)
+
+ #export fqbn=(arduino:avr:uno Infineon:arm:XMC1100_Boot_Kit Infineon:arm:XMC4700_Relax_Kit)
+ export fqbn=(arduino:avr:uno)
+
+ echo $examples
+ for a in "${fqbn[@]}"
+ do
+ for i in "${examples[@]}"
+ do
+ echo "Board: $a, Example: $i";
+ ${toolsA2}/${cliPath}/arduino-cli compile --config-file ${toolsA2}/.arduino15/arduino-cli.yaml --verbose --fqbn $a --libraries=./build/Arduino/${lib} build/Arduino/${lib}/examples/$i
+ echo "===================="
+ done
+ done
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+ } // end CLI Build
+ }
+
+ }
+
+ }
+
+
+ /*-----------------------------------------------------------------------------
+ * ModusToolbox Build
+ *-----------------------------------------------------------------------------
+ */
+ stage('MTB') {
+
+ when {
+ beforeAgent true
+ expression { params.MTB }
+ }
+
+ stages('ModusToolbox') {
+
+ stage('Trigger MTB') {
+ steps {
+ script {
+ def result = sh(
+ script: '''
+ SERVER=pssswgov-jenkins.icp.infineon.com
+ JOB_NAME=PSSDevOps/job/MTB%20Code%20Example%20validator/job/master
+ COOKIEJAR="$(mktemp)"
+ crumb=$(curl --cookie-jar "$COOKIEJAR" "https://$SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")
+ curl -v --cookie "$COOKIEJAR" -H $crumb -X POST "https://$SERVER/job/$JOB_NAME/buildWithParameters?CE_REPO=git@devops-git.aus.cypress.com:wpp/ce/mtb/mtb-example-psoc6-multi-half-bridge.git&CE_BRANCH=${BRANCH_NAME}"
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+
+ }
+ }
+
+ }
+
+ }
+
+ // /*-----------------------------------------------------------------------------
+ // * PlatformIO build
+ // *-----------------------------------------------------------------------------
+ // */
+ stage('PIO') {
+ agent {
+ node {
+ label 'epelinux3'
+ }
+ }
+
+ when {
+ beforeAgent true
+ expression { params.PLATFORMIO }
+ }
+
+ stages('PlatformIO') {
+
+ stage('Trigger PIO') {
+ steps {
+ echo "PlatformIO"
+ /*
+ sh ("export DOXY_BIN_PATH=/usr/local/bin/;cd ${env.WORKSPACE}/docs;/usr/bin/make pdf")
+ build(
+ job: 'dev/doxy_maker_pdf',
+ propagate: true,
+ parameters: [
+ [
+ $class: 'StringParameterValue',
+ name: 'WORKSPACE',
+ value: "${env.WORKSPACE}"
+ ],
+ ]
+ )
+ */
+ }
+ }
+ }
+ }
+
+ /*-----------------------------------------------------------------------------
+ * doxygen
+ *-----------------------------------------------------------------------------
+ */
+ stage('docu') {
+ agent {
+ node {
+ label 'epelinux2'
+ }
+ }
+
+ when {
+ beforeAgent true
+ expression { params.DOCU }
+ }
+
+ stages {
+
+ stage('doxygen') {
+ steps {
+ echo "doxygen"
+ echo "NODE_NAME = ${env.NODE_NAME}"
+ // doxygen runs always, therefore it
+ // 1. removes the documentation target directory
+ // 2. generates it new
+ // 3. copies the doxygen build directory into the target directory
+ script {
+ def result = sh(
+ script: '''
+ cd ./
+ export DOCS_SOURCE=${WORKSPACE}/docs/doxygen/build
+ export PATH=/opt/doxygen/1.8.14/bin:/opt/python/anaconda/4.2.0/py3.5.2:$PATH
+ rm -rf infineondoxygenerator
+ git clone https://bitbucket.vih.infineon.com/scm/ghmm/infineondoxygenerator.git
+ cd ./infineondoxygenerator
+ python3 doxyifx.py html
+ rm -rf ${DOCS_TARGET}
+ mkdir -p ${DOCS_TARGET}
+ cp -R ${DOCS_SOURCE}/ ${DOCS_TARGET}/.
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+ } // end doxygen
+ } // end stage
+
+ stage('Sphinx') {
+ when { expression { return fileExists ('./docs/index.rst') } }
+ steps {
+ echo "ReadTheDocs"
+ // Sphinx runs only if the index.rst exists and it
+ // 1. removes the documentation directory below the target directory
+ // 2. copies the new Sphinx documentation into new documentation directory
+ script {
+ def result = sh(
+ script: '''
+ export PATH=/opt/python/3.9/linux/RHEL60/bin:$PATH
+ cd docs
+ sphinx-build ./ ./documentation
+ mkdir -p ${DOCS_TARGET}
+ rm -rf ${DOCS_TARGET}/documentation
+ cp -R ./documentation ${DOCS_TARGET}/.
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+ } // end ReadTheDocs
+ } // end sphinx
+
+ } // end stages
+
+ } // end docu
+
+ } // end parallel
+ } // end docu build
+
+ /*-----------------------------------------------------------------------------
+ * SonarQube stage runs the sonar scanner and collects all reports
+ *-----------------------------------------------------------------------------
+ */
+ stage('SonarQube') {
+ agent {
+ node {
+ label 'epelinux2'
+ }
+ }
+
+ steps {
+ echo "SonarQube"
+
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ withSonarQubeEnv(
+ installationName: "${params.SONARINSTANCE}"
+ ){
+ script {
+ if (isUnix()) {
+ env.scannerHome = tool 'sonar-scanner-cli-4.2.0.1873-linux'
+ }else{
+ env.scannerHome = tool 'sonar-scanner-4.2.0.1873'
+ }
+ echo "NODE_NAME = ${env.NODE_NAME}"
+ def result = sh(
+ script: '''
+ cp ./devops/xfpbuild/sonar-project.properties ./.;
+ ${scannerHome}/bin/sonar-scanner -X
+ ''',
+ returnStdout: true
+ ).trim()
+ echo "$result"
+ }
+ }
+ } // end catch
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ timeout(time: 200, unit: 'MINUTES') {
+ waitForQualityGate abortPipeline: true
+ }
+ } // end catch
+ } // end steps
+
+ } // end SonarQube
+
+ } // end stages
+
+ /*-----------------------------------------------------------------------------
+ * post
+ *-----------------------------------------------------------------------------
+ */
+
+ post {
+ failure {
+ send_email('[XFPBUILD] build failing on branch "' + env.BRANCH_NAME + '"','$DEFAULT_RECIPIENTS',
+ '''
+ ${SCRIPT}
+
+
+
+
+ LINKS |
+
+
+ SonarQube results: |
+ https://sonardev.vih.infineon.com/dashboard?id=XFP_Build${BUILD_LOG_REGEX, regex="^_.*$",showTruncatedLines=false} |
+
+
+ Documentation all: |
+ https://vihlarazweb3.vih.infineon.com/itec/xfp${BUILD_LOG_REGEX, regex="^/.*/$",showTruncatedLines=false} |
+
+
+ Doxygen: |
+ https://vihlarazweb3.vih.infineon.com/itec/xfp${BUILD_LOG_REGEX, regex="^/.*html$",showTruncatedLines=false} |
+
+
+ Sphinx (if availabe): |
+ https://vihlarazweb3.vih.infineon.com/itec/xfp${BUILD_LOG_REGEX, regex="^/.*documentation$",showTruncatedLines=false} |
+
+
+
+ ''')
+ }
+ success {
+ send_email('[XFPBUILD] build on branch "' + env.BRANCH_NAME + '" OK', '' ,
+ '''
+ ${SCRIPT}
+
+
+
+
+ LINKS |
+
+
+ SonarQube results: |
+ https://sonardev.vih.infineon.com/dashboard?id=XFP_Build${BUILD_LOG_REGEX, regex="^_.*$",showTruncatedLines=false} |
+
+
+ Documentation all: |
+ https://vihlarazweb3.vih.infineon.com/itec/xfp${BUILD_LOG_REGEX, regex="^/.*/$",showTruncatedLines=false} |
+
+
+ Doxygen: |
+ https://vihlarazweb3.vih.infineon.com/itec/xfp${BUILD_LOG_REGEX, regex="^/.*html$",showTruncatedLines=false} |
+
+
+ Sphinx (if availabe): |
+ https://vihlarazweb3.vih.infineon.com/itec/xfp${BUILD_LOG_REGEX, regex="^/.*documentation$",showTruncatedLines=false} |
+
+
+
+ ''')
+ }
+ }
+
+}
diff --git a/devops/xfpbuild/sonar-project.properties b/devops/xfpbuild/sonar-project.properties
new file mode 100644
index 0000000..323d02b
--- /dev/null
+++ b/devops/xfpbuild/sonar-project.properties
@@ -0,0 +1,30 @@
+##################################################################################
+#
+# Attention: this file is used for compilation checks together with
+# Jenkins, SonarQube and OpenShift cluster
+#
+
+sonar.projectKey=XFP_Build_high-side-switch
+sonar.projectName=XFP_Build_high-side-switch
+sonar.projectVersion=1.0.0
+sonar.verbose=true
+
+sonar.sourceEncoding=UTF-8
+sonar.language=c++,python
+sonar.lang.patterns.c=""
+sonar.lang.patterns.cs=""
+sonar.c.file.suffixes=-
+sonar.cpp.file.suffixes=.cc,.cpp,.cxx,.c++,.hh,.hpp,.hxx,.h++,.ipp,.c,.h
+
+# for RH7 an higher
+#sonar.nodejs.executable=/opt/razware/share/node-v12.13.1-linux-x64/bin/node
+
+# directories to scan
+sonar.sources=src,test
+
+# paths to the reports
+sonar.cxx.cppcheck.reportPath=build/cppcheck-report.xml
+
+# workarrounds for sonar test instance
+sonar.buildbreaker.skip=true
+sonar.tfvc.collectionuri=https://workaround-tfvc-plugin-issue/DefaultCollection
\ No newline at end of file
diff --git a/docs/Infineon-BTS7002-1EPP-DataSheet-v01_04-EN.pdf b/docs/Infineon-BTS7002-1EPP-DataSheet-v01_04-EN.pdf
deleted file mode 100644
index a15dbfe..0000000
Binary files a/docs/Infineon-BTS7002-1EPP-DataSheet-v01_04-EN.pdf and /dev/null differ
diff --git a/docs/Infineon-PROFET+2_12V_Arduino_Shield-UserManual-v01_00-EN.pdf b/docs/Infineon-PROFET+2_12V_Arduino_Shield-UserManual-v01_00-EN.pdf
deleted file mode 100644
index 023c52d..0000000
Binary files a/docs/Infineon-PROFET+2_12V_Arduino_Shield-UserManual-v01_00-EN.pdf and /dev/null differ
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
new file mode 100644
index 0000000..05ab983
--- /dev/null
+++ b/docs/_templates/layout.html
@@ -0,0 +1,70 @@
+{% extends "!layout.html" %}
+ {% block footer %} {{ super() }}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/docs/api-reference/arduino-api.rst b/docs/api-reference/arduino-api.rst
new file mode 100755
index 0000000..a3d5305
--- /dev/null
+++ b/docs/api-reference/arduino-api.rst
@@ -0,0 +1,37 @@
+.. _arduino-api:
+
+Arduino API
+-----------
+
+.. |trade| unicode:: U+2122 .. TRADEMARK SIGN
+
+The following classes allow the instance creation using the Arduino framework types:
+
+High-side Switch Ino
+""""""""""""""""""""
+.. doxygenclass:: hss::HssIno
+ :members:
+
+.. _Bts700xShieldIno API:
+
+PROFET\ |trade|\ + 24V Shield Ino
+"""""""""""""""""""""""""""""""""
+
+.. doxygenclass:: hss::Bts700xShieldIno
+ :members:
+
+.. _Bts5001xShieldIno API:
+
+Power PROFET\ |trade|\ Shield Ino
+""""""""""""""""""""""""""""""""""
+
+.. doxygenclass:: hss::Bts5001xShieldIno
+ :members:
+
+.. _Btt60xxShieldIno API:
+
+PROFET\ |trade|\ +2 12V Shield Ino
+""""""""""""""""""""""""""""""""""
+
+.. doxygenclass:: hss::Btt60xxShieldIno
+ :members:
\ No newline at end of file
diff --git a/docs/api-reference/core-lib.rst b/docs/api-reference/core-lib.rst
new file mode 100755
index 0000000..d13f881
--- /dev/null
+++ b/docs/api-reference/core-lib.rst
@@ -0,0 +1,25 @@
+.. _core-lib:
+
+Core library
+============
+
+The core library provides 2 base APIs:
+
+- :ref:`Hss API`. Implements a class for high side switch devices.
+- :ref:`HssShield API`. Implements an interface for high side switch shields.
+
+The main APIs are derived from the HSS Shield API, as per shield type:
+
+- :ref:`Btt60xxShield API`
+- :ref:`Bts5001xShield API`
+- :ref:`Bts700xShield API`
+
+.. toctree::
+ :maxdepth: 3
+ :hidden:
+
+ hss-api
+ hss-shield-api
+ profet-24-api
+ power-profet-api
+ profet2-12-api.rst
\ No newline at end of file
diff --git a/docs/api-reference/hss-api.rst b/docs/api-reference/hss-api.rst
new file mode 100755
index 0000000..744840e
--- /dev/null
+++ b/docs/api-reference/hss-api.rst
@@ -0,0 +1,7 @@
+.. _Hss API:
+
+High-side Switch
+----------------
+
+.. doxygenclass:: hss::Hss
+ :members:
\ No newline at end of file
diff --git a/docs/api-reference/hss-shield-api.rst b/docs/api-reference/hss-shield-api.rst
new file mode 100755
index 0000000..8471500
--- /dev/null
+++ b/docs/api-reference/hss-shield-api.rst
@@ -0,0 +1,7 @@
+.. _HssShield API:
+
+High-side Switch Shield
+-----------------------
+
+.. doxygenclass:: hss::HssShield
+ :members:
\ No newline at end of file
diff --git a/docs/api-reference/modules.rst b/docs/api-reference/modules.rst
new file mode 100755
index 0000000..1b4b8d2
--- /dev/null
+++ b/docs/api-reference/modules.rst
@@ -0,0 +1,18 @@
+.. _modules:
+
+Modules
+=======
+
+In this section you can find out the main public APIs of the library.
+
+The higher levels API can be found in the software framework sections.
+These are inheriting the main functionalities from the respective core library APIs.
+For more information about the modules relationship in the :ref:`Library Architecture` section.
+
+.. toctree::
+ :maxdepth: 6
+
+ Core Library
+ PAL Interface
+ SW Frameworks
+
diff --git a/docs/api-reference/pal-interface.rst b/docs/api-reference/pal-interface.rst
new file mode 100755
index 0000000..f549710
--- /dev/null
+++ b/docs/api-reference/pal-interface.rst
@@ -0,0 +1,36 @@
+.. _pal-intf:
+
+Platform Abstraction Layer Interface
+------------------------------------
+
+The high side switch library requires ADCs, GPIOs and timer resources from the platform.
+These are implemented in terms of the following abstract class APIs for each supporteed software framework:
+
+- :ref:`ADC PAL`
+- :ref:`GPIO PAL`
+- :ref:`Timer PAL`
+
+Their member parameters and functions are described in this section.
+
+.. _ADC PAL:
+
+ADC PAL
+"""""""
+
+.. doxygenclass:: hss::ADCPAL
+ :members:
+
+.. _GPIO PAL:
+
+GPIO PAL
+""""""""
+.. doxygenclass:: hss::GPIOPAL
+ :members:
+
+.. _Timer PAL:
+
+Timer PAL
+"""""""""
+
+.. doxygenclass:: hss::TimerPAL
+ :members:
\ No newline at end of file
diff --git a/docs/api-reference/power-profet-api.rst b/docs/api-reference/power-profet-api.rst
new file mode 100755
index 0000000..d73c79e
--- /dev/null
+++ b/docs/api-reference/power-profet-api.rst
@@ -0,0 +1,9 @@
+.. _Bts5001xShield API:
+
+Power PROFET\ |trade|\ Shield
+------------------------------
+
+.. |trade| unicode:: U+2122 .. TRADEMARK SIGN
+
+.. doxygenclass:: hss::Bts5001xShield
+ :members:
\ No newline at end of file
diff --git a/docs/api-reference/profet-24-api.rst b/docs/api-reference/profet-24-api.rst
new file mode 100755
index 0000000..b696345
--- /dev/null
+++ b/docs/api-reference/profet-24-api.rst
@@ -0,0 +1,9 @@
+.. _Btt60xxShield API:
+
+PROFET\ |trade|\ + 24V Shield
+-----------------------------
+
+.. |trade| unicode:: U+2122 .. TRADEMARK SIGN
+
+.. doxygenclass:: hss::Btt60xxShield
+ :members:
\ No newline at end of file
diff --git a/docs/api-reference/profet2-12-api.rst b/docs/api-reference/profet2-12-api.rst
new file mode 100755
index 0000000..5a28ef4
--- /dev/null
+++ b/docs/api-reference/profet2-12-api.rst
@@ -0,0 +1,9 @@
+.. _Bts700xShield API:
+
+PROFET\ |trade|\ +2 12V Shield
+------------------------------
+
+.. |trade| unicode:: U+2122 .. TRADEMARK SIGN
+
+.. doxygenclass:: hss::Bts700xShield
+ :members:
\ No newline at end of file
diff --git a/docs/api-reference/sw-frameworks.rst b/docs/api-reference/sw-frameworks.rst
new file mode 100755
index 0000000..6475e07
--- /dev/null
+++ b/docs/api-reference/sw-frameworks.rst
@@ -0,0 +1,9 @@
+Software frameworks
+-------------------
+
+The frameworks wrappers APIs are provided in this library:
+
+.. toctree::
+ :maxdepth: 3
+
+ Arduino
\ No newline at end of file
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..2d88d7c
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,145 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# http://www.sphinx-doc.org/en/master/config
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+
+from recommonmark.parser import CommonMarkParser
+from sphinx.builders.html import StandaloneHTMLBuilder
+import subprocess, os, sys
+import textwrap
+
+# Check if we're running on Read the Docs' servers
+read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True'
+
+# -- Project information -----------------------------------------------------
+
+project = 'High-Side Switch'
+copyright = '2021 Infineon Technologies AG'
+author = 'Infineon Technologies AG'
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+#...
+
+# At top on conf.py (with other import statements)
+# import recommonmark
+# from recommonmark.transform import AutoStructify
+
+# # At the bottom of conf.py
+# def setup(app):
+# app.add_config_value('recommonmark_config', {
+# 'url_resolver': lambda url: github_doc_root + url,
+# 'auto_toc_tree_section': 'Contents',
+# }, True)
+# app.add_transform(AutoStructify)
+
+extensions = [
+ 'sphinx.ext.autodoc',
+ 'sphinxemoji.sphinxemoji',
+ 'sphinx_tabs.tabs',
+ 'sphinx.ext.intersphinx',
+ 'sphinx.ext.autosectionlabel',
+ 'sphinx.ext.todo',
+ 'sphinx.ext.coverage',
+ 'sphinx.ext.mathjax',
+ 'sphinx.ext.ifconfig',
+ 'sphinx.ext.viewcode',
+ 'sphinx_sitemap',
+ 'sphinx.ext.graphviz',
+ 'sphinx.ext.inheritance_diagram',
+ 'breathe',
+ 'exhale'
+
+]
+
+autosectionlabel_prefix_document = True
+# source_parsers = {
+# '.md': 'recommonmark.parser.CommonMarkParser',
+# }
+
+source_suffix = [
+ '.rst',
+ # '.md'
+]
+
+suppress_warnings = ['autosectionlabel.*', 'epub.duplicated_toc_entry']
+
+# Setup the exhale extension
+exhale_args = {
+ # These arguments are required
+ "containmentFolder": "./exhale-auto-docs",
+ "rootFileName": "api_list.rst",
+ "rootFileTitle": "API List",
+ "doxygenStripFromPath": "..",
+ # Suggested optional arguments
+ "createTreeView": True,
+ # TIP: if using the sphinx-bootstrap-theme, you need
+ # "treeViewIsBootstrap": True,
+ "exhaleExecutesDoxygen": True,
+ # "exhaleUseDoxyfile" : True,
+ "exhaleDoxygenStdin": textwrap.dedent('''
+ INPUT = ../src
+ GENERATE_LATEX = NO
+ GENERATE_HTML = YES
+ GENERATE_XML = YES
+ RECURSIVE = YES
+ VERBATIM_HEADERS = NO
+ EXCLUDE = ./../src/framework/raspberrypi/examples ./../src/framework/raspberrypi/examples_py ./../src/framework/arduino/examples ./../src/framework/arduino/README.md
+ '''),
+
+ # Configure what not to show in the API index page
+ "unabridgedOrphanKinds": {"function", "define", "dir","file", "variable", "namespace"},
+ "fullToctreeMaxDepth" : 4
+
+}
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# Tell sphinx what the primary language being documented is.
+primary_domain = 'cpp'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'build', 'Thumbs.db', '.DS_Store']
+
+highlight_language = 'c++'
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+
+html_theme = 'sphinx_rtd_theme'
+# html_theme_options = {
+# "head_font_family" : "Source Sans Pro",
+# "font_family" : "Source Sans Pro",
+# "body_text_align" : "justify",
+# }
+
+html_logo = 'img/ifx_logo_white_green_s.png'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_templates']
+
+# -- Breathe configuration -------------------------------------------------
+
+breathe_projects = {
+ "High-Side Switch": "build/xml/"
+}
+breathe_default_project = "High-Side Switch"
+breathe_default_members = ('members', 'undoc-members')
\ No newline at end of file
diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile
new file mode 100755
index 0000000..96f405f
--- /dev/null
+++ b/docs/doxygen/Doxyfile
@@ -0,0 +1,41 @@
+PROJECT_NAME = "high-side-switch"
+PROJECT_NUMBER = 1.0.0
+PROJECT_BRIEF = "C/C++ library for the PROFET™ smart high side switch from Infineon"
+OUTPUT_DIRECTORY = ./build
+CREATE_SUBDIRS = YES
+EXTRACT_ALL = YES
+INPUT = ./doxygen ./../src
+EXCLUDE = ./../src/framework/raspberrypi/examples ./../src/framework/raspberrypi/examples_py ./../src/framework/arduino/examples ./../src/framework/arduino/README.md
+RECURSIVE = YES
+ENABLE_PREPROCESSING = YES
+SORT_MEMBER_DOCS = NO
+USE_MDFILE_AS_MAINPAGE = NO
+DISABLE_INDEX = YES
+GENERATE_TREEVIEW = YES
+GENERATE_XML = YES
+GENERATE_HTML = NO
+FULL_PATH_NAMES = NO
+PROJECT_LOGO = ./img/ifx_logo_white_green_s.png
+GENERATE_TODOLIST = NO
+IMAGE_PATH =
+GENERATE_LATEX = NO
+WARN_LOGFILE = ./../docs/doxygen/build/doxygen-log.txt
+HAVE_DOT = YES
+CALL_GRAPH = YES
+ALWAYS_DETAILED_SEC = YES
+INLINE_INHERITED_MEMB = YES
+SEPARATE_MEMBER_PAGES = YES
+OPTIMIZE_OUTPUT_FOR_C = YES
+MARKDOWN_SUPPORT = YES
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = YES
+CPP_CLI_SUPPORT = YES
+SIP_SUPPORT = YES
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+GROUP_NESTED_COMPOUNDS = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = YES
+INLINE_SIMPLE_STRUCTS = YES
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
\ No newline at end of file
diff --git a/docs/doxygen/group_defs.dox b/docs/doxygen/group_defs.dox
index 3aebd42..7d0c540 100644
--- a/docs/doxygen/group_defs.dox
+++ b/docs/doxygen/group_defs.dox
@@ -2,8 +2,6 @@
/** @defgroup hssPal Platform Abstraction Layer */
-/** @defgroup hssUtils Utils */
-
/** @defgroup hssConfig Config */
/** @defgroup hssFrameworks HSS Frameworks
@@ -18,4 +16,4 @@
/** @} */
/** @} */
-
+
diff --git a/docs/hw-platforms.rst b/docs/hw-platforms.rst
new file mode 100755
index 0000000..0a0ecad
--- /dev/null
+++ b/docs/hw-platforms.rst
@@ -0,0 +1,311 @@
+The following Infineon products are supported by this library:
+
+PROFET\ |trade|\ + 24V family
+-----------------------------
+.. |trade| unicode:: U+2122 .. TRADEMARK SIGN
+
+.. image:: img/btt6x_shield.jpg
+ :width: 150
+
+.. image:: img/btt6x_chip.jpg
+ :width: 150
+
+Shields for Arduino
+"""""""""""""""""""
+
+* `24V Protected Switch Shield with BTT6030-2EKA and BTT6020-1EKA`_
+
+Pinout Diagram
+^^^^^^^^^^^^^^
+
+.. image:: img/shield_btt6030_pinout.png
+ :width: 450
+
+Pin Description
+^^^^^^^^^^^^^^^
+
+.. list-table::
+ :header-rows: 1
+
+ * - Arduino Pin
+ - Symbol
+ - Type
+ - Function
+ * - GND
+ - GND
+ - \-
+ - Ground
+ * - D2
+ - DSEL 0
+ - Input/digital
+ - Diagnostic select PROFET\ |trade|\ + 24V device no. 0. Selects if the diagnosis of channel 0 or 1 is muxed to the IS Pin.
+ * - D3
+ - IN 0.1
+ - Input/PWM
+ - Input to switch channel 1 on PROFET\ |trade|\ + 24V device no. 0.
+ * - D4
+ - IN 1.0
+ - Input/PWM
+ - Input to switch channel 0 on PROFET\ |trade|\ + 24V device no. 1.
+ * - D5
+ - DEN 1
+ - Input/digital
+ - Turns diagnosis for PROFET\ |trade|\ + 24V device no. 1 on or off.
+ * - D6
+ - DSEL 1
+ - Input/digital
+ - Diagnostic select PROFET\ |trade|\ + 24V device no. 1. Selects if the diagnosis of channel 0 or 1 is muxed to the IS Pin.
+ * - D7
+ - IN 1.1
+ - Input/PWM
+ - Input to switch channel 1 on PROFET\ |trade|\ + 24V device no. 1.
+ * - D8
+ - IN 2
+ - Input/PWM
+ - Input to switch channel on PROFET\ |trade|\ + 24V device no. 2.
+ * - D9
+ - DEN 2
+ - Input/digital
+ - Turns diagnosis for PROFET\ |trade|\ + 24V device no. 2 on or off.
+ * - A0
+ - IS 0
+ - Output/analog
+ - Current sense of PROFET\ |trade|\ + 24V device no. 0
+ * - A1
+ - IS 1
+ - Output/analog
+ - Current sense of PROFET\ |trade|\ + 24V device no. 1
+ * - A2
+ - IS 2
+ - Output/analog
+ - Current sense of PROFET\ |trade|\ + 24V device no. 2
+ * - A3
+ - IN 0.0
+ - Input/PWM
+ - Input to switch channel 0 on PROFET\ |trade|\ + 24V device no. 0.
+ * - A4
+ - DEN 0
+ - Input/digital
+ - Turns diagnosis for PROFET\ |trade|\ + 24V device no. 0 on or off.
+ * - \-
+ - OUT x.y
+ - \-
+ - Power output of channel y on PROFET\ |trade|\ + 24V device no. x.
+ * - \-
+ - Vs
+ - \-
+ - Supply input
+
+Chip only
+"""""""""
+
+* `BTT6020-1EKA`_
+* `BTT6030-2EKA`_
+
+Power PROFET\ |trade|\ family
+------------------------------
+
+.. image:: img/bts5001x_shield.png
+ :width: 150
+
+.. image:: img/bts5001x_chip.jpg
+ :width: 150
+
+Shields for Arduino
+"""""""""""""""""""
+
+* `12V Protected Switch Shield with BTS50010-1TAD`_
+* `12V Protected Switch Shield with BTS50015-1TAD`_
+
+Pinout Diagram
+^^^^^^^^^^^^^^
+
+.. image:: img/shield_bts500xx_pinout.png
+ :width: 450
+
+Pin Description
+^^^^^^^^^^^^^^^
+
+.. list-table::
+ :header-rows: 1
+
+ * - Arduino Pin
+ - Symbol
+ - Type
+ - Function
+ * - GND
+ - GND
+ - \-
+ - Ground
+ * - D5
+ - TP COMP 1
+ - Output/digital
+ - Input to check state of comperator 1, can be measured at tespoint TP_COMP1.
+ * - D6
+ - IN - BTS500xx
+ - Input/PWM
+ - Input of BTS500xx chip to switch on / off.
+ * - D9
+ - LED2
+ - Input/PWM
+ - Input to shield LED no. 2.
+ * - D19
+ - LED1
+ - Input/PWM
+ - Input to shield LED no. 1.
+ * - A0
+ - S2
+ - Output/digital
+ - Handling of user input. External Key can be connected, low active.
+ * - A2
+ - IS
+ - Output/analog
+ - Measuring of current IS.
+ * - A3
+ - TP 5V
+ - Output/analog
+ - Measuring availability of 5V.
+ * - A5
+ - VBAT
+ - Output/analog
+ - Measuring of VBAT via voltage divider.
+
+
+Chip only
+"""""""""
+
+* `BTS50010-1TAD`_
+* `BTS50015-1TAD`_
+
+PROFET\ |trade|\ +2 12V family
+------------------------------
+
+.. image:: img/bts700x_shield.jpg
+ :width: 150
+
+.. image:: img/bts700x_chip.png
+ :width: 100
+
+Shields for Arduino
+"""""""""""""""""""
+
+* `12V Smart Switch Shield with BTS7002-1EPP`_
+* `12V Smart Switch Shield with BTS7004-1EPP`_
+* `12V Smart Switch Shield with BTS7006-1EPP`_
+* `12V Smart Switch Shield with BTS7008-1EPP`_
+
+Pinout Diagram
+^^^^^^^^^^^^^^
+
+.. image:: img/shield_bts700x_pinout.png
+ :width: 450
+
+Pin Description
+^^^^^^^^^^^^^^^
+
+.. list-table::
+ :header-rows: 1
+
+ * - Arduino Pin
+ - Symbol
+ - Type
+ - Function
+ * - GND
+ - GND
+ - \-
+ - Ground
+ * - D2
+ - Push button digital
+ - Output/digital
+ - Push button digital (optional).
+ * - D3
+ - IN4
+ - Input/PWM
+ - Input PROFET\ |trade|\ +2 device U4.
+ * - D4
+ - LED1
+ - Input/PWM
+ - Indicator LED 1.
+ * - D5
+ - LED2
+ - Input/PWM
+ - Indicator LED 2.
+ * - D6
+ - DEN 1+3
+ - Input/digital
+ - Diagnosis enable PROFET\ |trade|\ +2 device U1+U3.
+ * - D7
+ - OLOFF
+ - Input/digital
+ - Option for *Open Load in OFF* detection.
+ * - D8
+ - DEN 2+4
+ - Input/digital
+ - Diagnosis enable PROFET\ |trade|\ +2 device U2+U4.
+ * - D9
+ - IN1
+ - Input/PWM
+ - Input PROFET\ |trade|\ +2 device U1.
+ * - D10
+ - IN2
+ - Input/PWM
+ - Input PROFET\ |trade|\ +2 device U2.
+ * - D11
+ - IN3
+ - Input/PWM
+ - Input PROFET\ |trade|\ +2 device U3.
+ * - D12
+ - LED3
+ - Input/PWM
+ - Indicator LED 3.
+ * - D13
+ - LED4
+ - Input/PWM
+ - Indicator LED 4.
+ * - \-
+ - VIN
+ - \-
+ - Supply voltage.
+ * - A0
+ - Push button analog
+ - Output/analog
+ - Push button analog (optional).
+ * - A1
+ - VBAT
+ - Output/analog
+ - Measuring of VBAT via voltage divider.
+ * - A2
+ - IS 1+2
+ - Output/analog
+ - Current sense of PROFET\ |trade|\ +2 device U1+U2.
+ * - A3
+ - IS 3+4
+ - Output/analog
+ - Current sense of PROFET\ |trade|\ +2 device U3+U4.
+
+Chip only
+"""""""""
+
+* `BTS7002-1EPP`_
+* `BTS7004-1EPP`_
+* `BTS7006-1EPP`_
+* `BTS7008-1EPP`_
+
+
+.. _`BTT6020-1EKA`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-24v-automotive-smart-high-side-switch/btt6020-1era/
+.. _`BTT6030-2EKA`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-24v-automotive-smart-high-side-switch/btt6030-2era/
+.. _`BTS50010-1TAD`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/power-profet-automotive-smart-high-side-switch/bts50010-1tad/
+.. _`BTS50015-1TAD`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/power-profet-automotive-smart-high-side-switch/bts50015-1tad/
+.. _`BTS7002-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7002-1epp/?redirId=103258
+.. _`BTS7004-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7004-1epp/
+.. _`BTS7006-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7006-1epp/
+.. _`BTS7008-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7008-1epp/
+
+
+.. _`24V Protected Switch Shield with BTT6030-2EKA and BTT6020-1EKA`: https://www.infineon.com/cms/en/product/evaluation-boards/24v_shield_btt6030/
+.. _`12V Protected Switch Shield with BTS50010-1TAD`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts50010-1tad/
+.. _`12V Protected Switch Shield with BTS50015-1TAD`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts50015-1tad/
+.. _`12V Smart Switch Shield with BTS7002-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7002-1epp/
+.. _`12V Smart Switch Shield with BTS7004-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7004-1epp/
+.. _`12V Smart Switch Shield with BTS7006-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7006-1epp/
+.. _`12V Smart Switch Shield with BTS7008-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7008-1epp/
\ No newline at end of file
diff --git a/docs/img/BTS50015-1TAD.jpg b/docs/img/BTS50015-1TAD.jpg
new file mode 100644
index 0000000..2ffa308
Binary files /dev/null and b/docs/img/BTS50015-1TAD.jpg differ
diff --git a/docs/img/BTT6020-1EKA.jpg b/docs/img/BTT6020-1EKA.jpg
new file mode 100644
index 0000000..ba2a97d
Binary files /dev/null and b/docs/img/BTT6020-1EKA.jpg differ
diff --git a/docs/img/XMC1100.jpg b/docs/img/XMC1100.jpg
new file mode 100644
index 0000000..4ae3b79
Binary files /dev/null and b/docs/img/XMC1100.jpg differ
diff --git a/docs/img/arduino-hss-stack.png b/docs/img/arduino-hss-stack.png
new file mode 100644
index 0000000..d0be7d9
Binary files /dev/null and b/docs/img/arduino-hss-stack.png differ
diff --git a/docs/img/arduino-logo.png b/docs/img/arduino-logo.png
new file mode 100644
index 0000000..02dd3c6
Binary files /dev/null and b/docs/img/arduino-logo.png differ
diff --git a/docs/img/arduino-marked.png b/docs/img/arduino-marked.png
new file mode 100644
index 0000000..d409222
Binary files /dev/null and b/docs/img/arduino-marked.png differ
diff --git a/docs/img/bts5001x_chip.jpg b/docs/img/bts5001x_chip.jpg
new file mode 100644
index 0000000..000104a
Binary files /dev/null and b/docs/img/bts5001x_chip.jpg differ
diff --git a/docs/img/bts5001x_shield.png b/docs/img/bts5001x_shield.png
new file mode 100644
index 0000000..0cef15a
Binary files /dev/null and b/docs/img/bts5001x_shield.png differ
diff --git a/docs/img/bts700x_chip.png b/docs/img/bts700x_chip.png
new file mode 100644
index 0000000..9c95262
Binary files /dev/null and b/docs/img/bts700x_chip.png differ
diff --git a/docs/img/bts700x_shield.jpg b/docs/img/bts700x_shield.jpg
new file mode 100644
index 0000000..78a23ae
Binary files /dev/null and b/docs/img/bts700x_shield.jpg differ
diff --git a/docs/img/btt6x_chip.jpg b/docs/img/btt6x_chip.jpg
new file mode 100644
index 0000000..33b5a2e
Binary files /dev/null and b/docs/img/btt6x_chip.jpg differ
diff --git a/docs/img/btt6x_shield.jpg b/docs/img/btt6x_shield.jpg
new file mode 100644
index 0000000..b8911c7
Binary files /dev/null and b/docs/img/btt6x_shield.jpg differ
diff --git a/docs/img/cross-platform.png b/docs/img/cross-platform.png
new file mode 100644
index 0000000..7dcc8f9
Binary files /dev/null and b/docs/img/cross-platform.png differ
diff --git a/docs/img/gh-master-zip.png b/docs/img/gh-master-zip.png
new file mode 100644
index 0000000..e112252
Binary files /dev/null and b/docs/img/gh-master-zip.png differ
diff --git a/docs/img/hss-marked.png b/docs/img/hss-marked.png
new file mode 100644
index 0000000..19cea4e
Binary files /dev/null and b/docs/img/hss-marked.png differ
diff --git a/docs/img/hss-powercon.png b/docs/img/hss-powercon.png
new file mode 100644
index 0000000..7d98afa
Binary files /dev/null and b/docs/img/hss-powercon.png differ
diff --git a/docs/img/hss-stack.png b/docs/img/hss-stack.png
new file mode 100755
index 0000000..56ab60b
Binary files /dev/null and b/docs/img/hss-stack.png differ
diff --git a/docs/img/ifx-gen-arch.png b/docs/img/ifx-gen-arch.png
new file mode 100755
index 0000000..0850566
Binary files /dev/null and b/docs/img/ifx-gen-arch.png differ
diff --git a/docs/img/ifx_logo_white_green_s.png b/docs/img/ifx_logo_white_green_s.png
new file mode 100644
index 0000000..0b11976
Binary files /dev/null and b/docs/img/ifx_logo_white_green_s.png differ
diff --git a/docs/img/mtb-logo.png b/docs/img/mtb-logo.png
new file mode 100644
index 0000000..5a3644c
Binary files /dev/null and b/docs/img/mtb-logo.png differ
diff --git a/docs/img/rpi-logo.png b/docs/img/rpi-logo.png
new file mode 100644
index 0000000..3884d81
Binary files /dev/null and b/docs/img/rpi-logo.png differ
diff --git a/docs/img/shield_bts500xx_pinout.png b/docs/img/shield_bts500xx_pinout.png
new file mode 100644
index 0000000..d003151
Binary files /dev/null and b/docs/img/shield_bts500xx_pinout.png differ
diff --git a/docs/img/shield_bts700x_pinout.png b/docs/img/shield_bts700x_pinout.png
new file mode 100644
index 0000000..be468a3
Binary files /dev/null and b/docs/img/shield_bts700x_pinout.png differ
diff --git a/docs/img/shield_btt6030_pinout.png b/docs/img/shield_btt6030_pinout.png
new file mode 100644
index 0000000..7755097
Binary files /dev/null and b/docs/img/shield_btt6030_pinout.png differ
diff --git a/docs/img/wiced-logo.png b/docs/img/wiced-logo.png
new file mode 100644
index 0000000..52caea3
Binary files /dev/null and b/docs/img/wiced-logo.png differ
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..43c003f
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,125 @@
+**************
+Introduction
+**************
+Welcome to the Infineon Smart High-Side Switch library docs!
+
+.. image:: img/btt6x_shield.jpg
+ :height: 75
+
+.. image:: img/btt6x_chip.jpg
+ :height: 75
+
+.. image:: img/bts5001x_shield.png
+ :height: 75
+
+.. image:: img/bts5001x_chip.jpg
+ :height: 75
+
+.. image:: img/bts700x_shield.jpg
+ :height: 75
+
+.. image:: img/bts700x_chip.png
+ :height: 75
+
+Scope
+=====
+This library covers the following products:
+
+.. |trade| unicode:: U+2122 .. TRADEMARK SIGN
+
+PROFET\ |trade|\ + 24V family
+-----------------------------
+
+* `24V Protected Switch Shield with BTT6030-2EKA and BTT6020-1EKA`_
+
+* `BTT6020-1EKA`_
+* `BTT6030-2EKA`_
+
+Power PROFET\ |trade|\ family
+------------------------------
+
+* `12V Protected Switch Shield with BTS50010-1TAD`_
+* `12V Protected Switch Shield with BTS50015-1TAD`_
+
+* `BTS50010-1TAD`_
+* `BTS50015-1TAD`_
+
+PROFET\ |trade|\ +2 12V family
+------------------------------
+
+* `12V Smart Switch Shield with BTS7002-1EPP`_
+* `12V Smart Switch Shield with BTS7004-1EPP`_
+* `12V Smart Switch Shield with BTS7006-1EPP`_
+* `12V Smart Switch Shield with BTS7008-1EPP`_
+
+* `BTS7002-1EPP`_
+* `BTS7004-1EPP`_
+* `BTS7006-1EPP`_
+* `BTS7008-1EPP`_
+
+.. _`BTT6020-1EKA`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-24v-automotive-smart-high-side-switch/btt6020-1era/
+.. _`BTT6030-2EKA`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-24v-automotive-smart-high-side-switch/btt6030-2era/
+.. _`BTS50010-1TAD`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/power-profet-automotive-smart-high-side-switch/bts50010-1tad/
+.. _`BTS50015-1TAD`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/power-profet-automotive-smart-high-side-switch/bts50015-1tad/
+.. _`BTS7002-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7002-1epp/?redirId=103258
+.. _`BTS7004-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7004-1epp/
+.. _`BTS7006-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7006-1epp/
+.. _`BTS7008-1EPP`: https://www.infineon.com/cms/en/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-2-12v-automotive-smart-high-side-switch/bts7008-1epp/
+.. _`24V Protected Switch Shield with BTT6030-2EKA and BTT6020-1EKA`: https://www.infineon.com/cms/en/product/evaluation-boards/24v_shield_btt6030/
+.. _`12V Protected Switch Shield with BTS50010-1TAD`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts50010-1tad/
+.. _`12V Protected Switch Shield with BTS50015-1TAD`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts50015-1tad/
+.. _`12V Smart Switch Shield with BTS7002-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7002-1epp/
+.. _`12V Smart Switch Shield with BTS7004-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7004-1epp/
+.. _`12V Smart Switch Shield with BTS7006-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7006-1epp/
+.. _`12V Smart Switch Shield with BTS7008-1EPP`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7008-1epp/
+
+License
+=======
+
+Please find the license file for this library `here `_.
+
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Home
+ :hidden:
+
+ Introduction
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Hardware Platforms
+ :hidden:
+
+ hw-platforms
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Library Details
+ :hidden:
+
+ Library Architecture
+ Porting Guide
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Software Frameworks
+ :hidden:
+
+ sw-frmwk/arduino/index
+
+.. toctree::
+ :maxdepth: 5
+ :caption: API Reference
+ :hidden:
+
+ Modules
+ Full API
+ File List
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Related Links
+ :hidden:
+
+ links
\ No newline at end of file
diff --git a/docs/lib-details/library-architecture.rst b/docs/lib-details/library-architecture.rst
new file mode 100644
index 0000000..db14397
--- /dev/null
+++ b/docs/lib-details/library-architecture.rst
@@ -0,0 +1,75 @@
+Library Architecture
+--------------------
+
+The High-side Switch library follows the architecture pattern shown in the stack diagram:
+
+.. image:: ../img/ifx-gen-arch.png
+ :height: 400
+
+The monolithic core library can be universally integrated across any low level peripheral drivers, embedded operating system, and middleware of each software framework.
+
+The reusability and interoperability is achieved by defining a Platform Abstraction Layer (PAL) interface which is implemented by each framework for its specific hardware abstraction layer and operating system resources APIs.
+
+Additionally, the core library API is accommodated and adapted to the particularities of each software framework. The framework API wrappers intend to harmonize the core library API with that of the software development framework in which it is integrated, making it easier for the users already familiarized with the development framework.
+
+The support for the multiple hardware platforms is then provided by each development framework.
+
+The specific High-side Switch library modules are depicted more specifically below:
+
+.. image:: ../img/hss-stack.png
+ :height: 600
+
+In the next sections, the information of the main architecture modules for the High-side Switch library is extended.
+To explore the specific code implementation, navigate to the :ref:`Reference API ` section
+
+
+Core Library
+""""""""""""
+
+The core library contains all the library logic and high level functionalities of the sensor peripheral. The core library remains C++ agnostic by interacting with the specific platform (and framework) through a Platform Abstraction Layer interface. No other dependencies than standard C/C++ modules and the PAL are found in these sources.
+
+Additionally to the Hss class, a HssShield implements an abstract interface to be used by the shields core API implementations.
+Each shield family includes its specialization, and uses the number of high-side switch instances required for a given shield.
+
+These code sources can be found under "src/corelib".
+
+The core lib API provides access to all High-side Switch functionalities given the instances to the required PAL instances. Find more information in the :ref:`High-side Switch API ` and the different :ref:`High-side Switch Shields API ` sections.
+
+Platform Abstraction Layer (PAL) Interface
+""""""""""""""""""""""""""""""""""""""""""
+
+The Platform Abstraction Layer Interface is implemented via abstract C++ classes declaring all the necessary platform resources and functionalities that need to be provided by the specific framework-platform implementation.
+
+The simple High-side Switch specifies in its PAL modules an ADC class, a GPIO class, and a Timer class. Its implementation is located in the "src/pal" folder.
+
+The PAL interfaces functions, behavior description and implementation details, can be found in the :ref:`PAL Interface ` section.
+
+Framework PAL
+"""""""""""""
+
+The PAL interfaces is defined for each embedded software framework through its low level peripheral drivers and operating system resources APIs. The ADC, GPIO and Timer interface abstract classes are inherited and defined in this layer.
+
+The "src/framework/sample_fmwk/pal" folder contains the pal implementation for the particular framework.
+
+Find more information about the supported software development frameworks in the Software Frameworks section.
+
+Framework API Wrapper
+"""""""""""""""""""""
+
+The idea behind this layer is to adapt the library in order to comply with the programming conventions of the integrated programming framework or ecosystem.
+
+Operating system libraries, low level driver of hardware peripherals (digital input/outputs, PWM, analog conversion, etc.) or other middleware resources are implemented for each development framework following certain patterns for functions, parameters, and primitive types.
+
+At these level, certain platform functionalities required by High-side Switch can be already defined and adapted to the API available resources: functions prototypes, framework core libraries, low level driver HAL, programming patterns, and even framework feel and look aspects.
+
+The frameworks wrapper API files are located in the "src/framework/sample_fmwk/wrapper" folders.
+
+Find more information about each software development frameworks API in the Software Frameworks section.
+
+Predefined Hardware Platforms
+"""""""""""""""""""""""""""""
+
+Given a particular hardware platform and development software framework, most of the resources and its configuration can be already determined by default. This part of the framework API just define some pre configured instances for common and officially supported evaluation kits based configuration.
+
+These instances are available in the "src/framework/sample_fmwk/wrapper/zzz-platf-xxx.hpp/cpp" source files.
+
diff --git a/docs/lib-details/porting-guide.rst b/docs/lib-details/porting-guide.rst
new file mode 100755
index 0000000..e43b434
--- /dev/null
+++ b/docs/lib-details/porting-guide.rst
@@ -0,0 +1,76 @@
+Porting Guide
+==============
+
+Porting the library to a new software development framework and hardware
+platform entails the implementation of the corresponding ADC, GPIO and Timer
+PAL classes. In the following sections, some additional explanations and
+hints are provided:
+
+Framework PAL Implementation
+----------------------------
+
+Implement the abstract PAL interface for you framework. The **ADC
+class**, **GPIO class** and **Timer class** are mandatory.
+
+The Doxygen comments on the *“src/pal/hss-pal-adc.hpp”*, *“src/pal/hss-pal-gpio.hpp”*
+and *“src/pal/hss-pal-timer.hpp”* describe the required behavior of each function
+of the :ref:`PAL Interface `.
+
+Consider the existing framework implementations as reference examples
+for you design: *“/src/framework/sample_fmwk/pal”*. Some of the
+functions are optional depending on your framework and intended usage of
+the library.
+
+That is the case of *init()* and *deinit()*, which take care of the
+hardware peripherals init/deinitialization. If this is done in your main
+application (or somewhere else outside the library), there is no need of
+delegating such initialization to the High-side Switch library. The definition
+of these functions can just be a return with the success return code.
+
+Framework API Wrapper
+---------------------
+
+The framework API wrapper implementation is optional, it is meant to
+ease the usage. Mostly the main help is to avoid the creation of the
+ADC, GPIO and Timer object instances for the developer.
+
+To illustrate this approach, it is easier to evaluate a concrete
+implementation of the Arduino wrapper. For example the constructor of
+the *Hss* class, which can be found in the files
+*“src/corelib/hss.cpp”*.
+
+1. Adapt the constructor arguments to those used for the platform class
+ creation (ADC, GPIO and Timer) in the new framework, using the native
+ data types and structures. Hide what can be already defined for that
+ platform and provide as much abstraction and simplicity as possible.
+
+ For example, the core library of the base constructor is defined like
+ this:
+
+ .. code-block:: C
+
+ Hss(GPIOPAL *den, GPIOPAL *in, ADCPAL *is, TimerPAL *timer, BtxVariants_t *btxVariant);
+
+ is wrapped for Arduino like this:
+
+ .. code-block:: C
+
+ HssIno(uint8_t den, uint8_t in0, uint8_t in1, uint8_t dsel, uint8_t is, BtxVariants_t * btxVariant);
+
+ While it does not seems to simplify much in number of arguments, an
+ Arduino developer can simply pass the pin number as argument, and
+ does not need to deal with the (probably unknown) GPIO classes,
+ neither specify further GPIO configuration as the mode (input,
+ output, pull-up..), positive/negative logic, etc.
+
+ As for the constructor, the same philosophy can apply to other
+ functions of the public API. In case of Arduino, as a hobbyist and
+ makers environment, clarity and simplicity might prevail over
+ configurability and functionality. Therefore, the :ref:`wrapper
+ API ` further hides, group or eliminate certain
+ functionalities.
+
+ For each ecosystem and framework, any other criteria can be chosen,
+ hopefully matching as well its code conventions, implementation
+ principles and paradigms.
+
diff --git a/docs/links.rst b/docs/links.rst
new file mode 100644
index 0000000..2d35132
--- /dev/null
+++ b/docs/links.rst
@@ -0,0 +1,21 @@
+Related Products
+----------------
+
+* `XMC1100 Boot Kit `__
+* `Arduino Uno Rev3 `__
+* `Arduino IDE `__
+* `PlatformIO `__
+
+Related Repositories
+--------------------
+
+* `Infineon Github `__
+* `XMC for Arduino `__
+* `Infineon XMC PlatformIO `__
+
+More
+----
+
+* `Infineon for Makers `__
+* `Arduino `__
+* `PlatformIO `__
\ No newline at end of file
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..baa1544
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,8 @@
+Sphinx==4.3.1
+sphinx-rtd-theme==0.5.0
+sphinx-sitemap==2.2.0
+recommonmark==0.6.0
+sphinxemoji==0.1.8
+sphinx-tabs
+breathe>=4.13.0
+exhale
\ No newline at end of file
diff --git a/docs/sw-frmwk/arduino/arduino-api.rst b/docs/sw-frmwk/arduino/arduino-api.rst
new file mode 100644
index 0000000..6f3f4b7
--- /dev/null
+++ b/docs/sw-frmwk/arduino/arduino-api.rst
@@ -0,0 +1,11 @@
+.. _arduino-api:
+
+Arduino API
+===========
+
+The primary APIs provided in Arduino are supporting the direct usage of the shields.
+Check the complete API reference in the following links for each board:
+
+* :ref:`Bts700xShieldIno API`
+* :ref:`Bts5001xShieldIno API`
+* :ref:`Btt60xxShieldIno API`
diff --git a/docs/sw-frmwk/arduino/arduino-compatible-kits.rst b/docs/sw-frmwk/arduino/arduino-compatible-kits.rst
new file mode 100644
index 0000000..2a4a390
--- /dev/null
+++ b/docs/sw-frmwk/arduino/arduino-compatible-kits.rst
@@ -0,0 +1,34 @@
+.. _arduino-compatible-kits:
+
+Arduino Compatible Kits
+=======================
+
+This library is designed for multiple platforms with Arduino Uno compatible headers and different SDKs. The following hardware platforms are compatible and tested:
+
+.. list-table::
+ :header-rows: 1
+
+ * - Hardware Platform
+ - Type
+ - SDK
+ - File Marker
+ - Checked
+ * - Arduino
+ - Uno
+ - Arduino IDE or PlatformIO
+ - \*.ino
+ - yes
+ * - Arduino
+ - Mega
+ - Arduino IDE or PlatformIO
+ - \*.ino
+ - yes
+ * - Infineon XMC
+ - XMC4700 Relax Kit
+ - Arduino IDE or PlatformIO
+ - \*.ino
+ - yes
+
+Any MCU platform which has an Arduino port like the `XMC for Arduino`_ should work (this is not tested) with this shield by using the default Arduino platform.
+
+.. _`XMC for Arduino`: https://github.com/Infineon/XMC-for-Arduino
\ No newline at end of file
diff --git a/docs/sw-frmwk/arduino/arduino-examples.rst b/docs/sw-frmwk/arduino/arduino-examples.rst
new file mode 100644
index 0000000..29ded4f
--- /dev/null
+++ b/docs/sw-frmwk/arduino/arduino-examples.rst
@@ -0,0 +1,492 @@
+.. _arduino-examples:
+
+Arduino Examples
+================
+You can find these examples also in the Arduino IDE by navigating to *File* -> *Examples* -> *high-side-switch-ino*.
+
+.. list-table::
+ :header-rows: 1
+
+ * - Example
+ - Summary
+ * - :code:`examples/BTT600x-hss-advanced`
+ - * Default high-side-switch advanced test.
+ * Compatible with BTT60xx variants.
+ * - :code:`examples/BTT600x-hss-multiple-ch`
+ - * High-side-switch example to operate multiple channels.
+ * Compatible with BTT60xx variants.
+ * - :code:`examples/BTT600x-hss-single-ch`
+ - * Basic High-side-switch example to operate single channel.
+ * Compatible with BTT60xx variants.
+ * - :code:`examples/BTS700x-hss-advanced`
+ - * Default high-side-switch advanced test.
+ * Compatible with BTS7002, BTS7004, BTS7006, BTS7008 variant.
+ * - :code:`examples/BTS700x-hss-multiple-ch`
+ - * High-side-switch example to operate multiple channels.
+ * Compatible with BTS7002, BTS7004, BTS7006, BTS7008 variant.
+ * - :code:`examples/BTS700x-hss-single-ch`
+ - * Basic High-side-switch example to operate single channel.
+ * Compatible with BTS7002, BTS7004, BTS7006, BTS7008 variant.
+ * - :code:`examples/BTS700x-button-test`
+ - * Switch dependent on optional user button.
+ * Compatible with BTS7002, BTS7004, BTS7006, BTS7008 variant.
+ * - :code:`examples/BTS5001x-hss-advanced`
+ - * Default high-side-switch advanced test.
+ * Compatible with BTS50010 and BTS50015 variant.
+ * - :code:`examples/BTS5001x-hss-single-ch`
+ - * Basic High-side-switch example to operate single channel.
+ * Compatible with BTS50010 and BTS50015 variant.
+ * - :code:`examples/BTS5001x-button-test`
+ - * Switch dependent on optional user button.
+ * Compatible with BTS50010 and BTS50015 variant.
+
+BTT600x-hss-advanced
+""""""""""""""""""""
+Summary
+^^^^^^^
+Default high-side-switch advanced test. Compatible with BTT60xx variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/btt6x_shield.jpg
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Shield
+ - Included Variants
+ - Supported Channels
+ * - 24V_SHIELD_BTT6030
+ - Profet 0 (BTT6030-2ERA)
+ - 2
+ * -
+ - Profet 1 (BTT6030-2ERA)
+ - 2
+ * -
+ - Profet 2 (BTT6020-1ERA)
+ - 1
+
+Description
+^^^^^^^^^^^
+This example shows the usage of the offered functionalities of the shield.
+It has 2 parts:
+
+1. Part A:
+ * Switches a channel ON
+ * Reads current through the switch, battery voltage and performs diagnosis in 'ON' state
+ * Switches the channel OFF
+
+2. Part B:
+ * Switch multiple channels 'ON' at once
+ * Switch multiple channels 'OFF' at once
+
+BTT600x-hss-multiple-ch
+""""""""""""""""""""""""
+Summary
+^^^^^^^
+High-side-switch example to operate multiple channels. Compatible with BTT60xx variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/btt6x_shield.jpg
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Shield
+ - Included Variants
+ - Supported Channels
+ * - 24V_SHIELD_BTT6030
+ - Profet 0 (BTT6030-2ERA)
+ - 2
+ * -
+ - Profet 1 (BTT6030-2ERA)
+ - 2
+ * -
+ - Profet 2 (BTT6020-1ERA)
+ - 1
+
+Description
+^^^^^^^^^^^
+This example demonstrates how to switch on/off multiple channels at once.
+In total, there are 5 channels provided in this board. Through this example,
+you can control these 5 channels at the same time by setting the required channels
+to true in the :code:`switch_no[5]` where index-0 maps to channel 0. See below channel to port mapping:
+
+.. list-table::
+ :header-rows: 1
+
+ * - Channel (in example code)
+ - Controls
+ - Mapped output port
+ * - :code:`switch_no[0] = true`
+ - Profet 0 (BTT6030-2ERA part 0 : channel 0)
+ - OUT 0.0
+ * - :code:`switch_no[1] = true`
+ - Profet 0 (BTT6030-2ERA part 0 : channel 1)
+ - OUT 0.1
+ * - :code:`switch_no[2] = true`
+ - Profet 1 (BTT6030-2ERA part 1 : channel 0)
+ - OUT 1.0
+ * - :code:`switch_no[3] = true`
+ - Profet 1 (BTT6030-2ERA part 1 : channel 1)
+ - OUT 1.1
+ * - :code:`switch_no[4] = true`
+ - Profet 2 (BTT6020-1ERA : channel 0)
+ - OUT 2
+
+BTT600x-hss-single-ch
+""""""""""""""""""""""
+Summary
+^^^^^^^
+Basic High-side-switch example to operate single channel. Compatible with BTT60xx variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/btt6x_shield.jpg
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Shield
+ - Included Variants
+ - Supported Channels
+ * - 24V_SHIELD_BTT6030
+ - Profet 0 (BTT6030-2ERA)
+ - 2
+ * -
+ - Profet 1 (BTT6030-2ERA)
+ - 2
+ * -
+ - Profet 2 (BTT6020-1ERA)
+ - 1
+
+Description
+^^^^^^^^^^^
+This is a basic high-side-switch example that demonstrates how to switch on/off a specific channel.
+Along with channel operation, you could also determine the sensed current of the channel.
+In total, there are 5 channels provided in this board and you can select which channel to function by setting
+correct number in :code:`switch_no`. See below switch to port mapping:
+
+.. list-table::
+ :header-rows: 1
+
+ * - Channel (in example code)
+ - Controls
+ - Mapped output port
+ * - :code:`switch_no = 0`
+ - Profet 0 (BTT6030-2ERA part 0 : channel 0)
+ - OUT 0.0
+ * - :code:`switch_no = 1`
+ - Profet 0 (BTT6030-2ERA part 0 : channel 1)
+ - OUT 0.1
+ * - :code:`switch_no = 2`
+ - Profet 1 (BTT6030-2ERA part 1 : channel 0)
+ - OUT 1.0
+ * - :code:`switch_no = 3`
+ - Profet 1 (BTT6030-2ERA part 1 : channel 1)
+ - OUT 1.1
+ * - :code:`switch_no = 4`
+ - Profet 2 (BTT6020-1ERA : channel 0)
+ - OUT 2
+
+BTS700x-hss-advanced
+""""""""""""""""""""
+Summary
+^^^^^^^
+Default high-side-switch advanced test. Compatible with BTS7002, BTS7004, BTS7006 and BTS7008 variant.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/bts700x_shield.jpg
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Type
+ - Variant
+ - Covered by
+ * - Shield
+ - BTS7002
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7004
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7006
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7008
+ - :code:`hss-bts700xShield-ino.hpp`
+
+Description
+^^^^^^^^^^^
+This example shows the usage of all the offered functionalities of the shield.
+It has 2 parts:
+
+1. Part A
+ * Switches a channel ON
+ * Reads current through the switch, battery voltage and performs diagnosis in 'ON' state
+ * Switches the channel OFF
+ * Reads current through the switch, battery voltage and performs diagnosis in 'OFF' state
+
+2. Part B
+ * Switch multiple channels 'ON' at once
+ * Switch multiple channels 'OFF' at once
+
+BTS700x-hss-multiple-ch
+""""""""""""""""""""""""
+Summary
+^^^^^^^
+High-side-switch example to operate multiple channels. Compatible with BTS7002, BTS7004, BTS7006, BTS7008 variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/bts700x_shield.jpg
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Type
+ - Variant
+ - Covered by
+ * - Shield
+ - BTS7002
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7004
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7006
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7008
+ - :code:`hss-bts700xShield-ino.hpp`
+
+Description
+^^^^^^^^^^^
+This example demonstrates how to switch on/off multiple channels at once.
+In total, there are 4 channels provided in this board. Through this example,
+you can control these 4 channels at the same time by setting the required channels
+to true in the :code:`switch_no[4]` where index-0 maps to channel 1. See below channel to port mapping:
+
+.. list-table::
+ :header-rows: 1
+
+ * - Channel (in example code)
+ - Controls
+ - Mapped output port
+ * - :code:`switch_no[0]`
+ - BTS700x U1
+ - OUT1
+ * - :code:`switch_no[1]`
+ - BTS700x U2
+ - OUT2
+ * - :code:`switch_no[2]`
+ - BTS700x U3
+ - OUT3
+ * - :code:`switch_no[3]`
+ - BTS700x U4
+ - OUT4
+
+BTS700x-hss-single-ch
+""""""""""""""""""""""
+Summary
+^^^^^^^
+Basic High-side-switch example to operate single channel. Compatible with BTT7002, BTS7004, BTS7006 and BTS7008 variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/bts700x_shield.jpg
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Type
+ - Variant
+ - Covered by
+ * - Shield
+ - BTS7002
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7004
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7006
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7008
+ - :code:`hss-bts700xShield-ino.hpp`
+
+Description
+^^^^^^^^^^^
+This is a basic high-side-switch example that demonstrates how to switch on/off a specific channel.
+Along with channel operation, you could also determine the sensed current of the channel.
+In total, there are 4 channels provided in the board and
+you can select which channel to operate by setting correct number in :code:`switch_no`. See below channel to port mapping:
+
+.. list-table::
+ :header-rows: 1
+
+ * - Channel (in example code)
+ - Controls
+ - Mapped output port
+ * - :code:`switch_no = 1`
+ - BTS700x U1
+ - OUT1
+ * - :code:`switch_no = 2`
+ - BTS700x U2
+ - OUT2
+ * - :code:`switch_no = 3`
+ - BTS700x U3
+ - OUT3
+ * - :code:`switch_no = 4`
+ - BTS700x U4
+ - OUT4
+
+BTS700x-button-test
+""""""""""""""""""""
+Summary
+^^^^^^^
+Switch dependent on optional user button. Compatible with BTS7002, BTS7004, BTS7006, BTS7008 variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/bts700x_shield.jpg
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Type
+ - Variant
+ - Covered by
+ * - Shield
+ - BTS7002
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7004
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7006
+ - :code:`hss-bts700xShield-ino.hpp`
+ * - Shield
+ - BTS7008
+ - :code:`hss-bts700xShield-ino.hpp`
+
+Description
+^^^^^^^^^^^
+BTS700x-1EPP Shield has an optional user button to perform switching.
+This example demonstrates the use of optional user button. This shield supports both
+digital and analog read button functionality which is configurable through jumpers (Refer manual for details).
+
+.. list-table::
+ :header-rows: 1
+
+ * - Jumper used
+ - Read button Function
+ * - J2
+ - analogReadButton()
+ * - J3
+ - digitalReadButton()
+
+In this example we use the digitalReadButton() functionality of the library
+to read out the VSS of the attached power supply. In case you wish to use analogReadButton()
+functionality, replace digitalReadButton() by analogReadButton().
+
+BTS5001x-hss-advanced
+""""""""""""""""""""""
+Summary
+^^^^^^^
+Default high-side-switch advanced test. Compatible with BTS50010 and BTS50015 variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/bts5001x_shield.png
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Type
+ - Variant
+ - Covered by
+ * - Shield
+ - BTS50010
+ - :code:`hss-bts500xxShield-ino.hpp`
+ * - Shield
+ - BTS50015
+ - :code:`hss-bts500xxShield-ino.hpp`
+
+Description
+^^^^^^^^^^^
+This example shows the usage of the offered functionalities of the shield. It does the following:
+ * Switches a channel ON
+ * Reads current through the switch, battery voltage and performs diagnosis in 'ON' state
+ * Switches the channel OFF
+
+This is a single channel supporting shield and hence the default configurations for channels are set in the library.
+
+BTS5001x-hss-single-ch
+""""""""""""""""""""""
+Summary
+^^^^^^^
+Basic High-side-switch example to operate single channel. Compatible with BTS50010 and BTS50015 variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/bts5001x_shield.png
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Type
+ - Variant
+ - Covered by
+ * - Shield
+ - BTS50010
+ - :code:`hss-bts500xxShield-ino.hpp`
+ * - Shield
+ - BTS50015
+ - :code:`hss-bts500xxShield-ino.hpp`
+
+Description
+^^^^^^^^^^^
+This is a basic high-side-switch example that demonstrates how to switch on/off a specific channel.
+Along with channel operation, you could also determine the sensed current of the channel.
+
+BTS5001x-button-test
+""""""""""""""""""""
+Summary
+^^^^^^^
+Switch dependent on optional user button. Compatible with BTS50010 and BTS50015 variants.
+
+Compatibility
+^^^^^^^^^^^^^
+.. image:: ../../img/bts5001x_shield.png
+ :width: 150
+
+.. list-table::
+ :header-rows: 1
+
+ * - Type
+ - Variant
+ - Covered by
+ * - Shield
+ - BTS50010
+ - :code:`hss-bts500xxShield-ino.hpp`
+ * - Shield
+ - BTS50015
+ - :code:`hss-bts500xxShield-ino.hpp`
+
+Description
+^^^^^^^^^^^
+BTS5001x-1TAD Shields have optional user button to perform switching.
+This example demonstrates the use of optional user button.
\ No newline at end of file
diff --git a/docs/sw-frmwk/arduino/arduino-getting-started.rst b/docs/sw-frmwk/arduino/arduino-getting-started.rst
new file mode 100644
index 0000000..9a685ff
--- /dev/null
+++ b/docs/sw-frmwk/arduino/arduino-getting-started.rst
@@ -0,0 +1,82 @@
+.. _arduino-getting-started:
+
+Arduino Getting Started
+=======================
+
+Overview
+--------
+
+This getting started guide helps you to properly connect a `Smart High-Side Power Switch shield`_ with the right platform and teaches you how to install the required software to use the Infineon High-Side Switches.
+
+.. _`Smart High-Side Power Switch shield`: https://www.infineon.com/cms/en/product/evaluation-boards/shield_bts7002-1epp/
+
+Required Hardware
+-----------------
+
+Microcontroller
+"""""""""""""""
+Any Arduino compatible board with Arduino Uno form-factor, like XMC1100 Boot Kit or other Arduino compatible XMC boards from Infineon:
+
+.. image:: ../../img/XMC1100.jpg
+ :height: 200
+
+Smart High-Side Power Switch Shield
+"""""""""""""""""""""""""""""""""""
+
+.. image:: ../../img/bts700x_shield.jpg
+ :height: 200
+
+Required Software
+-----------------
+
+* `Arduino IDE`_
+* This library installed in the Arduino IDE, the instructions can be found `here `__
+* When using an Arduino compatible XMC board, please find installation instructions `here `_.
+
+.. _`Arduino IDE`: https://www.arduino.cc/en/software
+
+Tutorial
+--------
+
+Software Installation
+""""""""""""""""""""""
+
+1. **Install the Arduino IDE**. If you are new to Arduino, please `download `__ the program and install it first.
+
+2. **Include the XMC boards in the IDE (if a XMC is used)**. The official Arduino boards are already available in the Arduino IDE, but other third party boards as the Infineon XMC MCU based ones need to be explicitly included. Follow the instructions in the `link `__ to add the XMC board family to the Arduino IDE.
+
+3. **Install the library**. In the Arduino IDE, go to the menu *Sketch > Include library > Library Manager*. Type **high-side-switch-ino** and install the library.
+
+Hardware Setup
+""""""""""""""
+
+The shield can be used with all platforms that support the Arduino form factor. But please be aware that all these platforms have to have the same pin functionalities as the Arduino. Otherwise the full functionality of the shield can not be assured.
+
+To connect the shield you just have to assure that the notch of the Arduino Uno and the shield are above each other. Then you can plug the shield on top of the Arduino.
+
+.. image:: ../../img/arduino-marked.png
+ :height: 200
+
+.. image:: ../../img/hss-marked.png
+ :height: 200
+
+The pin headers can also be used to figure out the right orientation. There is only one way to properly connect them.
+
+As soon as the shield is connected to the Arduino you can connect a USB cable to the Arduino to power up the microcontroller. Make sure that no code or the example code of this repository is flashed to the microcontroller. Otherwise it can happen that the board is already activating one of the switches.
+
+.. image:: ../../img/arduino-hss-stack.png
+ :height: 200
+
+Now you can attach the power supply to the battery pad on the board. There are two, one for a large wire gauge and the other is next to the switches pads and is meant for smaller cables. Don't forget to connect the ground wire!
+
+.. image:: ../../img/hss-powercon.png
+ :height: 200
+
+Now you only have to attach your load to the desired switch. For getting familiar with the board it is recommended to use a resistive load to check the functionality of the board and the shield.
+
+Ready To Go!
+""""""""""""
+
+Now you can upload the provided example code to your Arduino compatible board. For this, navigate in your Arduino IDE to *File* -> *Examples* -> *high-side-switch* -> *BTS700x-hss-single-ch*.
+
+For a specific description and overview of all examples please refer to :ref:`Arduino examples `.
\ No newline at end of file
diff --git a/docs/sw-frmwk/arduino/arduino-lib-installation.rst b/docs/sw-frmwk/arduino/arduino-lib-installation.rst
new file mode 100644
index 0000000..0b586db
--- /dev/null
+++ b/docs/sw-frmwk/arduino/arduino-lib-installation.rst
@@ -0,0 +1,41 @@
+.. _arduino-lib-installation:
+
+Arduino Library Installation
+============================
+
+Installation Methods
+--------------------
+
+The library can be installed in several ways:
+
+* Arduino IDE library manager
+* Arduino IDE import .zip library
+* Arduino IDE manual installation
+* PlatformIO
+
+These installation processes are conveniently described on the official `Arduino`_ website.
+
+.. _Arduino: https://www.arduino.cc/en/guide/libraries
+
+* **Arduino IDE Library Manager**
+
+Library name: ``high-side-switch-ino``
+
+* **Arduino IDE Manual Installation**
+
+Download the desired .zip library version from the repository `releases`_ section.
+
+.. _releases: https://github.com/Infineon/arduino-high-side-switch/releases
+
+.. image:: ../../img/gh-master-zip.png
+ :width: 200
+
+.. warning::
+ As a general recommendation, downloading directly from the master branch should be avoided.
+ Even though it should not, it could contain incomplete or faulty code.
+
+* **PlatformIO**
+
+Refer to the section :ref:`PlatformIO ` and the `official website`_.
+
+.. _official website: https://docs.platformio.org/en/latest/librarymanager/quickstart.html
\ No newline at end of file
diff --git a/docs/sw-frmwk/arduino/arduino-platformio.rst b/docs/sw-frmwk/arduino/arduino-platformio.rst
new file mode 100644
index 0000000..011aa6b
--- /dev/null
+++ b/docs/sw-frmwk/arduino/arduino-platformio.rst
@@ -0,0 +1,37 @@
+.. _arduino-platformio:
+
+Arduino & PlatformIO
+====================
+
+Introduction
+------------
+If you are new to PlatformIO, download and install Visual Studio Code first and then the PlatformIO plugin. Please follow the instructions on the `official website`_. Then go through `this tutorial`_ to get started with PlatformIO in VSCode and create a new project.
+
+.. _`official website`: https://docs.platformio.org/en/latest/integration/ide/pioide.html
+.. _`this tutorial`: https://diyprojects.io/install-ide-platformio-extension-visual-studio-code-vscode-windows-32-bit-linux/#.XOVQP44zYnI
+
+Library Installation
+--------------------
+With the project created, now the library and its dependencies can be configured in the Platform.ini Project File. This file, located in the project root folder, includes one (or several) building environments ``[env:__]``.
+
+In the environment section, the platform, board, and framework are specified. PlatformIO will take care of downloading and installing the dependencies.
+
+In the following example, we use ...
+
+.. code-block::
+
+ [env:uno]
+ platform = atmelavr
+ board = uno
+ framework = arduino
+
+ lib_deps=
+ # Using a library name
+ high-side-switch-ino
+
+ # Using the repository URL
+ https://github.com/Infineon/arduino-high-side-switch
+
+You can also simply take the ``platform.ini`` file from the `arduino-high-side-switch repo`_. This file includes all settings for using this library with different platforms.
+
+.. _`arduino-high-side-switch repo`: https://github.com/Infineon/arduino-high-side-switch
\ No newline at end of file
diff --git a/docs/sw-frmwk/arduino/index.rst b/docs/sw-frmwk/arduino/index.rst
new file mode 100644
index 0000000..60b6201
--- /dev/null
+++ b/docs/sw-frmwk/arduino/index.rst
@@ -0,0 +1,11 @@
+Arduino
+=======
+
+.. toctree::
+
+ Compatible Kits
+ Getting Started
+ Library Installation
+ Arduino API usage
+ PlatformIO
+ Examples
\ No newline at end of file
diff --git a/examples/button-test/button-test.ino b/examples/button-test/button-test.ino
deleted file mode 100644
index 16029be..0000000
--- a/examples/button-test/button-test.ino
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * @file high-side-switch.ino
- * @brief High-Side-Switch Example for the Arduino form factor
- *
- * This example is showing an example how to use the optional user button.
- * The button functionallty is not included in the main example, because the
- * button is not populated on the board by default.
- *
- * @copyright Copyright (c) 2021 Infineon Technologies AG
- */
-#include
-#include
-
-/**
- * Here we create an object of the High-Side-Switch-Board class with the Name HSS.
- * The constructor needs the used version of the PROFET.
- *
- * Available versions are:
- * - BTS7002
- * - BTS7004
- * - BTS7006
- * - BTS7008
- *
- * Make sure you chose the right one. Otherwise the diagnosis functions can may work incorrectly.
- */
-HssBoardIno HSS = HssBoardIno(&BTS7002);
-
-void setup()
-{
- /** Serial initialization */
- Serial.begin(115200);
- delay(2000);
- Serial.println("Serial initialized");
-
- /** Initialization of the High-Side-Switch-Board */
- HSS.init();
- delay(1000);
- Serial.println("High-Side-Switch is initialized");
-}
-
-/**
- * In this example we're using the the digitReadButton() functionality of the library
- * to read out the VSS of the attached power supply. You can of course also use the
- * analogReadButton() function. Which one you have to use depends on the configuration
- * of your jumper. If you're using jumper J2 you have to use the analogReadButton() function.
- * If you're using jumper J3 you have to use the digitalReadButton() function.
- */
-void loop()
-{
- float voltage = 0.0;
- static bool button_pressed = false; // The flag is used to avoid printing constantly
-
- if(HSS.digitalReadButton() && button_pressed = false){
- button_pressed = true;
- voltage = HSS.readVss();
- Serial.print("Supply voltage is: ");
- Serial.println(voltage);
- }
-
- if(!HSS.digitalReadButton()){
- button_pressed = false;
- }
-}
\ No newline at end of file
diff --git a/examples/high-side-switch/high-side-switch.ino b/examples/high-side-switch/high-side-switch.ino
deleted file mode 100644
index 9d9434a..0000000
--- a/examples/high-side-switch/high-side-switch.ino
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * @file high-side-switch.ino
- * @brief High-Side-Switch Example for the Arduino form factor
- *
- * This example shows the usage of the Arduino API.
- * It covers all functions of the PROFET-Shield and shows how the functions are used.
- * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
- *
- * @copyright Copyright (c) 2020 Infineon Technologies AG
- */
-#include
-#include
-
-/**
- * Here we create an object of the High-Side-Switch-Board class with the Name HSS.
- * The constructor needs the used version of the PROFET.
- *
- * Available versions are:
- * - BTS7002
- * - BTS7004
- * - BTS7006
- * - BTS7008
- *
- * Make sure you chose the right one. Otherwise the diagnosis functions can may work incorrectly.
- */
-HssBoardIno HSS = HssBoardIno(&BTS7002);
-
-void setup()
-{
- /** Serial initialization */
- Serial.begin(115200);
- delay(2000);
- Serial.println("Serial initialized");
-
- /** Initialization of the High-Side-Switch-Board */
- HSS.init();
- delay(1000);
- Serial.println("High-Side-Switch is initialized");
-}
-
-void loop()
-{
- int incomingSerial = 0;
- static int counter = 0;
- static int oldCounter = 0;
-
- float readAmps = 0.0;
- float batteryVoltage = 0.0;
-
- int switchStatus = 0;
-
- /**
- * This small if-case is checking for an user input.
- * To use this press the "+" symbol on your keyboard, this is equal to "43" in ASCII.
- */
- if(Serial.available() > 0){
- incomingSerial = Serial.read();
-
- if(incomingSerial == 43){
- counter++;
- }
- }
-
- /**
- * This if-case are used to show all functions of the board.
- * Depending on the value of the counter the board will do the following:
- * - From 1 to 4:
- * Switch on all four channels, one after the other starting with channel 1
- * Also reads out the diagnostic channel of the corresponding channel
- * - From 5 to 8:
- * Switch off all four channels, one after the other starting with channel 1
- * Also reads out the diagnostic channel of the corresponding channel
- * - From 9 to 10:
- * First turns on all channels at once
- * Then turns off all channels at once
- * - After that the counter will be reset and you can use the program again
- *
- * The status of the switch can be determined with the following table:
- * || Diagnosis Status || Description ||
- * ------------------------------------------------------------------------------------------
- * || 0 || NORMAL = Everything is working correctly ||
- * || 1 || OVERLOAD = Exceeded the board's current limit ||
- * || 2 || SHORT_TO_GND = Short the ground of the board ||
- * || 3 || OVERTEMPERATURE = Board got to hot ||
- * || 4 || SHORT_TO_VSS = Short to the Battery pad of the board ||
- * || 5 || OPEN_LOAD = No load is connected ||
- * || 6 || UNDER_LOAD = Not enough voltage/current to turn on the switch ||
- * || 7 || INVERSE_CURRENT = Inverse current flows into the board ||
- *
- * Please note: If you use the diagnosis function when the switch is off and no load is connected
- * the status will be SHORT_TO_GND, because this state is not clear because of the provided IS signal
- * of the board. Read more about this in the data sheet of the PROFET on page 40.
- */
- if(counter > 0 && counter < 5 && oldCounter != counter){
- HSS.switchHxOn(counter);
- Serial.print("Switched half bridge ");
- Serial.print(counter);
- Serial.println(" on");
-
- Serial.println("Reading the current and diagnosis status of this switch ...");
- readAmps = HSS.readIsx(counter);
- Serial.print("Current flowing through the switch: ");
- Serial.print(readAmps);Serial.println(" A");
-
- switchStatus = HSS.readDiagx(counter);
- Serial.print("Diagnosis status of the switch: ");
- Serial.println(switchStatus);
-
- batteryVoltage = HSS.readVss();
- Serial.print("Current battery voltage : ");
- Serial.print(batteryVoltage);Serial.println(" V\n");
-
- oldCounter = counter;
- }
- else if(counter > 4 && counter < 9 && oldCounter != counter){
- HSS.switchHxOff(counter - 4);
- Serial.print("Switched half bridge ");
- Serial.print(counter - 4);
- Serial.println(" off");
-
- Serial.println("Reading the current and diagnosis status of this switch ...");
- readAmps = HSS.readIsx(counter - 4);
- Serial.print("Current flowing through the switch: ");
- Serial.print(readAmps);Serial.println(" A");
-
- switchStatus = HSS.readDiagx(counter - 4);
- Serial.print("Diagnosis status of the switch: ");
- Serial.println(switchStatus);
-
- batteryVoltage = HSS.readVss();
- Serial.print("Current battery voltage : ");
- Serial.print(batteryVoltage);Serial.println(" V\n");
-
- oldCounter = counter;
- }
- else if(counter > 8 && counter < 11 && oldCounter != counter){
- if(counter == 9){
- Serial.println("\nTurn on all switches at once!");
- HSS.switchesHxOn(1,1,1,1);
- oldCounter = counter;
- }
- else if(counter == 10){
- Serial.println("\nTurn off all switches at once and reset counter!");
- HSS.switchesHxOff(1,1,1,1);
- oldCounter = counter;
- counter = 0;
- }
- }
-}
\ No newline at end of file
diff --git a/library.json b/library.json
deleted file mode 100644
index 2a72eca..0000000
--- a/library.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "name": "High-Side-Switch",
- "keywords": "high side switch, profet, smart switch",
- "description": "DEPRECATED. This library is continued as the new library \"high-side-switch-ino\". C++ library for the PROFET+2 12V. ",
- "repository":{
- "type":"git",
- "url":"https://github.com/Infineon/high-side-switch",
- "branch":"master"
- },
- "version":"0.1.4",
- "license":"MIT",
- "frameworks":"arduino",
- "platforms":[
- "infineonxmc",
- "atmelavr"
- ]
- }
diff --git a/library.properties b/library.properties
deleted file mode 100644
index 3a15285..0000000
--- a/library.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-name=High-Side-Switch
-version=0.1.4
-author=Infineon Technologies
-maintainer=Infineon Technologies
-sentence=DEPRECATED. C++ library for the PROFET+2 12V
-paragraph=Please note: this library is deprecated. Please migrate to the new high-side-switch-ino v1.0.0 library. It starts in v1.x as it is a continuation of this library. This deprecated library only supports the PROFET+2 12V Arduino form factor
-category=Evaluation Board
-url=https://github.com/Infineon/high-side-switch
-architectures=*
-includes=hss-board-arduino.hpp
diff --git a/src/config/variants.cpp b/src/config/variants.cpp
deleted file mode 100644
index 8240703..0000000
--- a/src/config/variants.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * @file variants.cpp
- * @brief Defines the characteristic values of the different BTS700x variants
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "variants.hpp"
-
-/**
- * @brief BTS7002.
- * Is rated for nominal 21 A and is the Profet with the highest useable power
- */
-BtsVariants_t BTS7002 {
- .kilis = 22700,
- .ampsGain = 1.08,
- .ampsOffset = 0.0,
- .vBatGain = 1.045,
- .vBatOffset = 0.0
-};
-
-/**
- * @brief BTS7002.
- * Is rated for nominal 15 A
- */
-BtsVariants_t BTS7004 {
- .kilis = 20000,
- .ampsGain = 1.08,
- .ampsOffset = 0.0,
- .vBatGain = 1.045,
- .vBatOffset = 0.0
-};
-
-/**
- * @brief BTS7006.
- * Is rated for nominal 12.5 A
- */
-BtsVariants_t BTS7006 {
- .kilis = 17700,
- .ampsGain = 1.08,
- .ampsOffset = 0.0,
- .vBatGain = 1.045,
- .vBatOffset = 0.0
-};
-
-/**
- * @brief BTS7008.
- * Is rated for nominal 11 A
- */
-BtsVariants_t BTS7008 {
- .kilis = 14500,
- .ampsGain = 1.08,
- .ampsOffset = 0.0,
- .vBatGain = 1.045,
- .vBatOffset = 0.0
-};
-
-
diff --git a/src/config/variants.hpp b/src/config/variants.hpp
deleted file mode 100644
index 815635d..0000000
--- a/src/config/variants.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @file variants.hpp
- * @brief Defines the characteristic values of the different BTS700x variants
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef VARIANTS_HPP_
-#define VARIANTS_HPP_
-
-#include
-
-/**
- * @addtogroup hssConfig
- * @{
- */
-
-
-/**
- * @brief Structure for the differen types of the BTS700x
- * It contains all important parameters for the correct usage of
- * of the diagnosis functions of the Switch
- */
-typedef struct BtsVariants_t
-{
- const uint16_t kilis; /**< Current sense ratio */
- float ampsGain; /**< Gain factor for the current, may has to be adjusted */
- float ampsOffset; /**< Current offset, can be used to correct the measured current */
- float vBatGain; /**< Gain factor for the battery voltage, may has to be adjusted */
- float vBatOffset; /**< Battery voltage offset, can be used to correct the measured battery voltage */
-};
-
-extern BtsVariants_t BTS7002;
-extern BtsVariants_t BTS7004;
-extern BtsVariants_t BTS7006;
-extern BtsVariants_t BTS7008;
-/** @} */
-
-#endif /** VARIANTS_HPP_ **/
diff --git a/src/corelib/hss-board.cpp b/src/corelib/hss-board.cpp
deleted file mode 100644
index b36a27d..0000000
--- a/src/corelib/hss-board.cpp
+++ /dev/null
@@ -1,508 +0,0 @@
-/**
- * @file hss-board.cpp
- * @brief Definition of the High-Side-Switch-Board class functions
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "hss-board.hpp"
-
-/**
- * @brief High-Side-Switch-Board constructor
- * Initialize all protected class pointers with a null pointer.
- */
-HssBoard::HssBoard()
-{
- filterVbat = NULL;
-
- led1 = NULL;
- led2 = NULL;
- led3 = NULL;
- led4 = NULL;
-
- hss1 = NULL;
- hss2 = NULL;
- hss3 = NULL;
- hss4 = NULL;
-
- timer = NULL;
-
- oloff = NULL;
- pushButtonDigital = NULL;
-
- pushButtonAnalog = NULL;
- vBat = NULL;
-}
-
-/**
- * @brief Destructor of the High-Side-Switch-Board
- *
- */
-HssBoard::~HssBoard()
-{
-
-}
-
-/**
- * @brief Initialize all necessary objects of the High-Side-Switch-Board
- *
- * This function initializes all necessary objects of the High-Side-Switch-Board.
- * It retruns an error code to see if everything was initialized correctly.
- *
- * @return HssBoard::Error_t
- */
-HssBoard::Error_t HssBoard::init()
-{
- filterVbat = new ExponentialFilter(0.0, 0.3);
-
- if (NULL != led1)
- led1->init();
- if (NULL != led2)
- led2->init();
- if (NULL != led3)
- led3->init();
- if (NULL != led4)
- led4->init();
-
- hss1->init();
- hss2->init();
- hss3->init();
- hss4->init();
-
- timer->init();
-
- oloff->init();
- pushButtonDigital->init();
-
- pushButtonAnalog->init();
- vBat->init();
-
- return OK;
-}
-
-/**
- * @brief Deinitialize all necessary objects of the High-Side-Switch-Board
- *
- * This function deinitializes all necessary objects of the High-Side-Switch-Board.
- * It retruns an error code to see if everything was deinitialized correctly.
- *
- * @return HssBoard::Error_t
- */
-HssBoard::Error_t HssBoard::deinit()
-{
-
- if (NULL != led1)
- led1->deinit();
- if (NULL != led2)
- led2->deinit();
- if (NULL != led3)
- led3->deinit();
- if (NULL != led4)
- led4->deinit();
-
- hss1->deinit();
- hss2->deinit();
- hss3->deinit();
- hss4->deinit();
-
- timer->deinit();
-
- oloff->deinit();
- pushButtonDigital->deinit();
-
- pushButtonAnalog->deinit();
- vBat->deinit();
-
- return OK;
-}
-
-/**
- * @brief Switch on the selected High-Side-Switch
- *
- * This function turns on the desired High-Side-Switch.
- * It also turns on the corresponding LED of the switch.
- *
- * @param[in] x Number of the Switch the should be turned on (1-4)
- * @return HssBoard::Error_t
- */
-HssBoard::Error_t HssBoard::switchHxOn(uint8_t x)
-{
- switch(x)
- {
- case 1:
- hss1->enable();
- if (NULL != led1)
- led1->enable();
- break;
-
- case 2:
- hss2->enable();
- if (NULL != led2)
- led2->enable();
- break;
-
- case 3:
- hss3->enable();
- if (NULL != led3)
- led3->enable();
- break;
-
- case 4:
- hss4->enable();
- if (NULL != led4)
- led4->enable();
- break;
- }
- return OK;
-}
-
-/**
- * @brief Switch off the selected High-Side-Switch
- *
- * This function turns off the desired High-Side-Switch.
- * It also turns off the corresponding LED of the switch.
- *
- * @param[in] x Number of the Switch the should be turned off (1-4)
- * @return HssBoard::Error_t
- */
-HssBoard::Error_t HssBoard::switchHxOff(uint8_t x)
-{
- switch(x)
- {
- case 1:
- hss1->disable();
- if (NULL != led1)
- led1->disable();
- break;
-
- case 2:
- hss2->disable();
- if (NULL != led2)
- led2->disable();
- break;
-
- case 3:
- hss3->disable();
- if (NULL != led3)
- led3->disable();
- break;
-
- case 4:
- hss4->disable();
- if (NULL != led4)
- led4->disable();
- break;
- }
- return OK;
-}
-
-/**
- * @brief Turn on the selected High-Side-Switches
- *
- * This function is used to enable multiple switches at once.
- *
- * @param[in] h1 Enable the first switch if h1 == true
- * @param[in] h2 Enable the second switch if h2 == true
- * @param[in] h3 Enable the third switch if h3 == true
- * @param[in] h4 Enable the fourth switch if h4 == true
- * @return HssBoard::Error_t
- */
-HssBoard::Error_t HssBoard::switchesHxOn(bool h1 = NULL, bool h2 = NULL, bool h3 = NULL, bool h4 = NULL)
-{
- if(h1 == true){
- hss1->enable();
- if (NULL != led1)
- led1->enable();
- }
-
- if(h2 == true){
- hss2->enable();
- if (NULL != led2)
- led2->enable();
- }
-
- if(h3 == true){
- hss3->enable();
- if (NULL != led3)
- led3->enable();
- }
-
- if(h4 == true){
- hss4->enable();
- if (NULL != led4)
- led4->enable();
- }
-
- return OK;
-}
-
-/**
- * @brief Turn off the selected High-Side-Switches
- *
- * This function is used to disable multiple switches at once.
- *
- * @param[in] h1 Disable the first switch if h1 == true
- * @param[in] h2 Disable the second switch if h2 == true
- * @param[in] h3 Disable the third switch if h3 == true
- * @param[in] h4 Disable the fourth switch if h4 == true
- * @return HssBoard::Error_t
- */
-HssBoard::Error_t HssBoard::switchesHxOff(bool h1 = NULL, bool h2 = NULL, bool h3 = NULL, bool h4 = NULL)
-{
- if(h1 == true){
- hss1->disable();
- if (NULL != led1)
- led1->disable();
- }
-
- if(h2 == true){
- hss2->disable();
- if (NULL != led2)
- led2->disable();
- }
-
- if(h3 == true){
- hss3->disable();
- if (NULL != led3)
- led3->disable();
- }
-
- if(h4 == true){
- hss4->disable();
- if (NULL != led4)
- led4->disable();
- }
-
- return OK;
-}
-
-/**
- * @brief Read the desired current value of the chosen channel
- *
- * This function reads the IS pin of the chosen High-Side-Switch
- * and calculates the current which is flowing through the switch
- * with the acquired ADC value.
- *
- * @param[in] x Number of the desired channel (1-4)
- * @return The value of the current in [A]
- */
-float HssBoard::readIsx(uint8_t x)
-{
- float result;
- switch (x)
- {
- case 1:
- hss1->enableDiag();
- result = hss1->readIs();
- hss1->disableDiag();
- break;
-
- case 2:
- hss2->enableDiag();
- result = hss2->readIs();
- hss2->disableDiag();
- break;
-
- case 3:
- hss3->enableDiag();
- result = hss3->readIs();
- hss3->disableDiag();
- break;
-
- case 4:
- hss4->enableDiag();
- result = hss4->readIs();
- hss4->disableDiag();
- break;
- }
- return result;
-}
-
-/**
- * @brief Read the diagnosis of the chosen channel
- *
- * This function uses the current signal of the channel to diagnose the channel.
- * It returns the different states depending on the channels condition.
- *
- * @param[in] x Desired channel for the diagnosis (1-4)
- * @return HssBoard::DiagStatus_t
- *
- * @retval 0 Everything works correctly
- * @retval 2 Short to ground
- * @retval 4 Short to battery
- * @retval 5 Open load
- */
-HssBoard::DiagStatus_t HssBoard::readDiagx(uint8_t x)
-{
- DiagStatus_t diagStatus = NORMAL;
-
- float currentOn = 0.0;
- float currentOff = 0.0;
-
- switch(x)
- {
- case 1:
- hss1->enableDiag();
- if(hss1->getSwitchStatus() == Hss::Status_t::POWER_ON){
- diagStatus = hss1->diagRead();
- }
- else{
- oloff->enable();
- timer->delayMicro(300);
- currentOn = hss1->readIs();
-
- oloff->disable();
- timer->delayMicro(400);
- currentOff = hss1->readIs();
- diagStatus = diagnosisOff(currentOn, currentOff);
- }
- hss1->disableDiag();
- break;
-
- case 2:
- hss2->enableDiag();
- if(hss2->getSwitchStatus() == Hss::Status_t::POWER_ON){
- diagStatus = hss2->diagRead();
- }
- else{
- oloff->enable();
- timer->delayMicro(300);
- currentOn = hss2->readIs();
-
- oloff->disable();
- timer->delayMicro(400);
- currentOff = hss2->readIs();
- diagStatus = diagnosisOff(currentOn, currentOff);
- }
- hss2->disableDiag();
- break;
-
- case 3:
- hss3->enableDiag();
- if(hss3->getSwitchStatus() == Hss::Status_t::POWER_ON){
- diagStatus = hss3->diagRead();
- }
- else{
- oloff->enable();
- timer->delayMicro(300);
- currentOn = hss3->readIs();
-
- oloff->disable();
- timer->delayMicro(400);
- currentOff = hss3->readIs();
- diagStatus = diagnosisOff(currentOn, currentOff);
- }
- hss3->disableDiag();
- break;
-
- case 4:
- hss4->enableDiag();
- if(hss4->getSwitchStatus() == Hss::Status_t::POWER_ON){
- diagStatus = hss4->diagRead();
- }
- else{
- oloff->enable();
- timer->delayMicro(300);
- currentOn = hss4->readIs();
-
- oloff->disable();
- timer->delayMicro(400);
- currentOff = hss4->readIs();
- diagStatus = diagnosisOff(currentOn, currentOff);
- }
- hss4->disableDiag();
- break;
- }
- return diagStatus;
-}
-
-/**
- * @brief Calculates the diagnosis state
- *
- * This functions determines the diagnosis state of the High-Side-Switch.
- * It uses the measrued currents with en- and disabled Open-Load-Detection.
- *
- * @param[in] currentOn Measrued current with Open-Load-Detection on
- * @param[in] currentOff Measrued current with Open-Load-Detection off
- * @return HssBoard::DiagStatus_t
- */
-HssBoard::DiagStatus_t HssBoard::diagnosisOff(float currentOn, float currentOff)
-{
- if((currentOn > (0.0018 * btsVariant->kilis)) && (currentOn < (0.0044 * btsVariant->kilis))){
- if((currentOff > (0.0018 * btsVariant->kilis)) && (currentOff < (0.0044 * btsVariant->kilis))){
- return DiagStatus_t::SHORT_TO_VSS;
- }
- else{
- return DiagStatus_t::OPEN_LOAD;
- }
- }
- else{
- if((currentOn > (0.0044 * btsVariant->kilis))){
- return DiagStatus_t::SHORT_TO_GND;
- }
- else{
- return DiagStatus_t::NORMAL;
- }
- }
-}
-
-/**
- * @brief Reads the batter voltage
- *
- * This functions is reading the attached voltage at the Profet-Board.
- *
- * @return Value of the battery voltage in [V]
- */
-float HssBoard::readVss()
-{
- uint16_t adcResult = 0;
- float voltage = 0.0;
-
- adcResult = vBat->ADCRead();
- voltage = adcResult * ((float)5/(float)1024); // Vmax/1024 LSB = Resolution of the ADC, 57/10 = Reverse Voltage devider to get the Supplyvoltage
- voltage = (voltage - vBatOffset) * vBatGain;
- voltage = voltage * ((float)57/(float)10);
-
- filterVbat->input(voltage);
-
- return filterVbat->output();
-}
-
-/**
- * @brief Read the button state
- *
- * @retval true if button is pressed
- * @retval false if button is not pressed
- */
-bool HssBoard::digitalReadButton()
-{
- if(pushButtonDigital->read() == GPIO::GPIO_LOW)
- return true;
- else
- return false;
-}
-
-/**
- * @brief Read the button state (analog)
- *
- * @retval true if button is pressed
- * @retval false if button is not pressed
- */
-bool HssBoard::analogReadButton()
-{
- uint16_t result = 0;
-
- result = pushButtonAnalog->ADCRead();
- if(result < 20){
- return true;
- }
- else{
- return false;
- }
-}
-
-
-
-
diff --git a/src/corelib/hss-board.hpp b/src/corelib/hss-board.hpp
deleted file mode 100644
index e4a1306..0000000
--- a/src/corelib/hss-board.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * @file hss-board.hpp
- * @brief Defenition of the High-Side-Switch-Board class
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef HSS_BOARD_HPP_
-#define HSS_BOARD_HPP_
-
-#include
-#include "hss.hpp"
-#include "../utils/filter.hpp"
-
-/**
- * @addtogroup hssCorelib
- * @{
- */
-
-
-/**
- * @brief High-Side-Switch-Board Class
- * This class defines the the PROFET-Shield with all it's functions.
- */
-class HssBoard : Hss
-{
- public:
-
- HssBoard();
- ~HssBoard();
- Error_t init();
- Error_t deinit();
-
- Error_t switchHxOn(uint8_t x);
- Error_t switchHxOff(uint8_t x);
- Error_t switchesHxOn(bool h1 = NULL, bool h2 = NULL, bool h3 = NULL, bool h4 = NULL);
- Error_t switchesHxOff(bool h1 = NULL, bool h2 = NULL, bool h3 = NULL, bool h4 = NULL);
- DiagStatus_t readDiagx(uint8_t x);
- DiagStatus_t diagnosisOff(float currentOn, float currentOff);
-
- float readIsx(uint8_t x);
-
- float readVss();
-
- bool digitalReadButton();
- bool analogReadButton();
-
- protected:
-
- ExponentialFilter *filterVbat;
-
- GPIO *led1;
- GPIO *led2;
- GPIO *led3;
- GPIO *led4;
-
- Hss *hss1;
- Hss *hss2;
- Hss *hss3;
- Hss *hss4;
-
- Timer *timer;
-
- GPIO *oloff;
- GPIO *pushButtonDigital;
-
- AnalogDigitalConverter *pushButtonAnalog;
- AnalogDigitalConverter *vBat;
-
- const float vBatGain = 1.0;
- const float vBatOffset = 0.0;
-};
-
-/** @} */
-
-#endif /** HSS_BOARD_HPP_ **/
diff --git a/src/corelib/hss-filter.cpp b/src/corelib/hss-filter.cpp
new file mode 100644
index 0000000..283c2c2
--- /dev/null
+++ b/src/corelib/hss-filter.cpp
@@ -0,0 +1,109 @@
+/**
+ * @file hss-filter.cpp
+ * @brief Exponential filter class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "hss-filter.hpp"
+
+using namespace hss;
+
+/**
+ * @brief Exponential filter default constructor
+ */
+ExponentialFilter::ExponentialFilter()
+{
+ this->y = 0.0;
+ this->y_last = 0.0;
+ this->x = 0.0;
+ this->tau = 1;
+}
+
+/**
+ * @brief Exponential filter constructor with initial value
+ * @param[in] y Initial filter value
+ */
+ExponentialFilter::ExponentialFilter(float y)
+{
+ this->y = y;
+ this->y_last = y;
+ this->x = y;
+}
+
+/**
+ * @brief Exponential filter constructor with initial value and time
+ * @param[in] y Initial filter value
+ * @param[in] t Time value
+ */
+ExponentialFilter::ExponentialFilter(float y, uint16_t t)
+{
+ this->y = y;
+ this->y_last = y;
+ this->x = y;
+ this->tau = pow2(t);
+}
+
+/**
+ * @brief Sets filter parameters
+ * @param[in] y Initial filter value
+ * @param[in] t Time value
+ */
+void ExponentialFilter::setFilter(float y, uint16_t t)
+{
+ this->y = y;
+ this->y_last = y;
+ this->x = y;
+ this->tau = pow2(t);
+}
+
+/**
+ * @brief Sets time constant
+ * @param[in] t Time value
+ */
+void ExponentialFilter::setTau(uint16_t t)
+{
+ this->tau = pow2(t);
+}
+
+/**
+ * @brief Sets all parameters to new value
+ * @param[in] y New value
+ */
+void ExponentialFilter::setToNewValue(float y)
+{
+ this->y = y_last = x = y;
+}
+
+/**
+ * @brief Sets new input
+ * @param[in] x input value
+ */
+void ExponentialFilter::input(float x)
+{
+ y_last = y;
+ this->x = x;
+
+ y = y_last + ((x - y_last)/(float)tau);
+}
+
+/**
+ * @brief Gets output value
+ * @return Filtered output value
+ */
+float ExponentialFilter::output()
+{
+ return y;
+}
+
+
+/**
+ * @brief Calculates power two
+ * @param[in] p base to apply power 2
+ * @return Power two result
+ */
+uint16_t ExponentialFilter::pow2(uint16_t p)
+{
+ return 1<< p;
+}
+
diff --git a/src/corelib/hss-filter.hpp b/src/corelib/hss-filter.hpp
new file mode 100644
index 0000000..3c0eee8
--- /dev/null
+++ b/src/corelib/hss-filter.hpp
@@ -0,0 +1,53 @@
+/**
+ * @file hss-filter.hpp
+ * @brief Exponential filter class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_FILTER_HPP_
+#define HSS_FILTER_HPP_
+
+#include
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssCorelib
+ * @{
+ */
+
+/**
+ * @brief Exponential filter API
+ */
+class ExponentialFilter
+{
+ public:
+
+ ExponentialFilter();
+ ExponentialFilter(float y);
+ ExponentialFilter(float y, uint16_t t);
+
+ void setFilter(float y, uint16_t t);
+ void setTau(uint16_t t);
+ void setToNewValue(float y);
+ void input(float x);
+ float output();
+ uint16_t pow2(uint16_t p);
+
+ private:
+
+ uint16_t tau; /**< Time constant */
+
+ float y; /**< Output value */
+ float y_last; /**< Last output value */
+ float x; /**< Input value*/
+};
+
+/** @} */
+
+}
+
+#endif /** FILTER_HPP_ **/
\ No newline at end of file
diff --git a/src/corelib/hss-shield-bts5001x.cpp b/src/corelib/hss-shield-bts5001x.cpp
new file mode 100644
index 0000000..0c34c4b
--- /dev/null
+++ b/src/corelib/hss-shield-bts5001x.cpp
@@ -0,0 +1,278 @@
+/**
+ * @file hss-shield-bts5001x.cpp
+ * @brief Power Profet (12V) shield with BTS500xx class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-shield-bts5001x.hpp"
+
+using namespace hss;
+
+/**
+ * @brief High-Side-Switch-Board constructor
+ * @details Initialize all protected class pointers with a null pointer.
+ * @param[in] hsw1 High-side switch 1 instance
+ * @param[in] led2 LED 2 instance
+ * @param[in] led3 LED 3 instance
+ * @param[in] pushButton Push button ADC instance
+ * @param[in] vBat Battery voltage ADC instance
+ */
+Bts5001xShield::Bts5001xShield(Hss * hsw1, GPIOPAL * led2, GPIOPAL * led3, ADCPAL * pushButton, ADCPAL * vBat)
+:
+hss1(hsw1),
+led2(led2),
+led3(led3),
+pushButton(pushButton),
+vBat(vBat)
+{
+
+}
+
+/**
+ * @brief Destructor of the High-Side-Switch-Board
+ *
+ */
+Bts5001xShield::~Bts5001xShield()
+{
+
+}
+
+/**
+ * @brief Initialize all necessary objects of the High-Side-Switch-Board
+ *
+ * This function initializes all necessary objects of the High-Side-Switch-Board.
+ * It retruns an error code to see if everything was initialized correctly.
+ *
+ * @return hss::Error_t
+ */
+Error_t Bts5001xShield::init()
+{
+ Error_t err= OK;
+
+ HSS_ASSERT_NULLPTR(hss1);
+ err = hss1->init();
+ HSS_ASSERT_RET(err);
+
+ if(nullptr != led2)
+ {
+ err = led2->init();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(nullptr != led3)
+ {
+ err = led3->init();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(nullptr != pushButton)
+ {
+ err = pushButton->init();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(nullptr != vBat)
+ {
+ err = vBat->init();
+ HSS_ASSERT_RET(err);
+ }
+
+ filterVbat = new ExponentialFilter(0.0, 0.3);
+
+ return OK;
+}
+
+/**
+ * @brief Deinitialize all necessary objects of the High-Side-Switch-Board
+ *
+ * This function deinitializes all necessary objects of the High-Side-Switch-Board.
+ * It retruns an error code to see if everything was deinitialized correctly.
+ *
+ * @return High-side switch error code
+ */
+Error_t Bts5001xShield::deinit()
+{
+ Error_t err= OK;
+
+ HSS_ASSERT_NULLPTR(hss1);
+ err = hss1->deinit();
+ HSS_ASSERT_RET(err);
+
+ if(nullptr != led2)
+ {
+ err = led2->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(nullptr != led3)
+ {
+ err = led3->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(nullptr != pushButton)
+ {
+ err = pushButton->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(nullptr != vBat)
+ {
+ err = vBat->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ return OK;
+}
+
+/**
+ * @brief Switch on the selected High-Side-Switch
+ * @details This function turns on the desired High-Side-Switch.
+ * It also turns on the corresponding LED of the switch.
+ * @param[in] x Number of the Switch the should be turned on (1-4)
+ * @return High-side switch error code
+ */
+Error_t Bts5001xShield::switchHxOn(uint8_t x)
+{
+ (void)x; /** Unused argument */
+
+ Error_t err= OK;
+
+ err = hss1->enable();
+ HSS_ASSERT_RET(err);
+
+ if (nullptr != led2)
+ {
+ err = led2->enable();
+ HSS_ASSERT_RET(err);
+ }
+
+ return err;
+}
+
+/**
+ * @brief Switch off the selected High-Side-Switch
+ * @details This function turns off the desired High-Side-Switch.
+ * It also turns off the corresponding LED of the switch.
+ * @param[in] x Number of the Switch the should be turned off (1-4)
+ * @return High-side switch error code
+ */
+Error_t Bts5001xShield::switchHxOff(uint8_t x)
+{
+ (void)x; /** Unused argument */
+
+ Error_t err= OK;
+
+ err = hss1->disable();
+ HSS_ASSERT_RET(err);
+
+ if (nullptr != led2)
+ {
+ err = led2->disable();
+ HSS_ASSERT_RET(err);
+ }
+
+ return err;
+}
+
+
+/**
+ * @brief Read the desired current value of the chosen channel
+ * @details This function reads the IS pin of the chosen High-Side-Switch
+ * and calculates the current which is flowing through the switch
+ * with the acquired ADC value.
+ * @param[in] x Number of the desired channel (1)
+ * @return The value of the current in [A]
+ */
+float Bts5001xShield::readIsx(uint8_t x)
+{
+ (void)x; /** Unused argument */
+
+ float isVal;
+
+ isVal = hss1->readIs(rSense);
+
+ return isVal;
+}
+
+/**
+ * @brief Read the diagnosis of the chosen channel
+ * @details This function uses the current signal of the channel to diagnose the channel.
+ * It returns the different states depending on the channels condition.
+ * @param[in] x Desired channel for the diagnosis (1)
+ * @return DiagStatus_t
+ *
+ * @retval -2 Not enabled
+ * @retval 0 Switch is working fine
+ * @retval 2 Short circuit to ground
+ * @retval 4 Short circuit to Vs
+ * @retval 5 Open load detected
+ */
+DiagStatus_t Bts5001xShield::readDiagx(uint8_t x)
+{
+ (void)x; /** Unused argument */
+
+ DiagStatus_t diagStatus = NORMAL;
+ float currentOn = 0.0;
+
+ if(hss1->getSwitchStatus() == POWER_ON)
+ {
+ currentOn = hss1->readIs(rSense);
+ diagStatus = hss1->diagRead(currentOn);
+ }
+
+ return diagStatus;
+}
+
+
+/**
+ * @brief Reads the batter voltage
+ * @details This functions is reading the attached voltage at the Profet-Board.
+ * @return Value of the battery voltage in [V]
+ */
+float Bts5001xShield::readVss()
+{
+ uint16_t adcResult = 0;
+ float voltage = 0.0;
+
+ adcResult = vBat->ADCRead();
+ voltage = adcResult * ((float)5/(float)1024); // Vmax/1024 LSB = Resolution of the ADC,
+ voltage = (voltage - vBatOffset);
+ voltage = voltage * ((float)57/(float)10); // 57/10 = Reverse Voltage devider to get the Supplyvoltage
+
+ filterVbat->input(voltage);
+
+ return filterVbat->output();
+}
+
+/**
+ * @brief Read the button state (analog)
+ * @return bool
+ * @retval true If button is pressed
+ * @retval false If button is not pressed
+ */
+bool Bts5001xShield::analogReadButton()
+{
+ uint16_t result = 0;
+
+ result = pushButton->ADCRead();
+ if(result < 20){
+ return true;
+ }
+ else{
+ return false;
+ }
+}
+
+/**
+ * @brief Set battery voltage offset
+ * @details This function can be used to change the value of the internal variable
+ * of the battery voltage offset
+ * @param[in] offset Desired value of the offset in [V]
+ */
+void Bts5001xShield::setVoltageOffset(float offset)
+{
+ vBatOffset = offset;
+}
diff --git a/src/corelib/hss-shield-bts5001x.hpp b/src/corelib/hss-shield-bts5001x.hpp
new file mode 100644
index 0000000..e652629
--- /dev/null
+++ b/src/corelib/hss-shield-bts5001x.hpp
@@ -0,0 +1,68 @@
+/**
+ * @file hss-shield-bts5001x.hpp
+ * @brief Power Profet (12V) shield with BTS500xx class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_BTS5001X_HPP_
+#define HSS_SHIELD_BTS5001X_HPP_
+
+#include "hss-shield.hpp"
+#include "hss-variants.hpp"
+#include "hss.hpp"
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssCorelib
+ * @{
+ */
+
+/**
+ * @brief Power Profet (12V) shield with BTS500xx API
+ */
+
+class Bts5001xShield : public HssShield
+{
+ public:
+
+ Bts5001xShield(Hss * hsw1, GPIOPAL * led2, GPIOPAL * led3, ADCPAL * pushButton, ADCPAL * vBat);
+ ~Bts5001xShield();
+
+ Error_t init();
+ Error_t deinit();
+ Error_t switchHxOn(uint8_t x = 0);
+ Error_t switchHxOff(uint8_t x = 0);
+ DiagStatus_t readDiagx(uint8_t x = 0);
+
+ float readIsx(uint8_t x=1);
+ float readVss();
+ bool analogReadButton();
+
+ void setVoltageOffset(float offset);
+
+ protected:
+
+ ExponentialFilter *filterVbat; /**< Battery voltage filter */
+
+ Hss * hss1; /**< Shield switch */
+ GPIOPAL * led2; /**< Shield LED 2 */
+ GPIOPAL * led3; /**< Shield LED 3 */
+ ADCPAL * pushButton; /**< Analog push button */
+ ADCPAL * vBat; /**< Battery voltage */
+
+ private:
+
+ const uint16_t rSense = 1000; /**< Diagnosis current sense resistor */
+ float vBatOffset = 0.0; /**< Battery voltage offset */
+
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_SHIELD_BTS5001X_HPP_ */
\ No newline at end of file
diff --git a/src/corelib/hss-shield-bts700x.cpp b/src/corelib/hss-shield-bts700x.cpp
new file mode 100644
index 0000000..2c9c253
--- /dev/null
+++ b/src/corelib/hss-shield-bts700x.cpp
@@ -0,0 +1,813 @@
+/**
+ * @file hss-shield-bts700x.cpp
+ * @brief Profet +2 (12V) shield with BTS700x-1EPP class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-shield-bts700x.hpp"
+
+using namespace hss;
+/**
+ * @brief High-Side-Switch-Board constructor
+ * @details Initialize all protected class pointers with a null pointer
+ * @param[in] led1 LED 1 instance
+ * @param[in] led2 LED 2 instance
+ * @param[in] led2 LED 3 instance
+ * @param[in] hsw1 High-side switch 1 instance
+ * @param[in] hsw2 High-side switch 2 instance
+ * @param[in] hsw3 High-side switch 3 instance
+ * @param[in] hsw4 High-side switch 4 instance
+ * @param[in] timer Timer instance
+ * @param[in] oloff Oloff instance
+ * @param[in] pushButtonDigital Push button GPIO instance
+ * @param[in] pushButtonAnalog Push button ADC instance
+ * @param[in] vBat Battery voltage
+ * @param[in] btxVariant Shield variant type
+ */
+Bts700xShield::Bts700xShield(GPIOPAL *led1, GPIOPAL *led2, GPIOPAL *led3, GPIOPAL *led4, Hss *hsw1, Hss *hsw2, Hss *hsw3, Hss *hsw4, TimerPAL *timer,
+ GPIOPAL *oloff, GPIOPAL *pushButtonDigital, ADCPAL *pushButtonAnalog, ADCPAL *vBat, BtxVariants_t* btxVariant)
+{
+ this->led1 = led1;
+ this->led2 = led2;
+ this->led3 = led3;
+ this->led4 = led4;
+
+ this->hss1 = hsw1;
+ this->hss2 = hsw2;
+ this->hss3 = hsw3;
+ this->hss4 = hsw4;
+
+ this->timer = timer;
+
+ this->oloff = oloff;
+ this->pushButtonDigital = pushButtonDigital;
+
+ this->pushButtonAnalog = pushButtonAnalog;
+ this->vBat = vBat;
+
+ this->btxVariant = btxVariant;
+}
+
+/**
+ * @brief Destructor of the High-Side-Switch-Board
+ *
+ */
+Bts700xShield::~Bts700xShield()
+{
+
+}
+
+/**
+ * @brief Initialize all necessary objects of the High-Side-Switch-Board
+ * @details This function initializes all necessary objects of the High-Side-Switch-Board.
+ * It retruns an error code to see if everything was initialized correctly.
+ * @return High-side switch error code
+ */
+Error_t Bts700xShield::init()
+{
+ Error_t err = OK;
+
+ do{
+ if(NULL != led1){
+ err = led1->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != led2){
+ err = led2->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != led3){
+ err = led3->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != led4){
+ err = led4->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss1){
+ err = hss1->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss2){
+ err = hss2->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss3){
+ err = hss3->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss4){
+ err = hss4->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != timer){
+ err = timer->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != oloff){
+ err = oloff->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != pushButtonDigital){
+ err = pushButtonDigital->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != pushButtonAnalog){
+ err = pushButtonAnalog->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != vBat){
+ err = vBat->init();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ filterVbat = new ExponentialFilter(0.0, 0.3);
+
+ if(NULL == btxVariant){
+ return NULLPTR_ERROR;
+ }
+
+ } while (0);
+
+ return err;
+}
+
+/**
+ * @brief Deinitialize all necessary objects of the High-Side-Switch-Board
+ * @details This function deinitializes all necessary objects of the High-Side-Switch-Board.
+ * It retruns an error code to see if everything was deinitialized correctly.
+ * @return High-side switch error code
+ */
+Error_t Bts700xShield::deinit()
+{
+ Error_t err = OK;
+
+ do{
+ if(NULL != led1){
+ err = led1->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != led2){
+ err = led2->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != led3){
+ err = led3->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != led4){
+ err = led4->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss1){
+ err = hss1->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss2){
+ err = hss2->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss3){
+ err = hss3->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != hss4){
+ err = hss4->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != timer){
+ err = timer->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != oloff){
+ err = oloff->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != pushButtonDigital){
+ err = pushButtonDigital->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != pushButtonAnalog){
+ err = pushButtonAnalog->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL != vBat){
+ err = vBat->deinit();
+ if(OK != err){
+ break;
+ }
+ }
+ else{
+ err = NULLPTR_ERROR;
+ break;
+ }
+
+ if(NULL == btxVariant){
+ return NULLPTR_ERROR;
+ }
+
+ } while (0);
+
+ return err;
+}
+
+/**
+ * @brief Switch on the selected High-Side-Switch
+ * @details This function turns on the desired High-Side-Switch.
+ * It also turns on the corresponding LED of the switch.
+ * @param[in] x Number of the Switch the should be turned on (1-4)
+ * @return High-side switch error code
+ */
+Error_t Bts700xShield::switchHxOn(uint8_t x)
+{
+ Error_t err = OK;
+
+ switch(x)
+ {
+ case 1:
+ err = hss1->enable();
+ if (NULL != led1 && OK == err)
+ err = led1->enable();
+ break;
+
+ case 2:
+ err = hss2->enable();
+ if (NULL != led2 && OK == err)
+ err = led2->enable();
+ break;
+
+ case 3:
+ err = hss3->enable();
+ if (NULL != led3 && OK == err)
+ err = led3->enable();
+ break;
+
+ case 4:
+ err = hss4->enable();
+ if (NULL != led4 && OK == err)
+ err = led4->enable();
+ break;
+ }
+
+ return err;
+}
+
+/**
+ * @brief Switch off the selected High-Side-Switch
+ * @details This function turns off the desired High-Side-Switch.
+ * It also turns off the corresponding LED of the switch.
+ * @param[in] x Number of the Switch the should be turned off (1-4)
+ * @return High-side switch error code
+ */
+Error_t Bts700xShield::switchHxOff(uint8_t x)
+{
+ Error_t err = OK;
+
+ switch(x)
+ {
+ case 1:
+ err = hss1->disable();
+ if (NULL != led1 && OK == err)
+ err = led1->disable();
+ break;
+
+ case 2:
+ err = hss2->disable();
+ if (NULL != led2 && OK == err)
+ err = led2->disable();
+ break;
+
+ case 3:
+ err = hss3->disable();
+ if (NULL != led3 && OK == err)
+ err = led3->disable();
+ break;
+
+ case 4:
+ err = hss4->disable();
+ if (NULL != led4 && OK == err)
+ err = led4->disable();
+ break;
+ }
+
+ return err;
+}
+
+/**
+ * @brief Turn on the selected High-Side-Switches
+ * @details This function is used to enable multiple switches at once.
+ * @param[in] h1 Enable the first switch if h1 == true
+ * @param[in] h2 Enable the second switch if h2 == true
+ * @param[in] h3 Enable the third switch if h3 == true
+ * @param[in] h4 Enable the fourth switch if h4 == true
+ * @return High-side switch error code
+ */
+Error_t Bts700xShield::switchesHxOn(bool h1, bool h2, bool h3, bool h4)
+{
+ Error_t err = OK;
+
+ do{
+ if(h1 == true){
+ err = hss1->enable();
+ if (NULL != led1 && OK == err)
+ err = led1->enable();
+ else
+ break;
+ }
+
+ if(h2 == true){
+ err = hss2->enable();
+ if (NULL != led2 && OK == err)
+ err = led2->enable();
+ else
+ break;
+ }
+
+ if(h3 == true){
+ err = hss3->enable();
+ if (NULL != led3 && OK == err)
+ err = led3->enable();
+ else
+ break;
+ }
+
+ if(h4 == true){
+ err = hss4->enable();
+ if (NULL != led4 && OK == err)
+ err = led4->enable();
+ else
+ break;
+ }
+ } while (0);
+
+ return err;
+}
+
+/**
+ * @brief Turn off the selected High-Side-Switches
+ * @details This function is used to disable multiple switches at once.
+ * @param[in] h1 Disable the first switch if h1 == true
+ * @param[in] h2 Disable the second switch if h2 == true
+ * @param[in] h3 Disable the third switch if h3 == true
+ * @param[in] h4 Disable the fourth switch if h4 == true
+ * @return High-side switch error code
+ */
+Error_t Bts700xShield::switchesHxOff(bool h1, bool h2, bool h3, bool h4)
+{
+ Error_t err = OK;
+
+ do{
+ if(h1 == true){
+ err = hss1->disable();
+ if (NULL != led1 && OK == err)
+ err = led1->disable();
+ else
+ break;
+ }
+
+ if(h2 == true){
+ err = hss2->disable();
+ if (NULL != led2 && OK == err)
+ err = led2->disable();
+ else
+ break;
+ }
+
+ if(h3 == true){
+ err = hss3->disable();
+ if (NULL != led3 && OK == err)
+ err = led3->disable();
+ else
+ break;
+ }
+
+ if(h4 == true){
+ err = hss4->disable();
+ if (NULL != led4 && OK == err)
+ err = led4->disable();
+ else
+ break;
+ }
+ } while (0);
+
+ return err;
+}
+
+/**
+ * @brief Read the diagnosis of the chosen channel
+ * @details This function uses the current signal of the channel to diagnose the channel.
+ * It returns the different states depending on the channels condition.
+ * @param[in] x Desired channel for the diagnosis (1-4)
+ * @return DiagStatus_t
+ * @retval 0 Everything works correctly
+ * @retval 2 Short to ground
+ * @retval 4 Short to battery
+ * @retval 5 Open load
+ */
+DiagStatus_t Bts700xShield::readDiagx(uint8_t x)
+{
+ DiagStatus_t diagStatus = NORMAL;
+
+ float currentOn = 0.0;
+ float currentOff = 0.0;
+
+ switch(x)
+ {
+ case 1:
+ hss1->enableDiag();
+ if(hss1->getSwitchStatus() == POWER_ON)
+ {
+ currentOn = readIsx(1);
+ diagStatus = hss1->diagRead(currentOn);
+ }
+ else
+ {
+ oloff->enable();
+ timer->delayMicro(300);
+ currentOn = readIsx(1);
+
+ oloff->disable();
+ timer->delayMicro(400);
+ currentOff = readIsx(1);
+ diagStatus = diagnosisOff(currentOn, currentOff);
+ }
+ hss1->disableDiag();
+ break;
+
+ case 2:
+ hss2->enableDiag();
+ if(hss2->getSwitchStatus() == POWER_ON)
+ {
+ currentOn = readIsx(2);
+ diagStatus = hss2->diagRead(currentOn);
+ }
+ else
+ {
+ oloff->enable();
+ timer->delayMicro(300);
+ currentOn = readIsx(2);
+
+ oloff->disable();
+ timer->delayMicro(400);
+ currentOff = readIsx(2);
+ diagStatus = diagnosisOff(currentOn, currentOff);
+ }
+ hss2->disableDiag();
+ break;
+
+ case 3:
+ hss3->enableDiag();
+ if(hss3->getSwitchStatus() == POWER_ON)
+ {
+ currentOn = readIsx(3);
+ diagStatus = hss3->diagRead(currentOn);
+ }
+ else
+ {
+ oloff->enable();
+ timer->delayMicro(300);
+ currentOn = readIsx(3);
+
+ oloff->disable();
+ timer->delayMicro(400);
+ currentOff = readIsx(3);
+ diagStatus = diagnosisOff(currentOn, currentOff);
+ }
+ hss3->disableDiag();
+ break;
+
+ case 4:
+ hss4->enableDiag();
+ if(hss4->getSwitchStatus() == POWER_ON)
+ {
+ currentOn = readIsx(4);
+ diagStatus = hss4->diagRead(currentOn);
+ }
+ else
+ {
+ oloff->enable();
+ timer->delayMicro(300);
+ currentOn = readIsx(4);
+
+ oloff->disable();
+ timer->delayMicro(400);
+ currentOff = readIsx(4);
+ diagStatus = diagnosisOff(currentOn, currentOff);
+ }
+ hss4->disableDiag();
+ break;
+ }
+
+ return diagStatus;
+}
+
+/**
+ * @brief Read the desired current value of the chosen channel
+ * @details This function reads the IS pin of the chosen High-Side-Switch
+ * and calculates the current which is flowing through the switch
+ * with the acquired ADC value.
+ * @param[in] x Number of the desired channel (1-4)
+ * @return The value of the current in [A]
+ */
+float Bts700xShield::readIsx(uint8_t x)
+{
+ float isVal = 0.0;
+
+ switch (x)
+ {
+ case 1:
+ hss1->enableDiag();
+ isVal = hss1->readIs(rSense);
+ hss1->disableDiag();
+ break;
+
+ case 2:
+ hss2->enableDiag();
+ isVal = hss2->readIs(rSense);
+ hss2->disableDiag();
+ break;
+
+ case 3:
+ hss3->enableDiag();
+ isVal = hss3->readIs(rSense);
+ hss3->disableDiag();
+ break;
+
+ case 4:
+ hss4->enableDiag();
+ isVal = hss4->readIs(rSense);
+ hss4->disableDiag();
+ break;
+ }
+
+ return isVal;
+}
+
+/**
+ * @brief Reads the batter voltage
+ * @details This functions is reading the attached voltage at the Profet-Board.
+ * @return Value of the battery voltage in [V]
+ */
+float Bts700xShield::readVss()
+{
+ uint16_t adcResult = 0;
+ float voltage = 0.0;
+
+ adcResult = vBat->ADCRead();
+ voltage = adcResult * ((float)5/(float)1024); // Vmax/1024 LSB = Resolution of the ADC
+ voltage = (voltage - vBatOffset);
+ voltage = voltage * ((float)57/(float)10); // 57/10 = Reverse Voltage devider to get the Supplyvoltage
+
+ filterVbat->input(voltage);
+
+ return filterVbat->output();
+}
+
+/**
+ * @brief Read the button state
+ * @return bool
+ * @retval true If button is pressed
+ * @retval false If button is not pressed
+ */
+bool Bts700xShield::digitalReadButton()
+{
+ if(pushButtonDigital->read() == GPIOPAL::GPIO_LOW){
+ return true;
+ }
+ else{
+ return false;
+ }
+}
+
+/**
+ * @brief Read the button state (analog)
+ * @retval true If button is pressed
+ * @retval false If button is not pressed
+ */
+bool Bts700xShield::analogReadButton()
+{
+ uint16_t result = 0;
+
+ result = pushButtonAnalog->ADCRead();
+ if(result < 20){
+ return true;
+ }
+ else{
+ return false;
+ }
+}
+
+/**
+ * @brief Set battery voltage offset
+ * @details This function can be used to change the value of the internal variable
+ * of the battery voltage offset
+ * @param[in] offset Desired value of the offset in [V]
+ */
+void Bts700xShield::setVoltageOffset(float offset)
+{
+ vBatOffset = offset;
+}
+
+/**
+ * @brief Calculates the diagnosis state
+ * @details This functions determines the diagnosis state of the High-Side-Switch.
+ * It uses the measured currents with en- and disabled Open-Load-Detection.
+ * @param[in] currentOn Measrued current with Open-Load-Detection on
+ * @param[in] currentOff Measrued current with Open-Load-Detection off
+ * @return DiagStatus_t
+ */
+DiagStatus_t Bts700xShield::diagnosisOff(float currentOn, float currentOff)
+{
+ if((currentOn > (btxVariant->iisOl * btxVariant->kilis)) && (currentOn < (btxVariant->iisFault * btxVariant->kilis))){
+ if((currentOff > (btxVariant->iisOl * btxVariant->kilis)) && (currentOff < (btxVariant->iisFault * btxVariant->kilis))){
+ return SHORT_TO_VSS;
+ }
+ else{
+ return OPEN_LOAD;
+ }
+ }
+ else{
+ if((currentOn > (btxVariant->iisFault * btxVariant->kilis))){
+ return SHORT_TO_GND_OR_OT;
+ }
+ else{
+ return NORMAL;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/corelib/hss-shield-bts700x.hpp b/src/corelib/hss-shield-bts700x.hpp
new file mode 100644
index 0000000..f05b75d
--- /dev/null
+++ b/src/corelib/hss-shield-bts700x.hpp
@@ -0,0 +1,89 @@
+/**
+ * @file hss-shield-bts700x.hpp
+ * @brief Profet +2 (12V) shield with BTS700x-1EPP class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_BTS700x_HPP_
+#define HSS_SHIELD_BTS700x_HPP_
+
+#include "hss-shield.hpp"
+#include "hss-variants.hpp"
+#include "hss.hpp"
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssCorelib
+ * @{
+ */
+
+/**
+ * @brief Profet +2 (12V) shield with BTS700x-1EPP API
+ */
+
+class Bts700xShield : public HssShield
+{
+ public:
+
+ Bts700xShield(GPIOPAL *led1, GPIOPAL *led2, GPIOPAL *led3, GPIOPAL *led4, Hss *hsw1, Hss *hsw2, Hss *hsw3, Hss *hsw4, TimerPAL *timer,
+ GPIOPAL *oloff, GPIOPAL *pushButtonDigital, ADCPAL *pushButtonAnalog, ADCPAL *vBat, BtxVariants_t* btxVariant);
+ ~Bts700xShield();
+
+ Error_t init();
+ Error_t deinit();
+ Error_t switchHxOn(uint8_t x);
+ Error_t switchHxOff(uint8_t x);
+ Error_t switchesHxOn(bool h1 = false, bool h2 = false, bool h3 = false, bool h4 = false);
+ Error_t switchesHxOff(bool h1 = false, bool h2 = false, bool h3 = false, bool h4 = false);
+
+ DiagStatus_t readDiagx(uint8_t x);
+
+ float readIsx(uint8_t x);
+ float readVss();
+
+ bool digitalReadButton();
+ bool analogReadButton();
+
+ void setVoltageOffset(float offset);
+
+ protected:
+
+ ExponentialFilter *filterVbat; /**< Battery voltage filter */
+
+ GPIOPAL *led1; /**< Shield LED 1 */
+ GPIOPAL *led2; /**< Shield LED 2 */
+ GPIOPAL *led3; /**< Shield LED 3 */
+ GPIOPAL *led4; /**< Shield LED 4 */
+
+ Hss *hss1; /**< Shield switch 1 */
+ Hss *hss2; /**< Shield switch 2 */
+ Hss *hss3; /**< Shield switch 3 */
+ Hss *hss4; /**< Shield switch 4 */
+
+ TimerPAL *timer; /**< Timer instance */
+
+ GPIOPAL *oloff; /**< Output offset */
+
+ GPIOPAL *pushButtonDigital; /**< Digital push button */
+ ADCPAL *pushButtonAnalog; /**< Analog push button */
+ ADCPAL *vBat; /**< Battery voltage */
+
+ BtxVariants_t *btxVariant; /**< BTx switch variant */
+
+ private:
+
+ DiagStatus_t diagnosisOff(float currentOn, float currentOff);
+
+ float vBatOffset = 0.0; /**< Battery voltage offset */
+ const uint16_t rSense = 1000; /**< Diagnosis current sense resistor */
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_SHIELD_BTS700x_HPP_ */
\ No newline at end of file
diff --git a/src/corelib/hss-shield-btt60xx.cpp b/src/corelib/hss-shield-btt60xx.cpp
new file mode 100644
index 0000000..a97bf60
--- /dev/null
+++ b/src/corelib/hss-shield-btt60xx.cpp
@@ -0,0 +1,275 @@
+/**
+ * @file hss-shield-btt60xx.cpp
+ * @brief Profet (24V) shield with BTT6030-2EKA and BTT6020-1EKA class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-shield-btt60xx.hpp"
+
+using namespace hss;
+
+/**
+ * @brief Profet 24V BTT60xx Shield constructor
+ * @param[in] hsw0 High-side switch 0 instance
+ * @param[in] hsw1 High-side switch 1 instance
+ * @param[in] hsw2 High-side switch 2 instance
+ */
+Btt60xxShield::Btt60xxShield(Hss *hsw0, Hss *hsw1, Hss *hsw2)
+{
+ switches[0] = hsw0;
+ switches[1] = hsw1;
+ switches[2] = hsw2;
+}
+
+/**
+ * @brief Destructor of the Profet 24V Shield
+ *
+ */
+Btt60xxShield::~Btt60xxShield()
+{
+
+}
+
+/**
+ * @brief Initialize all necessary objects of the Profet 24V Shield
+ * @details This function initializes all necessary objects of the Profet 24V Shield.
+ * It returns an error code to see if everything was initialized correctly.
+ * @return High-side switch error code
+ */
+Error_t Btt60xxShield::init()
+{
+ Error_t err = OK;
+
+ for(uint8_t i = 0; i < hssNum; i++)
+ {
+ HSS_ASSERT_NULLPTR(switches[i]);
+ err = switches[i]->init();
+ HSS_ASSERT_RET(err);
+ }
+
+ return err;
+}
+
+/**
+ * @brief Deinitialize all necessary objects of the Profet 24V Shield
+ *
+ * This function deinitializes all necessary objects of the Profet 24V Shield.
+ * It retruns an error code to see if everything was deinitialized correctly.
+ *
+ * @return High-side switch error code
+ */
+Error_t Btt60xxShield::deinit()
+{
+ Error_t err = OK;
+
+ for(uint8_t i = 0; i < hssNum; i++)
+ {
+ HSS_ASSERT_NULLPTR(switches[i]);
+ err = switches[i]->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ return err;
+}
+
+/**
+ * @brief Switch on the selected High-Side-Switch
+ * @details This function turns on the desired High-Side-Switch.
+ * @param[in] x Number of the Switch the should be turned on (0-4). Possible values: \n
+ * Switch 0 - Profet 0 (BTT6030 - channel 0) \n
+ * Switch 1 - Profet 0 (BTT6030 - channel 1) \n
+ * Switch 2 - Profet 1 (BTT6030 - channel 0) \n
+ * Switch 3 - Profet 1 (BTT6030 - channel 1) \n
+ * Switch 4 - Profet 2 (Single channel)
+ * @return High-side switch error code
+ */
+Error_t Btt60xxShield::switchHxOn(uint8_t x)
+{
+ Error_t err = OK;
+
+ Channel_t ch = (Channel_t)(x % 2);
+ uint8_t hss = x/2;
+ HSS_ASSERT_NULLPTR(switches[hss]);
+ err = switches[hss]->enable(ch);
+
+ return err;
+}
+
+/**
+ * @brief Switch off the selected High-Side-Switch
+ * @details This function turns off the desired High-Side-Switch.
+ * @param[in] x Number of the Switch the should be turned on (0-4). Possible values: \n
+ * Switch 0 - Profet 0 (BTT6030 - channel 0) \n
+ * Switch 1 - Profet 0 (BTT6030 - channel 1) \n
+ * Switch 2 - Profet 1 (BTT6030 - channel 0) \n
+ * Switch 3 - Profet 1 (BTT6030 - channel 1) \n
+ * Switch 4 - Profet 2 (Single channel)
+ * @return High-side switch error code
+ */
+Error_t Btt60xxShield::switchHxOff(uint8_t x)
+{
+ Error_t err = OK;
+
+ Channel_t ch = (Channel_t)(x % 2);
+ uint8_t hss = x/2;
+ HSS_ASSERT_NULLPTR(switches[x]);
+ err = switches[hss]->disable(ch);
+
+ return err;
+}
+
+/**
+ * @brief Turn on the selected High-Side-Switches
+ * @details This function is used to enable multiple switches at once.
+ * @param[in] h0_0 Enable the Switch 0 - channel 0 if h0_0 = true
+ * @param[in] h1_0 Enable the Switch 0 - channel 1 if h1_0 = true
+ * @param[in] h0_1 Enable the Switch 1 - channel 0 if h0_1 = true
+ * @param[in] h1_1 Enable the Switch 1 - channel 1 if h1_1 = true
+ * @param[in] h2 Enable the Switch 2 - channel 0 if h2 = true
+ * @return High-side switch error code
+ */
+Error_t Btt60xxShield::switchesHxOn(bool h0_0, bool h1_0, bool h0_1, bool h1_1, bool h2)
+{
+ Error_t err = OK;
+
+ if(h0_0 == true){
+ HSS_ASSERT_NULLPTR(switches[0]);
+ err = switches[0]->enable();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h1_0 == true){
+ HSS_ASSERT_NULLPTR(switches[0]);
+ err = switches[0]->enable(CHANNEL1);
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h0_1 == true){
+ HSS_ASSERT_NULLPTR(switches[1]);
+ err = switches[1]->enable();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h1_1 == true){
+ HSS_ASSERT_NULLPTR(switches[1]);
+ err = switches[1]->enable(CHANNEL1);
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h2 == true){
+ HSS_ASSERT_NULLPTR(switches[2]);
+ err = switches[2]->enable();
+ HSS_ASSERT_RET(err);
+ }
+ return err;
+}
+
+/**
+ * @brief Turn off the selected High-Side-Switches
+ * @details This function is used to disable multiple switches at once.
+ * @param[in] h0_0 Disable the Switch 0 - channel 0 if h0_0 = true
+ * @param[in] h1_0 Disable the Switch 0 - channel 1 if h1_0 = true
+ * @param[in] h0_1 Disable the Switch 1 - channel 0 if h0_1 = true
+ * @param[in] h1_1 Disable the Switch 1 - channel 1 if h1_1 = true
+ * @param[in] h2 Disable the Switch 2 - channel 0 if h2 = true
+ * @return High-side switch error code
+ */
+Error_t Btt60xxShield::switchesHxOff(bool h0_0, bool h1_0, bool h0_1, bool h1_1, bool h2)
+{
+ Error_t err = OK;
+
+ if(h0_0 == true){
+ HSS_ASSERT_NULLPTR(switches[0]);
+ err = switches[0]->disable();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h1_0 == true){
+ HSS_ASSERT_NULLPTR(switches[0]);
+ err = switches[0]->disable(CHANNEL1);
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h0_1 == true){
+ HSS_ASSERT_NULLPTR(switches[1]);
+ err = switches[1]->disable();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h1_1 == true){
+ HSS_ASSERT_NULLPTR(switches[1]);
+ err = switches[1]->disable(CHANNEL1);
+ HSS_ASSERT_RET(err);
+ }
+
+ if(h2 == true){
+ HSS_ASSERT_NULLPTR(switches[2]);
+ err = switches[2]->disable();
+ HSS_ASSERT_RET(err);
+ }
+ return err;
+}
+
+/**
+ * @brief Read the desired current value of the chosen channel
+ * @details This function: \n
+ * - Enables diagnosis for the channel \n
+ * - Selects the channel through dsel \n
+ * - Calls function to get the calibrated sensed current value on chosen channel \n
+ * - Disables diagnosis pin post operation completion \n
+ * @param[in] x Number of the Switch the should be turned on (0-4). Possible values: \n
+ * Switch 0 - Profet 0 (BTT6030 - channel 0) \n
+ * Switch 1 - Profet 0 (BTT6030 - channel 1) \n
+ * Switch 2 - Profet 1 (BTT6030 - channel 0) \n
+ * Switch 3 - Profet 1 (BTT6030 - channel 1) \n
+ * Switch 4 - Profet 2 (Single channel)
+ * @return The calibrated value of the current in [A]
+ */
+float Btt60xxShield::readIsx(uint8_t x)
+{
+ float iisCalib;
+ uint8_t hss = x/2;
+ Channel_t ch = Channel_t(x % 2);
+
+ HSS_ASSERT_NULLPTR(switches[hss]);
+ switches[hss]->enableDiag();
+ iisCalib = switches[hss]->readIs(rSense, ch);
+ switches[hss]->disableDiag();
+
+ return iisCalib;
+}
+
+/**
+ * @brief Read the diagnosis of the chosen channel
+ * @details This function uses the current signal of the channel to diagnose perform diagnosis.
+ * It returns the different states depending on the channels condition.
+ * @param[in] x Number of the Switch the should be turned on (0-4). Possible values: \n
+ * Switch 0 - Profet 0 (BTT6030 - channel 0) \n
+ * Switch 1 - Profet 0 (BTT6030 - channel 1) \n
+ * Switch 2 - Profet 1 (BTT6030 - channel 0) \n
+ * Switch 3 - Profet 1 (BTT6030 - channel 1) \n
+ * Switch 4 - Profet 2 (Single channel)
+ * @return DiagStatus_t
+ * @retval 0 Everything works correctly
+ * @retval 2 Short to ground
+ * @retval 4 Short to battery
+ * @retval 5 Open load
+ */
+DiagStatus_t Btt60xxShield::readDiagx(uint8_t x)
+{
+ DiagStatus_t diagStatus = NORMAL;
+ float currentOn = 0.0;
+
+ uint8_t hss = x/2;
+
+ switches[hss]->enableDiag();
+ if(switches[hss]->getSwitchStatus() == POWER_ON){
+ currentOn = readIsx(x);
+ diagStatus = switches[hss]->diagRead(currentOn);
+ }
+ switches[hss]->disableDiag();
+
+ return diagStatus;
+}
\ No newline at end of file
diff --git a/src/corelib/hss-shield-btt60xx.hpp b/src/corelib/hss-shield-btt60xx.hpp
new file mode 100644
index 0000000..d63c58b
--- /dev/null
+++ b/src/corelib/hss-shield-btt60xx.hpp
@@ -0,0 +1,59 @@
+/**
+ * @file hss-shield-btt60xx.hpp
+ * @brief Profet (24V) shield with BTT6030-2EKA and BTT6020-1EKA class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_BTT60XX_HPP_
+#define HSS_SHIELD_BTT60XX_HPP_
+
+#include "hss-shield.hpp"
+#include "hss.hpp"
+#include "hss-variants.hpp"
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssCorelib
+ * @{
+ */
+
+/**
+ * @brief Profet (24V) shield with BTT6030-2EKA and BTT6020-1EKA API
+ */
+
+class Btt60xxShield : HssShield
+{
+ public:
+
+ Btt60xxShield(Hss * hsw0, Hss * hsw1, Hss * hsw2);
+ ~Btt60xxShield();
+
+ Error_t init();
+ Error_t deinit();
+ Error_t switchHxOn (uint8_t x);
+ Error_t switchHxOff (uint8_t x);
+ Error_t switchesHxOn (bool h0_0 = false, bool h1_0 = false, bool h0_1 = false, bool h1_1 = false, bool h2 = false);
+ Error_t switchesHxOff(bool h0_0 = false, bool h1_0 = false, bool h0_1 = false, bool h1_1 = false, bool h2 = false);
+ DiagStatus_t readDiagx (uint8_t x);
+ float readIsx (uint8_t x);
+
+ protected:
+
+ static constexpr uint8_t hssNum = 3; /**< Number of high side switches in the board */
+ Hss * switches[hssNum]; /**< Shield switches */
+
+ private:
+
+ const uint16_t rSense = 1200; /**< Diagnosis current sense resistor */
+
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_SHIELD_BTT60XX_HPP_ */
\ No newline at end of file
diff --git a/src/corelib/hss-shield.hpp b/src/corelib/hss-shield.hpp
new file mode 100644
index 0000000..dea27c4
--- /dev/null
+++ b/src/corelib/hss-shield.hpp
@@ -0,0 +1,81 @@
+/**
+ * @file hss-shield.hpp
+ * @brief High side switch shield abstract class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_HPP_
+#define HSS_SHIELD_HPP_
+
+#include "hss-types.hpp"
+#include
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssCorelib
+ * @{
+ */
+
+/**
+ * @brief High side switch shield abstract API
+ */
+
+class HssShield
+{
+ public:
+
+ /**
+ * @brief Default destructor
+ */
+ virtual ~HssShield(){};
+
+ /**
+ * @brief Initializes the shield including it hardware instances
+ * @return High-side switch error code
+ */
+ virtual Error_t init() = 0;
+
+ /**
+ * @brief Deinitializes the shield including it hardware instances
+ * @return High-side switch error code
+ */
+ virtual Error_t deinit() = 0;
+
+ /**
+ * @brief Turns on the specified shield switch output number
+ * @param[in] x Switch output number
+ * @return High-side switch error code
+ */
+ virtual Error_t switchHxOn (uint8_t x) = 0;
+
+ /**
+ * @brief Turns off the specified shield switch output number
+ * @param[in] x Switch output number
+ * @return High-side switch error code
+ */
+ virtual Error_t switchHxOff(uint8_t x) = 0;
+
+ /**
+ * @brief Reads the diagnose from the specified shield switch output number
+ * @param[in] x Switch output number
+ * @return High-side switch error code
+ */
+ virtual DiagStatus_t readDiagx (uint8_t x) = 0;
+
+ /**
+ * @brief Read the diagnose current from the specified shield switch output number
+ * @param[in] x Switch output number
+ * @return Current value in mA
+ */
+ virtual float readIsx (uint8_t x) = 0;
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_SHIELD_HPP_ **/
diff --git a/src/corelib/hss-types.hpp b/src/corelib/hss-types.hpp
new file mode 100644
index 0000000..b7f2f5a
--- /dev/null
+++ b/src/corelib/hss-types.hpp
@@ -0,0 +1,103 @@
+/**
+ * @file hss-types.hpp
+ * @brief High side switch types
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_TYPES_HPP_
+#define HSS_TYPES_HPP_
+
+namespace hss
+{
+ /**
+ * @addtogroup hssCorelib
+ * @{
+ */
+
+ /**
+ * @brief Error codes
+ * @{
+ */
+ enum Error_t
+ {
+ OK = 0, /**< No error */
+ INTF_ERROR = -1, /**< Interface error */
+ CONF_ERROR = -2, /**< Configuration error */
+ READ_ERROR = -3, /**< Read error */
+ WRITE_ERROR = -4, /**< Write error */
+ NULLPTR_ERROR = -5, /**< Null pointer error */
+ INVALID_CH_ERROR = -6, /**< Invalid channel error */
+ UNSUPPORTED_OP_ERROR = -7, /**< Invalid channel error */
+ INIT_ERROR = -8 /**< Not initialized */
+ };
+ /** @} */
+
+ /**
+ * @brief Channel numbers
+ * @{
+ */
+ enum Channel_t
+ {
+ CHANNEL0 = 0, /**< Channel 1 : Valid for BTT shields */
+ CHANNEL1 = 1, /**< Channel 2 : Valid for BTT shields */
+ ALL_CHANNELS = 2, /**< Select all channels : Valid for BTT shields */
+ NO_CHANNEL = 3 /**< No channel to select */
+ };
+ /** @} */
+
+ /**
+ * @brief Switch status
+ * @{
+ */
+ enum Status_t{
+ UNINITED = 0, /**< Not initialized */
+ INITED = 1, /**< Initiliazed */
+ POWER_ON = 2, /**< Power on */
+ POWER_OFF = 3, /**< Power off */
+ };
+ /** @} */
+
+ /**
+ * @brief Diagnosis enable
+ * @{
+ */
+ enum DiagEnable_t{
+ DIAG_EN = 0, /**< Enabled */
+ DIAG_DIS = 1, /**< Disabled */
+ };
+ /** @} */
+
+ /**
+ * @brief Diagnosis status
+ * @{
+ */
+ enum DiagStatus_t{
+ DIAG_READ_ERROR = -1, /**< Read Error */
+ NOT_ENABLED = -2, /**< Diagnosis not enabled */
+ NORMAL = 0, /**< Switch works correctly */
+ FAULT = 1, /**< Switch is in fault condition (Is_fault at IS pin), which can mean "Short to GND", "Overtemperature" or "Overload" */
+ FAULT_OL_IC = 2, /**< Switch is is either in Open Load (whit enable channel) or inverse current is flowing */
+ SHORT_TO_GND_OR_OT = 3, /**< Short to the ground or Overtemperature detected*/
+ SHORT_TO_VSS = 5, /**< Short to the supply voltage */
+ OPEN_LOAD = 6, /**< Open load detected */
+ };
+ /** @} */
+
+}
+
+/**
+ * @brief Asserts the HSS return code, returning if it is not OK
+ */
+#define HSS_ASSERT_RET(x) if( x != OK ) { return x; }
+
+/**
+ * @brief Assert if a pointer is nullptr, returning NULLPTR error if null
+ */
+#define HSS_ASSERT_NULLPTR(x) if( x == nullptr ) { return NULLPTR_ERROR; }
+
+/** @} */
+
+
+#endif /** HSS_TYPES_HPP_ **/
\ No newline at end of file
diff --git a/src/corelib/hss-variants.cpp b/src/corelib/hss-variants.cpp
new file mode 100644
index 0000000..fe6fede
--- /dev/null
+++ b/src/corelib/hss-variants.cpp
@@ -0,0 +1,110 @@
+/**
+ * @file hss-variants.cpp
+ * @brief High side switch hardware variants
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-variants.hpp"
+
+namespace hss
+{
+
+/**
+ * @brief BTS7002.
+ * @details Is rated for nominal 21 A and is the Profet with the highest useable power
+ */
+BtxVariants_t BTS7002 = {
+ .type = BTS700X,
+ .kilis = 22700,
+ .iisFault = 0.0044,
+ .iisOl = 0.0018,
+ .iisEn = 0.000002
+};
+
+/**
+ * @brief BTS7002.
+ * @details Is rated for nominal 15 A
+ */
+BtxVariants_t BTS7004 = {
+ .type = BTS700X,
+ .kilis = 20000,
+ .iisFault = 0.0044,
+ .iisOl = 0.0018,
+ .iisEn = 0.000002
+};
+
+/**
+ * @brief BTS7006.
+ * @details Is rated for nominal 12.5 A
+ */
+BtxVariants_t BTS7006 = {
+ .type = BTS700X,
+ .kilis = 17700,
+ .iisFault = 0.0044,
+ .iisOl = 0.0018,
+ .iisEn = 0.000002
+};
+
+/**
+ * @brief BTS7008.
+ * @details Is rated for nominal 11 A
+ */
+BtxVariants_t BTS7008 = {
+ .type = BTS700X,
+ .kilis = 14500,
+ .iisFault = 0.0044,
+ .iisOl = 0.0018,
+ .iisEn = 0.000002
+};
+
+/**
+ * @brief BTS50010-1TAD.
+ * @details Is rated for nominal 40 A
+ */
+BtxVariants_t BTS50010 = {
+ .type = BTS5001X,
+ .kilis = 52100,
+ .iisFault = 0.0035,
+ .iisOl = 0.0,
+ .iisEn = 0.0,
+ .iisO = 0.000008
+};
+
+/**
+ * @brief BTS50015-1TAD.
+ * @details Is rated for nominal 33 A
+ */
+BtxVariants_t BTS50015 = {
+ .type = BTS5001X,
+ .kilis = 51500,
+ .iisFault = 0.0035,
+ .iisOl = 0.0,
+ .iisEn = 0.0,
+ .iisO = 0.000005
+};
+
+/**
+ * @brief BTT6020.
+ * @details Is rated for nominal 7 A
+ */
+BtxVariants_t BTT6020 = {
+ .type = BTT60X0,
+ .kilis = 2950,
+ .iisFault = 0.006,
+ .iisOl = 0.000004
+};
+
+/**
+ * @brief BTT6030.
+ * @details Is rated for nominal 5 A per channel
+ */
+BtxVariants_t BTT6030 = {
+ .type = BTT60X0,
+ .kilis = 2240,
+ .iisFault = 0.006,
+ .iisOl = 0.000005
+};
+
+}
\ No newline at end of file
diff --git a/src/corelib/hss-variants.hpp b/src/corelib/hss-variants.hpp
new file mode 100644
index 0000000..0536f76
--- /dev/null
+++ b/src/corelib/hss-variants.hpp
@@ -0,0 +1,62 @@
+/**
+ * @file hss-variants.hpp
+ * @brief High side switch hardware variants
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_VARIANTS_HPP_
+#define HSS_VARIANTS_HPP_
+
+#include
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssCorelib
+ * @{
+ */
+
+/**
+ * @brief High side switch variant type
+ */
+enum HssType_t
+{
+ BTS700X, /**< PROFET +2 12V family */
+ BTS5001X, /**< Power PROFET family */
+ BTT60X0 /**< PROFET + 24V family */
+};
+
+/**
+ * @brief High side switch hardware variant struct
+ * @details It contains all important parameters for the correct usage of
+ * of the diagnosis functions of the Switch
+ */
+struct BtxVariants_t
+{
+ HssType_t type; /**< Type of the chosen High side switch */
+ const uint16_t kilis; /**< Current sense ratio */
+ float iisFault; /**< Current in case of fault event */
+ float iisOl; /**< Current in case of an open load */
+ float iisEn; /**< Leakage current when channel is enabled */
+ float iisO; /**< Sense offset */
+};
+
+extern BtxVariants_t BTS7002;
+extern BtxVariants_t BTS7004;
+extern BtxVariants_t BTS7006;
+extern BtxVariants_t BTS7008;
+
+extern BtxVariants_t BTT6030;
+extern BtxVariants_t BTT6020;
+
+extern BtxVariants_t BTS50015;
+extern BtxVariants_t BTS50010;
+
+/** @} */
+
+}
+
+#endif /** HSS_VARIANTS_HPP_ **/
\ No newline at end of file
diff --git a/src/corelib/hss.cpp b/src/corelib/hss.cpp
index cda9c68..23fe206 100644
--- a/src/corelib/hss.cpp
+++ b/src/corelib/hss.cpp
@@ -1,61 +1,69 @@
-/**
+/**
* @file hss.cpp
- * @brief Definition of the High-Side-Switch class functions
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
+ * @brief High side switch class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
* SPDX-License-Identifier: MIT
*/
-
-#include
#include
#include "hss.hpp"
+using namespace hss;
+
/**
- * @brief High-Side-Switch default constructor
- *
- * Initialize all protected class pointers with a null pointer.
- * Also sets the class variables into a default state
+ * @brief High-Side-Switch constructor
+ * @param[in] den Diagnosis enable GPIO instance
+ * @param[in] in Switch input GPIO instance
+ * @param[in] is Diagnose current ADC instance
+ * @param[in] timer Timer instance
+ * @param[in] btxVariant BTx variant
*/
-Hss::Hss()
+Hss::Hss(GPIOPAL *den, GPIOPAL *in, ADCPAL *is, TimerPAL *timer, BtxVariants_t *btxVariant)
{
- den = NULL;
- in = NULL;
- is = NULL;
+ this->den = den;
+ this->in0 = in;
+ this->in1 = nullptr;
+ this->is = is;
+ this->dsel = nullptr;
+
+ this->timer = timer;
- timer = NULL;
+ this->btxVariant = btxVariant;
- currentFilter = NULL;
+ currentFilter = new ExponentialFilter(0.0, 0.3);
- btsVariant = NULL;
status = UNINITED;
diagEnb = DIAG_DIS;
diagStatus = NOT_ENABLED;
}
/**
- * @brief High-Side-Switch constructor
- *
- * This constructor is used to define all necessary pins and the variant
- * of the PROFET.
- *
- * @param[in] den Pin number of DEN
- * @param[in] in Pin number of IN
- * @param[in] is Pin number of IS
- * @param[in] variant Variant of the BTS700x
+ * @brief High-Side-Switch constructor
+ * @details This constructor is used to define all necessary pins
+ * of the 24V PROFET.
+ * @param[in] den Diagnosis enable GPIO instance
+ * @param[in] in0 Switch input 0 GPIO instance
+ * @param[in] in1 Switch input 1 GPIO instance
+ * @param[in] dsel Diagnosis select GPIO instance
+ * @param[in] is Diagnose current ADC instance
+ * @param[in] timer Timer instance
+ * @param[in] btxVariant BTx variant
*/
-Hss::Hss(GPIO *den, GPIO *in, AnalogDigitalConverter *is, BtsVariants_t *variant)
+Hss::Hss(GPIOPAL *den, GPIOPAL *in0, GPIOPAL *in1, GPIOPAL *dsel, ADCPAL *is, TimerPAL *timer, BtxVariants_t *btxVariant)
{
this->den = den;
- this->in = in;
+ this->in0 = in0;
+ this->in1 = in1;
this->is = is;
+ this->dsel = dsel;
+
+ this->timer = timer;
- timer = NULL;
+ this->btxVariant = btxVariant;
- currentFilter = NULL;
+ currentFilter = new ExponentialFilter(0.0, 0.3);
- btsVariant = variant;
status = UNINITED;
diagEnb = DIAG_DIS;
diagStatus = NOT_ENABLED;
@@ -63,234 +71,364 @@ Hss::Hss(GPIO *den, GPIO *in, AnalogDigitalConverter *is, BtsVariants_t *variant
/**
* @brief Destructor of the High-Side-Switch class
- *
+ *
*/
Hss::~Hss()
{
- den = NULL;
- in = NULL;
- is = NULL;
-
- timer = NULL;
- currentFilter = NULL;
-
- status = UNINITED;
- diagEnb = DIAG_DIS;
- diagStatus = NOT_ENABLED;
}
/**
- * @brief Initialize the High-Side-Switch
- *
- * This function initializes all necessary objects of the High-Side-Switch.
- * It retruns an error code to see if everything was initialized correctly.
- *
- * @return Hss::Error_t
+ * @brief Initialize the High-Side-Switch
+ * @details This function initializes all necessary objects of the High-Side-Switch.
+ * It retruns an error code to see if everything was initialized correctly.
+ * @return High-side switch error code
*/
-Hss::Error_t Hss::init()
+Error_t Hss::init()
{
Error_t err = OK;
- den->init();
- in->init();
- is->init();
+ if(nullptr != den)
+ {
+ err = den->init();
+ HSS_ASSERT_RET(err);
+ }
- timer->init();
+ HSS_ASSERT_NULLPTR(in0);
+ err = in0->init();
+ HSS_ASSERT_RET(err);
- currentFilter = new ExponentialFilter(0.0, 0.3);
+ if(nullptr != in1)
+ {
+ err = in1->init();
+ HSS_ASSERT_RET(err);
+ }
+
+ HSS_ASSERT_NULLPTR(is);
+ err = is->init();
+ HSS_ASSERT_RET(err);
+
+ if(nullptr != dsel)
+ {
+ err = dsel->init();
+ HSS_ASSERT_RET(err);
+ }
+
+ HSS_ASSERT_NULLPTR(timer);
+ err = timer->init();
+ HSS_ASSERT_RET(err);
+
+ HSS_ASSERT_NULLPTR(btxVariant);
status = INITED;
+ statusCh0 = POWER_OFF;
+ statusCh1 = POWER_OFF;
+
return err;
}
/**
* @brief Deinitialize the High-Side-Switch
- *
- * @return Hss::Error_t
+ * @return High-side switch error code
*/
-Hss::Error_t Hss::deinit()
+Error_t Hss::deinit()
{
Error_t err = OK;
- den->deinit();
- in->deinit();
- is->deinit();
-
- timer->deinit();
+ if(nullptr != den)
+ {
+ err = den->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ HSS_ASSERT_NULLPTR(in0);
+ err = in0->deinit();
+ HSS_ASSERT_RET(err);
+
+ if(nullptr != in1)
+ {
+ err = in1->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ if(nullptr != dsel)
+ {
+ err = dsel->deinit();
+ HSS_ASSERT_RET(err);
+ }
+
+ HSS_ASSERT_NULLPTR(is);
+ err = is->deinit();
+ HSS_ASSERT_RET(err);
+
+ HSS_ASSERT_NULLPTR(timer);
+ err = timer->deinit();
+ HSS_ASSERT_RET(err);
+
+ HSS_ASSERT_NULLPTR(btxVariant);
+
status = UNINITED;
+ statusCh0 = POWER_OFF;
+ statusCh1 = POWER_OFF;
+
return err;
}
/**
- * @brief Enable the High-Side-Switch
- *
- * This function is turning on the High-Side-Switch.
- * It is also setting the status of the switch to ON.
- *
- * @return Hss::Error_t
+ * @brief Enable the High-Side-Switch
+ * @details This function is turning on the High-Side-Switch.
+ * It is also setting the status of the switch to ON.
+ * @param[in] ch Channel number. Default 0.
+ * @return High-side switch error code
*/
-Hss::Error_t Hss::enable()
+Error_t Hss::enable(Channel_t ch)
{
Error_t err = OK;
-
- in->enable();
- status = POWER_ON;
+ if(UNINITED != status)
+ {
+ if(CHANNEL0 == ch || ALL_CHANNELS == ch)
+ {
+ HSS_ASSERT_NULLPTR(in0);
+ err = in0->enable();
+ HSS_ASSERT_RET(err);
+ statusCh0 = POWER_ON;
+ }
+ if(CHANNEL1 == ch || ALL_CHANNELS == ch)
+ {
+ HSS_ASSERT_NULLPTR(in1);
+ err = in1->enable();
+ HSS_ASSERT_RET(err);
+ statusCh1 = POWER_ON;
+ }
+
+ status = POWER_ON;
+ }
+ else
+ {
+ err = INIT_ERROR;
+ }
+
return err;
}
/**
- * @brief Disable the High-Side-Switch
- *
- * This function turns off the High-Side-Switch.
- * It is also setting the status of the switch to OFF.
- *
- * @return Hss::Error_t
+ * @brief Disable the High-Side-Switch
+ * @details This function turns off the High-Side-Switch.
+ * It is also setting the status of the switch to OFF.
+ * @param[in] ch Channel number. Default 0.
+ * @return High-side switch error code
*/
-Hss::Error_t Hss::disable()
+Error_t Hss::disable(Channel_t ch)
{
Error_t err = OK;
- in->disable();
+ if(UNINITED != status)
+ {
+
+ if(CHANNEL0 == ch || ALL_CHANNELS == ch)
+ {
+ HSS_ASSERT_NULLPTR(in0);
+ err = in0->disable();
+ HSS_ASSERT_RET(err);
+ statusCh0 = POWER_OFF;
+ }
+ if(CHANNEL1 == ch || ALL_CHANNELS == ch)
+ {
+ HSS_ASSERT_NULLPTR(in1);
+ err = in1->disable();
+ HSS_ASSERT_RET(err);
+ statusCh1 = POWER_OFF;
+ }
+
+ if((POWER_OFF == statusCh0) && (POWER_OFF == statusCh1))
+ {
+ status = POWER_OFF;
+ }
+ }
+ else
+ {
+ err = INIT_ERROR;
+ }
- status = POWER_OFF;
return err;
}
/**
- * @brief Enable diagnosis function
- *
- * This funtion is enabling the diagnosis function of the High-Side-Switch.
- *
- * @return Hss::Error_t
+ * @brief Enable diagnosis function
+ * @details This function is enabling the diagnosis function of the High-Side-Switch.
+ * @return High-side switch error code
*/
-Hss::Error_t Hss::enableDiag()
+Error_t Hss::enableDiag()
{
Error_t err = OK;
- den->enable();
- diagEnb = DIAG_EN;
+ if((nullptr != den) && (UNINITED != status))
+ {
+ err = den->enable();
+ HSS_ASSERT_RET(err);
+
+ diagEnb = DIAG_EN;
+ }
+ else if(nullptr == den)
+ {
+ diagEnb = DIAG_EN;
+ }
+ else
+ {
+ err = INIT_ERROR;
+ }
+
return err;
}
/**
- * @brief Disable diagnosis function
- *
- * This function is disabling the diagnosis function of the High-Side-Switch.
- *
- * @return Hss::Error_t
+ * @brief Disable diagnosis function
+ * @details This function is disabling the diagnosis function of the High-Side-Switch
+ * @return High-side switch error code
*/
-Hss::Error_t Hss::disableDiag()
+Error_t Hss::disableDiag()
{
Error_t err = OK;
- den->disable();
+ if((nullptr != den) && (UNINITED != status))
+ {
+ err = den->disable();
+ HSS_ASSERT_RET(err);
+
+ diagEnb = DIAG_DIS;
+ }
+ else if(nullptr == den)
+ {
+ diagEnb = DIAG_EN;
+ }
+ else
+ {
+ err = INIT_ERROR;
+ }
- diagEnb = DIAG_DIS;
return err;
}
/**
- * @brief Reset the diagnostic
- *
- * This function resets the diagnostic function of the switch.
- * Any error, for example an overcurrent event, will set the internal
- * latch of the switch to "1". This function is reseting the latch.
- *
- * @return Hss::Error_t
+ * @brief Selects diagnosis channel for diagnosis
+ * @details This function is selecting the channel to perform diagnosis
+ * @note This function is accessed only if the shield is Profet24V
+ * @param[in] ch Channel number (in case of Profet 24V shield)
+ * @return High-side switch error code
*/
-Hss::Error_t Hss::diagReset()
+Error_t Hss::selDiagCh(Channel_t ch)
{
Error_t err = OK;
- in->disable();
-
- timer->delayMilli(100);
- in->enable();
+ if(nullptr != dsel)
+ {
+ if(CHANNEL0 == ch)
+ {
+ err = dsel->disable();
+ }
+ else if(CHANNEL1 == ch){
+ err = dsel->enable();
+ }
+ else
+ {
+ return INVALID_CH_ERROR;
+ }
+ }
return err;
}
/**
- * @brief Get the switch status
- *
- * This function returns the current status of the switch.
- *
- * @return Hss::Status_t
- *
+ * @brief Get the switch status
+ * @details This function returns the current status of the switch.
+ * @return Status_t
* @retval 0 Uninitialized
* @retval 1 Initialized
* @retval 2 Power on
* @retval 3 Power off
*/
-Hss::Status_t Hss::getSwitchStatus()
+Status_t Hss::getSwitchStatus()
{
return status;
}
/**
- * @brief Read IS
- *
- * This functions is reading the IS signal of the switch.
- * It returns the calculated current, which is depending on the IS signal.
- *
- * @return Value of the current flowing through the switch in [A]
+ * @brief Read ADC value for IS
+ * @details This functions is reading the IS signal of the switch.
+ * It returns the calculated current, which is depending on the IS signal.
+ * @param[in] rSense Resistor value of the current sense resistor in [Ohm]
+ * @param[in] ch Channel number
+ * @note Before calling this function, ensure IS pin is initialized and
+ * you do not have to pass channel in case your shield does not support multiple channel
+ * and this would default to CHANNEL0 applicable.
+ * @return Value of the current flowing through the switch in [A]
*/
-float Hss::readIs()
+float Hss::readIs(uint16_t rSense, Channel_t ch)
{
- uint16_t AnalogDigitalConverterResult = 0;
- float amps = 0.0;
-
- if(diagEnb == DIAG_EN){
- timer->delayMilli(1); //wait for 1ms to ensure that the Profet will provide a valid sense signal
- AnalogDigitalConverterResult = is->ADCRead();
- amps = ((float)AnalogDigitalConverterResult/(float)1024) * (float)5;
- amps = (amps * btsVariant->kilis)/1000;
- amps = (amps - btsVariant->ampsOffset) * btsVariant->ampsGain;
- currentFilter->input(amps);
+ uint16_t adcVal = 0;
+ float isVoltage = 0.0;
+ float isCurrent = 0.0;
+
+ if(UNINITED != status)
+ {
+ selDiagCh(ch);
+
+ timer->delayMilli(1);
+ adcVal = is->ADCRead();
+ isVoltage = (adcVal/1024.0)*5.0;
+ isCurrent = ((isVoltage*btxVariant->kilis)/rSense) - currentOffset;
+ currentFilter->input(isCurrent);
}
+
return currentFilter->output();
}
/**
- * @brief Diagnosis of the Sensor
- *
- * This function is using the IS signal to determine the state of the switch.
- * It returns an diagnosis state of the switch.
- *
- * @return Hss::DiagStatus_t
- *
- * @retval -2 Not enabled
- * @retval 0 Switch is working fine
- * @retval 1 Overload detected
- * @retval 5 Open load detected
-
+ * @brief Diagnosis of the Sensor
+ * @details This function is using the IS signal to determine the state of the switch.
+ * It returns an diagnosis state of the switch.
+ * @param[in] senseCurrent Sensed current value
+ * @param[in] ch Channel no. Unused.
+ * @return DiagStatus_t
+ *
+ * @retval 0 Switch is working fine
+ * @retval 1 Fault condition detected
+ * @retval 2 Open Load in ON or Inverse Current
+ * @note This function should be called only after you get the Is value.
+ * Also note, in case you are using shield with no channel differentiation,
+ * then ignore the 'ch' parameter and this will default to CHANNEL0.
*/
-Hss::DiagStatus_t Hss::diagRead()
+DiagStatus_t Hss::diagRead(float senseCurrent, Channel_t ch)
{
- uint16_t AnalogDigitalConverterResult = 0;
- float amps = 0.0;
-
- if(diagEnb == DIAG_EN){
- amps = readIs();
-
- if(amps > (0.0044*btsVariant->kilis)){
- return Hss::DiagStatus_t::OVERLOAD;
- }
- else if(amps < (0.00002*btsVariant->kilis)){
- return Hss::DiagStatus_t::OPEN_LOAD;
- }
- else{
- return Hss::DiagStatus_t::NORMAL;
- }
- }
+ (void)ch;
+ if(senseCurrent >= (btxVariant->iisFault * btxVariant->kilis)){
+ diagStatus = FAULT;
+ }
+ else if((btxVariant->type == BTS700X) && (senseCurrent <= (btxVariant->iisEn * btxVariant->kilis))){
+ diagStatus = FAULT_OL_IC;
+ }
+ else if((btxVariant->type == BTS5001X) && (senseCurrent <= (btxVariant->iisO * btxVariant->kilis))){
+ diagStatus = FAULT_OL_IC;
+ }
+ else if((btxVariant->type == BTT60X0) && (senseCurrent <= (btxVariant->iisOl * btxVariant->kilis))){
+ diagStatus = FAULT_OL_IC;
+ }
else{
- return Hss::DiagStatus_t::NOT_ENABLED;
+ diagStatus = NORMAL;
}
return diagStatus;
}
-
+/**
+ * @brief Set current offset
+ * @details This function can be used to change the value of the internal variable
+ * of the current offset
+ * @param[in] offset Desired value of the current offset in [A]
+ */
+void Hss::setCurrentOffset(float offset)
+{
+ currentOffset = offset;
+}
\ No newline at end of file
diff --git a/src/corelib/hss.hpp b/src/corelib/hss.hpp
index 51be61b..fc80ee3 100644
--- a/src/corelib/hss.hpp
+++ b/src/corelib/hss.hpp
@@ -1,121 +1,85 @@
-/**
+/**
* @file hss.hpp
- * @brief Definition of the High-Side-Switch class functions
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
+ * @brief High side switch class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
* SPDX-License-Identifier: MIT
*/
+
#ifndef HSS_H_
#define HSS_H_
#include
#include
#include
-#include "../pal/timer.hpp"
-#include "../pal/gpio.hpp"
-#include "../pal/adc.hpp"
-#include "../config/variants.hpp"
-#include "../utils/filter.hpp"
+#include "hss-types.hpp"
+#include "hss-pal-timer.hpp"
+#include "hss-pal-gpio.hpp"
+#include "hss-pal-adc.hpp"
+#include "hss-variants.hpp"
+#include "hss-filter.hpp"
+
+namespace hss
+{
/**
* @addtogroup hssCorelib
* @{
*/
-
/**
- * @brief High-Side-Switch class
- * This class defines the High-Side-Switch Class with all its functionality
+ * @brief High side switch API
*/
class Hss
{
public:
- /**
- * @name Error codes
- * @{
- */
- enum Error_t{
- OK = 0, /**< No error */
- INTF_ERROR = -1, /**< Interface error */
- CONF_ERROR = -2, /**< Configuration error */
- };
- /** @} */
-
- /**
- * @name Status
- * @{
- */
- enum Status_t{
- UNINITED = 0, /**< Not initialized */
- INITED = 1, /**< Initiliazed */
- POWER_ON = 2, /**< Power on */
- POWER_OFF = 3, /**< Power off */
- };
- /** @} */
-
- /**
- * @name Diagnosis enabled
- * @{
- */
- enum DiagEnable_t{
- DIAG_EN = 0, /**< Enabled */
- DIAG_DIS = 1, /**< Disabled */
- };
- /** @} */
-
- /**
- * @name Diagnosis enabled
- * @{
- */
- enum DiagStatus_t{
- READ_ERROR = -1, /**< Read Error */
- NOT_ENABLED = -2, /**< Diagnosis not enabled */
- NORMAL = 0, /**< Switch works correctly */
- OVERLOAD = 1, /**< Overload of the Switch */
- SHORT_TO_GND = 2, /**< Short to the ground */
- OVERTEMPERATURE = 3, /**< Overtemperature */
- SHORT_TO_VSS = 4, /**< Short to the supply voltage */
- OPEN_LOAD = 5, /**< Open load detected */
- UNDER_LOAD = 6, /**< Under load condition */
- INVERSE_CURRENT = 7, /**< Inverse current */
- };
- /** @} */
-
- Hss();
- Hss(GPIO *den, GPIO *in, AnalogDigitalConverter *is, BtsVariants_t *variant);
- ~Hss();
- Error_t init();
- Error_t deinit();
- Error_t enable();
- Error_t disable();
- Error_t enableDiag();
- Error_t disableDiag();
- Error_t diagReset();
-
- Status_t getSwitchStatus();
-
- DiagStatus_t diagRead();
-
- float readIs();
-
+ Hss(GPIOPAL *den, GPIOPAL *in, ADCPAL *is, TimerPAL *timer, BtxVariants_t *btxVariant);
+ Hss(GPIOPAL *den, GPIOPAL *in0, GPIOPAL *in1, GPIOPAL *dsel, ADCPAL *is, TimerPAL *timer, BtxVariants_t *btxVariant);
+ ~Hss();
+ Error_t init();
+ Error_t deinit();
+ Error_t enable(Channel_t ch=CHANNEL0);
+ Error_t disable(Channel_t ch=CHANNEL0);
+ Error_t enableDiag();
+ Error_t disableDiag();
+
+ Status_t getSwitchStatus();
+ DiagStatus_t diagRead(float senseCurrent, Channel_t ch=CHANNEL0);
+ float readIs(uint16_t rSense, Channel_t ch=CHANNEL0);
+
+ void setCurrentOffset(float offset);
+
protected:
- GPIO *den;
- GPIO *in;
- AnalogDigitalConverter *is;
- Timer *timer;
+ GPIOPAL *den; /**< Diagnosis enable */
+ GPIOPAL *in0; /**< Switch input 0 */
+ GPIOPAL *in1; /**< Switch input 1 */
+ GPIOPAL *dsel; /**< Diagnosis select */
+ ADCPAL *is; /**< Diagnosis current */
+
+ TimerPAL *timer; /**< Timer instace */
- ExponentialFilter *currentFilter;
+ ExponentialFilter *currentFilter; /**< Current filter */
+
+ BtxVariants_t *btxVariant; /**< BTx switch variant */
+ Status_t status; /**< Switch status */
+ Status_t statusCh0; /**< Channel 0 status */
+ Status_t statusCh1; /**< Channel 1 status */
+
+ DiagEnable_t diagEnb; /**< Diagnosis enabled flag */
+ DiagStatus_t diagStatus; /**< Diagnosis status */
+
+ Error_t selDiagCh(Channel_t ch);
+
+ private:
+
+ float currentOffset = 0.0; /**< Diagnosis current offset */
- BtsVariants_t *btsVariant;
- Status_t status;
- DiagEnable_t diagEnb;
- DiagStatus_t diagStatus;
-
};
+
+}
+
/** @} */
#endif /** HSS_H_ **/
-
\ No newline at end of file
diff --git a/src/framework/arduino/README.md b/src/framework/arduino/README.md
new file mode 100644
index 0000000..6bb9c78
--- /dev/null
+++ b/src/framework/arduino/README.md
@@ -0,0 +1,50 @@
+# Smart High-Side Switch Arduino Library
+
+Arduino library for Infineon's Arduino shields for **PROFET™ Smart High-Side Power Switches** Automotive grade
+
+## Supported Products
+
+
+
+## Supported Frameworks
+
+The library should be supported by any Arduino platform based on the reference Arduino cores.
+
+Check in this [link](https://high-side-switch.readthedocs.io/en/latest/sw-frmwk/arduino/arduino-compatible-kits.html) the already verified (at least successfully built) platforms.
+
+## More information
+
+The complete documentation of the library as well as detailed information about the PROFET-shield, can be found in the [Wiki](https://high-side-switch.readthedocs.io/en/latest/index.html).
+
+
+### Getting Started
+
+Find a getting started tutorial using the XMC1100 Boot Kit [here](https://high-side-switch.readthedocs.io/en/latest/sw-frmwk/arduino/arduino-getting-started.html).
+
+### More information
+
+The complete relevant Arduino documentation (and more) can be found in the base XFP library [Wiki](https://high-side-switch.readthedocs.io/en/latest/index.html):
+
+* Arduino Lib Installation
+* Examples
+* Arduino API
+* PlatformIO
+
+### Contributing
+
+This is a release repository for the Arduino framework. The code base is maintained and developed in the High-side Switch Cross-Framework-Platform (XFP) library [repository](https://github.com/infineon/high-side-switch).
+
+### License
+
+This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTS5001x-button-test/BTS5001x-button-test.ino b/src/framework/arduino/examples/BTS5001x-button-test/BTS5001x-button-test.ino
new file mode 100644
index 0000000..2f9de43
--- /dev/null
+++ b/src/framework/arduino/examples/BTS5001x-button-test/BTS5001x-button-test.ino
@@ -0,0 +1,86 @@
+/**
+ * @file BTS5001x-button-test.ino
+ * @brief Button Test Example for Profet 12V BTS5001x Arduino form factored Shields
+ * @details SHIELD_BTS5001x-1TAD Shield have optional user button to
+ * perform switching. This example demonstrates the use of optional user button.
+ *
+ * You can configure following variants for this shield:
+ * - BTS50010
+ * - BTS50015
+ *
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+#include
+
+using namespace hss;
+
+/** Creation the hss board object */
+/** The user needs to specify the BTS5001x variant in the constructor argument */
+Bts5001xShieldIno HSS = Bts5001xShieldIno(&BTS50015);
+
+Error_t err = OK;
+unsigned int iteration = 0;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ float voltage = 0.0;
+ static bool button_pressed = false; // The flag is used to avoid printing constantly
+ static bool switch_on = false;
+
+ /** Read push button */
+ while(HSS.analogReadButton())
+ {
+ button_pressed = true;
+ delay(10);
+ }
+
+ /** Toogles the output when the button is pressed */
+ if(button_pressed)
+ {
+ button_pressed = false;
+ switch_on = !switch_on;
+
+ if(switch_on)
+ {
+ HSS.switchHxOn();
+ }
+ else
+ {
+ HSS.switchHxOff();
+ }
+ }
+
+ delay(50);
+
+ /** Read the Vss value when the switch is ON and only in every 10th iteration (500ms interval) */
+ if ((switch_on) && !( iteration % 10 ))
+ {
+ for(int i = 0; i<10; i++){
+ voltage = HSS.readVss(); // Measure more than once to make use of the internal exponential filter
+ }
+
+ Serial.print("Supply voltage is: ");
+ Serial.println(voltage);
+ }
+
+ iteration++;
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTS5001x-hss-advanced/BTS5001x-hss-advanced.ino b/src/framework/arduino/examples/BTS5001x-hss-advanced/BTS5001x-hss-advanced.ino
new file mode 100644
index 0000000..4691136
--- /dev/null
+++ b/src/framework/arduino/examples/BTS5001x-hss-advanced/BTS5001x-hss-advanced.ino
@@ -0,0 +1,144 @@
+/**
+ * @file BTS5001x-hss-advanced.ino
+ * @brief High-Side-Switch Advanced Example for BTS5001x Arduino form factored shields
+ * @details This example shows the usage of all the offered functionalities of the shield.
+ * It does the following:
+ * - Switches a channel ON
+ * - Reads current through the switch, battery voltage and performs diagnosis in 'ON' state
+ * - Switches the channel OFF
+ *
+ * You can configure following variants for this shield:
+ * - BTS50010
+ * - BTS50015
+ *
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ *
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+
+#include
+
+using namespace hss;
+
+/** Creation the hss board object */
+/** The user needs to specify the BTS5001x variant in the constructor argument */
+Bts5001xShieldIno HSS = Bts5001xShieldIno(&BTS50015);
+
+Error_t err = OK;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ /** Turn on the selected channel */
+ Serial.println("\n--> Turning the switch ON");
+ HSS.switchHxOn();
+
+ /** Wait for a second before reading diagnosis*/
+ delay(1000);
+
+ /** Get switch related params like current, diagnosis output while it is in 'ON' state */
+ getSwitchParams();
+
+ /** Keep switch on for a second */
+ delay(1000);
+
+ /** Turn off the selected channel */
+ Serial.print("--> Turning the switch OFF");
+ HSS.switchHxOff();
+
+ /** Keep switch off for a second */
+ delay(5000);
+}
+
+/**
+ * @brief Perform switch related functionalities
+ * @details This function is going to perform the following:
+ * - Read current through the selected switch
+ * - Perform diagnosis
+ * - Read the battery voltage
+ */
+void getSwitchParams()
+{
+ Serial.println("Reading the current, battery voltage and diagnosis status of switch ...");
+ /** Read current value */
+ readCurrent();
+ /** Get diagnosis result */
+ readDiagnosis();
+ /** Read battery voltage */
+ readBatteryVoltage();
+}
+
+
+/**
+ * @brief Read current flowing through the switch
+ */
+void readCurrent()
+{
+ float readAmps = 0.0;
+ for(int i = 0; i<10; i++){ // Measure more than once to make use of the internal exponential filter
+ readAmps = HSS.readIsx();
+ }
+ Serial.print("Current flowing through the switch: ");
+ Serial.print(readAmps);
+ Serial.println(" A");
+ return;
+}
+
+/**
+ * @brief Read diagnosis status of the switch
+ */
+void readDiagnosis()
+{
+ DiagStatus_t switchStatus;
+
+ for(int i = 0; i<10; i++){
+ switchStatus = HSS.readDiagx(); // Read the diagnosis function more than once to make sure the IS value is correct (internal exponential filter)
+ }
+
+ if(switchStatus == FAULT_OL_IC)
+ {
+ Serial.println("Open load with enabled switch or inverse current detected!");
+ }
+ if(switchStatus == FAULT)
+ {
+ Serial.println("Overtemperature, overload or shot to ground detected!");
+ }
+ if(switchStatus == NORMAL)
+ {
+ Serial.println("Normal operation!");
+ }
+ return;
+}
+
+/**
+ * @brief Reads the current battery voltage
+ */
+void readBatteryVoltage()
+{
+ float batteryVoltage = 0.0;
+ for(int i = 0; i<10; i++){
+ batteryVoltage = HSS.readVss();
+ }
+ Serial.print("Current battery voltage : ");
+ Serial.print(batteryVoltage);
+ Serial.println(" V");
+ return;
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTS5001x-hss-single-ch/BTS5001x-hss-single-ch.ino b/src/framework/arduino/examples/BTS5001x-hss-single-ch/BTS5001x-hss-single-ch.ino
new file mode 100644
index 0000000..de6e58b
--- /dev/null
+++ b/src/framework/arduino/examples/BTS5001x-hss-single-ch/BTS5001x-hss-single-ch.ino
@@ -0,0 +1,80 @@
+/**
+ * @file BTS5001x-hss-single-ch.ino
+ * @brief High-Side-Switch Basic Example for the BTS5001x Arduino form factored shields
+ * @details This example demonstrates how to switch on/off single channel in the BTT shield. It also
+ * calls API to read the current value.
+ *
+ * You can configure following variants for this shield:
+ * - BTS50010
+ * - BTS50015
+ *
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+
+#include
+
+using namespace hss;
+
+/** Creation the hss board object */
+/** The user needs to specify the BTS5001x variant in the constructor argument */
+Bts5001xShieldIno HSS = Bts5001xShieldIno(&BTS50015);
+
+Error_t err = OK;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ /** Turn on the selected channel */
+ Serial.println("\n--> Turning the switch ON");
+ HSS.switchHxOn();
+
+ /** Wait for a second before reading diagnose current */
+ delay(1000);
+
+ /** Read current value */
+ readCurrent();
+
+ /** Keep all switches on for a second */
+ delay(1000);
+
+ /** Turn off the selected channel */
+ Serial.println("--> Turning the switch OFF");
+ HSS.switchHxOff();
+
+ /** Keep all switches off for a second */
+ delay(5000);
+}
+
+/**
+ * @brief Read current flowing through the switch
+ */
+void readCurrent()
+{
+ float readAmps = 0.0;
+ for(int i = 0; i<10; i++){ // Measure more than once to make use of the internal exponential filter
+ readAmps = HSS.readIsx();
+ }
+ Serial.print("Current flowing through the switch: ");
+ Serial.print(readAmps);
+ Serial.println(" A");
+ return;
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTS700x-button-test/BTS700x-button-test.ino b/src/framework/arduino/examples/BTS700x-button-test/BTS700x-button-test.ino
new file mode 100644
index 0000000..eca991c
--- /dev/null
+++ b/src/framework/arduino/examples/BTS700x-button-test/BTS700x-button-test.ino
@@ -0,0 +1,106 @@
+/**
+ * @file BTS700x-button-test.ino
+ * @brief Button Test Example for Profet 12V BTS700x Arduino form factored Shields
+ * @details SHIELD_BTS700x-1EPP Shield has an optional user button to
+ * perform switching. This example demonstrates the use of optional user button.
+ *
+ * You can configure following variants for this shield:
+ * - BTS7002
+ * - BTS7004
+ * - BTS7006
+ * - BTS7008
+ *
+ * This shield supports both digital and analog read button functionality
+ * which is configurable through jumpers (Refer manual for details).
+ * ____________________________________________________
+ * Jumper being used Read Button Functions
+ * ____________________________________________________
+ * J2 analogReadButton(Analog)
+ * J3 digitalReadButton(Digital)
+ * ____________________________________________________
+ *
+ * In this example we use the digitalReadButton() functionality of the library
+ * to toggle the switch 0 output and read out the VSS of the attached power supply.
+ * In case you wish to use analogReadButton() functionality, replace digitalReadButton()
+ * by analogReadButton().
+ *
+ * @note Ensure always that you have right function being called in correspondance to the jumper configurations.
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+#include
+
+using namespace hss;
+
+/** Creation the hss board object */
+/** The user needs to specify the BTS700x variant in the constructor argument */
+Bts700xShieldIno HSS = Bts700xShieldIno(&BTS7002);
+
+/** Switch 0 is used in this example. Change it to select the other available switches */
+uint8_t sw = 0;
+
+Error_t err = OK;
+unsigned int iteration = 0;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ float voltage = 0.0;
+ static bool button_pressed = false; // The flag is used to avoid printing constantly
+ static bool switch_on = false;
+
+ /** Read push button */
+ while(HSS.digitalReadButton())
+ {
+ button_pressed = true;
+ delay(10);
+ }
+
+ /** Toogles the output when the button is pressed */
+ if(button_pressed)
+ {
+ button_pressed = false;
+ switch_on = !switch_on;
+
+ if(switch_on)
+ {
+ HSS.switchHxOn(sw);
+ }
+ else
+ {
+ HSS.switchHxOff(sw);
+ }
+ }
+
+ delay(50);
+
+ /** Read the Vss value when the switch is ON */
+ if ((switch_on) && !( iteration % 10 ))
+ {
+ for(int i = 0; i<10; i++){
+ voltage = HSS.readVss(); // Measure more than once to make use of the internal exponential filter
+ }
+
+ Serial.print("Supply voltage is: ");
+ Serial.println(voltage);
+ }
+
+ iteration++;
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTS700x-hss-advanced/BTS700x-hss-advanced.ino b/src/framework/arduino/examples/BTS700x-hss-advanced/BTS700x-hss-advanced.ino
new file mode 100644
index 0000000..79df783
--- /dev/null
+++ b/src/framework/arduino/examples/BTS700x-hss-advanced/BTS700x-hss-advanced.ino
@@ -0,0 +1,189 @@
+/**
+ * @file BTS700x-hss-advanced.ino
+ * @brief High-Side-Switch Advanced Example for Profet 12V BTS700x Arduino form factored shields
+ * @details This example shows the usage of all the offered functionalities of the shield.
+ * It has 2 parts:
+ *
+ * 1. PART A
+ * - Switches a channel ON
+ * - Reads current through the switch, battery voltage and performs diagnosis in 'ON' state
+ * - Switches the channel OFF
+ * - Reads current through the switch, battery voltage and performs diagnosis in 'OFF' state
+ *
+ * 2. PART B
+ * - Switch multiple channels 'ON' at once
+ * - Switch multiple channels 'OFF' at once
+ *
+ * You can configure following variants for this shield:
+ * - BTS7002
+ * - BTS7004
+ * - BTS7006
+ * - BTS7008
+ *
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ *
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+
+#include
+
+using namespace hss;
+
+/** Creation the hss board object */
+/** The user needs to specify the BTS700x variant in the constructor argument */
+Bts700xShieldIno HSS = Bts700xShieldIno(&BTS7002);
+
+Error_t err = OK;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ Serial.println("\n*** Part A: Single switch operation ***");
+
+ /** Perform single switch operation for all switches one after the other */
+ for (int switch_count = 1; switch_count <=4; switch_count++)
+ {
+ /** Turn on the selected channel */
+ Serial.println("\n--> Turning on switch : ");
+ Serial.println(switch_count);
+ HSS.switchHxOn(switch_count);
+
+ /** Wait for a second before reading diagnose current */
+ delay(1000);
+
+ /** Get switch related params like current, diagnosis output while it is in 'ON' state */
+ getSwitchParams(switch_count);
+
+ /** Keep switch on for a second */
+ delay(1000);
+
+ /** Turn off the selected channel */
+ Serial.print("--> Turning off switch : ");
+ Serial.println(switch_count);
+ HSS.switchHxOff(switch_count);
+
+ /** Get switch related params like current, diagnosis output while it is in 'OFF' state */
+ getSwitchParams(switch_count);
+
+ /** Keep switch off for 5 seconds */
+ delay(5000);
+ }
+
+ Serial.println("\n*** Part B: Multiple switch operation ***");
+
+ /** Turn on all 4 switches parallelly */
+ Serial.println("\n--> Turning on all switches at once!");
+ HSS.switchesHxOn(1,1,1,1);
+
+ /** Keep all switches on for a second */
+ delay(1000);
+
+ /** Turn off all 4 switches parallelly */
+ Serial.println("--> Turning off all switches at once!");
+ HSS.switchesHxOff(1,1,1,1);
+
+ /** Keep all switches off for 5 seconds */
+ delay(5000);
+}
+
+/**
+ * @brief Perform switch related functionalities
+ * @details This function is going to perform the following:
+ * - Read current through the selected switch
+ * - Perform diagnosis
+ * - Read the battery voltage
+ * @param[in] switch_no Switch No.
+ */
+void getSwitchParams(int switch_no)
+{
+ Serial.println("Reading the current, battery voltage and diagnosis status of switch ...");
+ /** Read current value */
+ readCurrent(switch_no);
+ /** Get diagnosis result */
+ readDiagnosis(switch_no);
+ /** Read battery voltage */
+ readBatteryVoltage();
+}
+
+
+/**
+ * @brief Read current flowing through the switch
+ * @param switch_no Switch number
+ */
+void readCurrent(int switch_no)
+{
+ float readAmps = 0.0;
+ readAmps = HSS.readIsx(switch_no);
+ Serial.print("Current flowing through the switch: ");
+ Serial.print(readAmps);
+ Serial.println(" A");
+ return;
+}
+
+/**
+ * @brief Read diagnosis status of the switch
+ * @param switch_no Switch number
+ */
+void readDiagnosis(int switch_no)
+{
+ DiagStatus_t switchStatus;
+
+ for(int i = 0; i<10; i++){
+ switchStatus = HSS.readDiagx(switch_no); // Read the diagnosis function more than once to make sure the IS value is correct (internal exponential filter)
+ }
+
+ if(switchStatus == OPEN_LOAD)
+ {
+ Serial.println("Openload detected!");
+ }
+ if(switchStatus == FAULT)
+ {
+ Serial.println("Short circuit to ground detected, Overtemperature or Overload detected!");
+ }
+ if(switchStatus == FAULT_OL_IC)
+ {
+ Serial.println("Open load with active switch or inverse current detected!");
+ }
+ if(switchStatus == SHORT_TO_VSS)
+ {
+ Serial.println("Short circuit to Vss detected!");
+ }
+ if(switchStatus == NORMAL)
+ {
+ Serial.println("Normal operation!");
+ }
+ return;
+}
+
+/**
+ * @brief Reads the current battery voltage
+ */
+void readBatteryVoltage()
+{
+ float batteryVoltage = 0.0;
+ for(int i = 0; i<10; i++){
+ batteryVoltage = HSS.readVss(); // Measure more than once to make use of the internal exponential filter
+ }
+ Serial.print("Current battery voltage : ");
+ Serial.print(batteryVoltage);
+ Serial.println(" V");
+ return;
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTS700x-hss-multiple-ch/BTS700x-hss-multiple-ch.ino b/src/framework/arduino/examples/BTS700x-hss-multiple-ch/BTS700x-hss-multiple-ch.ino
new file mode 100644
index 0000000..350ee8a
--- /dev/null
+++ b/src/framework/arduino/examples/BTS700x-hss-multiple-ch/BTS700x-hss-multiple-ch.ino
@@ -0,0 +1,61 @@
+/**
+ * @file BTS700x-hss-multiple-ch.ino
+ * @brief High-Side-Switch Multiple Channel Operation Example for the BTS700x Arduino form factored shields
+ * @details This example demonstrates how to switch on/off multiple channels at once.
+ * Below are the valid chip variants for SHIELD_BTS700x-1EPP having 4 channels:
+ * - BTS7002
+ * - BTS7004
+ * - BTS7006
+ * - BTS7008
+ *
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+#include
+
+using namespace hss;
+
+/** Creation the hss board object */
+/** The user needs to specify the BTS700x variant in the constructor argument */
+Bts700xShieldIno HSS = Bts700xShieldIno(&BTS7002);
+
+/** Select channels to be used parallelly (index 0 being channel 1) */
+bool switch_no[4] = {true,true,true,true};
+
+Error_t err = OK;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ /** Turn on the selected channels */
+ Serial.println("\nTurning on all switches at once!");
+ HSS.switchesHxOn(switch_no[0],switch_no[1],switch_no[2],switch_no[3]);
+
+ /** Keep them ON for a second */
+ delay(1000);
+
+ /** Turn off the selected channels */
+ Serial.println("Turning off all switches at once!");
+ HSS.switchesHxOff(switch_no[0],switch_no[1],switch_no[2],switch_no[3]);
+
+ /** Keep them OFF for 5 second */
+ delay(5000);
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTS700x-hss-single-ch/BTS700x-hss-single-ch.ino b/src/framework/arduino/examples/BTS700x-hss-single-ch/BTS700x-hss-single-ch.ino
new file mode 100644
index 0000000..6f84aad
--- /dev/null
+++ b/src/framework/arduino/examples/BTS700x-hss-single-ch/BTS700x-hss-single-ch.ino
@@ -0,0 +1,85 @@
+/**
+ * @file BTS700x-hss-single-ch.ino
+ * @brief High-Side-Switch Basic Example for the BTS700x Arduino form factored shields
+ * @details This example demonstrates how to switch on/off single channel in the BTT shield. It also
+ * calls API to read the current value.
+ *
+ * You can configure following variants for this shield:
+ * - BTS7002
+ * - BTS7004
+ * - BTS7006
+ * - BTS7008
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ *
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+
+#include
+
+using namespace hss;
+
+/** Creation the hss board object */
+/** The user needs to specify the BTS700x variant in the constructor argument */
+Bts700xShieldIno HSS = Bts700xShieldIno(&BTS7002);
+
+Error_t err = OK;
+
+/** Set switch to operate */
+int switch_no = 1;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ /** Turn on the selected channel */
+ Serial.println("\nTurning on selected switch...");
+ HSS.switchHxOn(switch_no);
+
+ /** Wait for a second before reading diagnose current */
+ delay(1000);
+
+ /** Read current value */
+ readCurrent();
+
+ /** Keep all switches on for a second */
+ delay(1000);
+
+ /** Turn off the selected channel */
+ Serial.println("Turning off the selected switch");
+ HSS.switchHxOff(switch_no);
+
+ /** Keep all switches off for a second */
+ delay(5000);
+}
+
+/**
+ * @brief Read current flowing through the switch
+ */
+void readCurrent()
+{
+ float readAmps = 0.0;
+ for(int i = 0; i<10; i++){
+ readAmps = HSS.readIsx(switch_no); // Measure more than once to make use of the internal exponential filter
+ }
+ Serial.print("Current flowing through the switch: ");
+ Serial.print(readAmps);
+ Serial.println(" A");
+ return;
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTT60xx-hss-advanced/BTT60xx-hss-advanced.ino b/src/framework/arduino/examples/BTT60xx-hss-advanced/BTT60xx-hss-advanced.ino
new file mode 100644
index 0000000..1916d51
--- /dev/null
+++ b/src/framework/arduino/examples/BTT60xx-hss-advanced/BTT60xx-hss-advanced.ino
@@ -0,0 +1,154 @@
+/**
+ * @file BTT600x-hss-advanced.ino
+ * @brief High-Side-Switch Advanced Example for the Profet24V BTT600x Arduino form factored shield
+ * @details This example shows the usage of the offered functionalities of the shield.
+ * It has 2 parts:
+ *
+ * 1. PART A
+ * - Switches a channel ON
+ * - Reads current through the switch, battery voltage and performs diagnosis in 'ON' state
+ * - Switches the channel OFF
+ * - Reads current through the switch, battery voltage and performs diagnosis in 'OFF' state
+ *
+ * 2. PART B
+ * - Switch multiple channels 'ON' at once
+ * - Switch multiple channels 'OFF' at once
+ *
+ * Find below the Profet 24V shield part details and its offered channels:
+ * _________________________________________________________________________________
+ * Shield Name Included parts Supported number of channels
+ * _________________________________________________________________________________
+ * 24V_SHIELD_BTT6030 Profet 0 (BTT6030-2ERA) 2
+ * Profet 1 (BTT6030-2ERA) 2
+ * Profet 2 (BTT6020-1ERA) 1
+ * _________________________________________________________________________________
+ *
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ *
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+#include
+
+using namespace hss;
+
+Btt60xxShieldIno HSS = Btt60xxShieldIno();
+
+Error_t err = OK;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!");
+
+ delay(1000);
+}
+
+void loop()
+{
+ Serial.println("\n*** Part A: Single switch operation ***\n");
+
+ /** Turn on Profet 0 - channel 0, get current value and perform diagnosis and then turn it off */
+ Serial.println("\n--> Turning on Profet 0 - channel 0 (OUT0.0)");
+ singleSwOperation(0);
+ Serial.println("Turning off Profet 0 - channel 0 (OUT0.0) ");
+
+ /** Turn on Profet 0 - channel 1, get current value and perform diagnosis and then turn it off */
+ Serial.println("\n--> Turning on Profet 0 - channel 1 (OUT0.1)");
+ singleSwOperation(1);
+ Serial.println("Turning off Profet 0 - channel 1 (OUT0.1) ");
+
+ /** Turn on Profet 1 - channel 0, get current value and perform diagnosis and then turn it off */
+ Serial.println("\n--> Turning on Profet 1 - channel 0 (OUT1.0)");
+ singleSwOperation(2);
+ Serial.println("Turning off Profet 1 - channel 0 (OUT1.0) ");
+
+ /** Turn on Profet 1 - channel 1, get current value and perform diagnosis and then turn it off */
+ Serial.println("\n--> Turning on Profet 1 - channel 1 (OUT1.1)");
+ singleSwOperation(3);
+ Serial.println("Turning off Profet 1 - channel 1 (OUT1.1) ");
+
+ /** Turn on Profet 2, get current value and perform diagnosis and then turn it off */
+ Serial.println("\n--> Turning on Profet 2 (OUT2)");
+ singleSwOperation(4);
+ Serial.println("Turning off Profet 2 (OUT2) ");
+
+ Serial.println("\n*** Part B: Multiple switch operation ***");
+
+ /** Turn on all 5 switches parallelly */
+ Serial.println("\n--> Turning on all switches at once!");
+ HSS.switchesHxOn(1,1,1,1,1);
+
+ /** Keep all switches on for a second */
+ delay(1000);
+
+ /** Turn off all 5 switches parallelly */
+ Serial.println("--> Turning off all switches at once!");
+ HSS.switchesHxOff(1,1,1,1,1);
+
+ /** Keep all switches off for a second */
+ delay(5000);
+}
+
+/**
+ * @brief Perform switching related operations on single channel
+ * @details This function is going to perform the following:
+ * - Switch on the selected channel
+ * - Read current through the selected switch
+ * - Perform diagnosis
+ * - Switch off the selected channel
+ * @param[in] switch_no Switch No.
+ */
+void singleSwOperation(int switch_no)
+{
+ DiagStatus_t switchStatus;
+ float readAmps = 0.0;
+
+ /** Turn on the selected channel */
+ HSS.switchHxOn(switch_no);
+
+ /** Wait for a second before reading diagnose current */
+ delay(1000);
+
+ /** Read current value */
+ for(int i = 0; i<10; i++){
+ readAmps = HSS.readIsx(switch_no); // Measure more than once to make use of the internal exponential filter
+ }
+ Serial.print("Current flowing through the switch: ");
+ Serial.print(readAmps);
+ Serial.println(" A");
+
+ /** Get diagnosis result */
+ for(int i = 0; i<10; i++){
+ switchStatus = HSS.readDiagx(switch_no); // Read the diagnosis function more than once to make sure the IS value is correct (internal exponential filter)
+ }
+
+ if(switchStatus == FAULT_OL_IC)
+ {
+ Serial.println("Open load with enabled switch or inverse current detected!");
+ }
+ if(switchStatus == FAULT)
+ {
+ Serial.println("Overtemperature, overload or shot to ground detected!");
+ }
+ if(switchStatus == NORMAL)
+ {
+ Serial.println("Normal operation!");
+ }
+
+ /** Keep switch on for a second */
+ delay(1000);
+
+ /** Turn off the selected channel */
+ HSS.switchHxOff(switch_no);
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTT60xx-hss-multiple-ch/BTT60xx-hss-multiple-ch.ino b/src/framework/arduino/examples/BTT60xx-hss-multiple-ch/BTT60xx-hss-multiple-ch.ino
new file mode 100644
index 0000000..da86e05
--- /dev/null
+++ b/src/framework/arduino/examples/BTT60xx-hss-multiple-ch/BTT60xx-hss-multiple-ch.ino
@@ -0,0 +1,70 @@
+/**
+ * @file BTT600x-hss-multiple-ch.ino
+ * @brief High-Side-Switch Multiple Channel Operation Example for the BTT600x Arduino form factored shields
+ * @details This example demonstrates how to switch on/off multiple channels at once.
+ *
+ * Find below the Profet 24V shield part details and its offered channels:
+ * _________________________________________________________________________________
+ * Shield Name Included parts Supported number of channels
+ * _________________________________________________________________________________
+ * 24V_SHIELD_BTT6030 Profet 0 (BTT6030-2ERA) 2
+ * Profet 1 (BTT6030-2ERA) 2
+ * Profet 2 (BTT6020-1ERA) 1
+ * _________________________________________________________________________________
+ *
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+#include
+
+using namespace hss;
+
+Btt60xxShieldIno HSS = Btt60xxShieldIno();
+
+Error_t err = OK;
+
+/** Select channels to be used parallelly (index 0 being channel 1)
+ * switch_no Controls
+ * switch_no[0] = true OUT0.0
+ * switch_no[1] = true OUT0.1
+ * switch_no[2] = true OUT1.0
+ * switch_no[3] = true OUT1.1
+ * switch_no[4] = true OUT2
+*/
+bool switch_no[5] = {true,true,true,true,true};
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(115200);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!\n");
+
+ delay(1000);
+}
+
+void loop()
+{
+ /** Turn on the selected channels */
+ Serial.println("\nTurning on all switches at once!");
+ HSS.switchesHxOn(switch_no[0], switch_no[1], switch_no[2], switch_no[3], switch_no[4]);
+
+ /** Keep all switches on for a second */
+ delay(1000);
+
+ /** Turn on the selected channels */
+ Serial.println("\nTurning off all switches at once!");
+ HSS.switchesHxOff(switch_no[0],switch_no[1],switch_no[2],switch_no[3], switch_no[4]);
+
+ /** Keep all switches off for a second */
+ delay(5000);
+}
\ No newline at end of file
diff --git a/src/framework/arduino/examples/BTT60xx-hss-single-ch/BTT60xx-hss-single-ch.ino b/src/framework/arduino/examples/BTT60xx-hss-single-ch/BTT60xx-hss-single-ch.ino
new file mode 100644
index 0000000..4c47451
--- /dev/null
+++ b/src/framework/arduino/examples/BTT60xx-hss-single-ch/BTT60xx-hss-single-ch.ino
@@ -0,0 +1,92 @@
+/**
+ * @file BTT600x-hss-single-ch.ino
+ * @brief High-Side-Switch Basic Example for the BTT600x Arduino form factored shields
+ * @details This example demonstrates how to switch on/off single channel in the BTT shield. It also
+ * calls API to read the current value.
+ *
+ * Find below the Profet 24V shield part details and its offered channels:
+ * _________________________________________________________________________________
+ * Shield Name Included parts Supported number of channels
+ * _________________________________________________________________________________
+ * 24V_SHIELD_BTT6030 Profet 0 (BTT6030-2ERA) 2
+ * Profet 1 (BTT6030-2ERA) 2
+ * Profet 2 (BTT6020-1ERA) 1
+ * _________________________________________________________________________________
+ *
+ * It can be deployed to the Arduino Uno or the XMC's with corresponding form factor.
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ */
+
+#include
+
+using namespace hss;
+
+Btt60xxShieldIno HSS = Btt60xxShieldIno();
+
+Error_t err = OK;
+
+/** Set channel to operate
+ * switch_no Controls
+ * 0 OUT0.0
+ * 1 OUT0.1
+ * 2 OUT1.0
+ * 3 OUT1.1
+ * 4 OUT 2
+ */
+int switch_no = 0;
+
+void setup()
+{
+ /** Serial initialization */
+ Serial.begin(9600);
+ Serial.println("Serial initialized");
+
+ /** Initialization of the High-Side-Switch-Board */
+ err = HSS.init();
+ if(OK!=err)
+ {
+ Serial.println("Initialization failed!");
+ }
+ else
+ Serial.println("Initialization successful!\n");
+
+ delay(1000);
+}
+
+void loop()
+{
+ /** Turn on the selected channel */
+ Serial.println("\nTurning on selected switch...");
+ HSS.switchHxOn(switch_no);
+
+ /** Wait for a second before reading diagnose current */
+ delay(1000);
+
+ /** Read current value */
+ readCurrent();
+
+ /** Keep all switches on for a second */
+ delay(1000);
+
+ /** Turn off the selected channel */
+ Serial.println("Turning off the selected switch");
+ HSS.switchHxOff(switch_no);
+
+ /** Keep all switches off for a second */
+ delay(5000);
+}
+
+/**
+ * @brief Read current flowing through the switch
+ */
+void readCurrent()
+{
+ float readAmps = 0.0;
+ for(int i = 0; i<10; i++){ // Measure more than once to make use of the internal exponential filter
+ readAmps = HSS.readIsx(switch_no);
+ }
+ Serial.print("Current flowing through the switch: ");
+ Serial.print(readAmps);
+ Serial.println(" A");
+ return;
+}
\ No newline at end of file
diff --git a/keywords.txt b/src/framework/arduino/keywords.txt
similarity index 100%
rename from keywords.txt
rename to src/framework/arduino/keywords.txt
diff --git a/src/framework/arduino/library.json b/src/framework/arduino/library.json
new file mode 100644
index 0000000..506a28c
--- /dev/null
+++ b/src/framework/arduino/library.json
@@ -0,0 +1,17 @@
+{
+ "name": "high-side-switch-ino",
+ "keywords": "high side switch, profet, smart switch",
+ "description": "C++ library for the Infineon PROFET high-side switch product family",
+ "repository":{
+ "type":"git",
+ "url":"https://github.com/Infineon/arduino-high-side-switch",
+ "branch":"master"
+ },
+ "version":"1.0.0",
+ "license":"MIT",
+ "frameworks":"arduino",
+ "platforms":[
+ "infineonxmc",
+ "atmelavr"
+ ]
+ }
diff --git a/src/framework/arduino/library.properties b/src/framework/arduino/library.properties
new file mode 100644
index 0000000..00b0656
--- /dev/null
+++ b/src/framework/arduino/library.properties
@@ -0,0 +1,10 @@
+name=high-side-switch-ino
+version=1.0.0
+author=Infineon Technologies
+maintainer=Infineon Technologies
+sentence=C++ library for the Infineon PROFET high-side switch product family
+paragraph=This library supports the Arduino Uno form factor PROFET shields
+category=Device control
+url=https://github.com/Infineon/arduino-high-side-switch
+architectures=*
+includes=hss-shield-bts5001x-ino.hpp, hss-shield-btt60xx-ino.hpp, hss-shield-bts700x-ino.hpp
diff --git a/src/framework/arduino/pal/adc-arduino.cpp b/src/framework/arduino/pal/adc-arduino.cpp
deleted file mode 100644
index f860844..0000000
--- a/src/framework/arduino/pal/adc-arduino.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * @file adc-arduino.cpp
- * @brief Arduino PAL for the ADC
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include
-#include "adc-arduino.hpp"
-
-/**
- * @brief Default constructor of the Arduino ADC class
- *
- */
-ADCIno::ADCIno() : pin(0)
-{
-
-}
-
-/**
- * @brief Constructor of the Arduino ADC class
- *
- * This constructor takes the number of the pin.
- *
- * @param[in] pin Number of the desired ADC pin
- */
-ADCIno::ADCIno(uint8_t pin) : pin(pin)
-{
-
-}
-
-/**
- * @brief Default constructor of the Arduino ADC
- *
- */
-ADCIno::~ADCIno()
-{
-
-}
-
-/**
- * @brief ADC initialization
- *
- * @return ADCIno::Error_t
- */
-ADCIno::Error_t ADCIno::init()
-{
- return OK;
-}
-
-/**
- * @brief ADC deinitialization
- *
- * @return ADCIno::Error_t
- */
-ADCIno::Error_t ADCIno::deinit()
-{
- return OK;
-}
-
-/**
- * @brief ADC enable
- *
- * @return ADCIno::Error_t
- */
-ADCIno::Error_t ADCIno::enable()
-{
- return OK;
-}
-
-
-/**
- * @brief ADC disable
- *
- * @return ADCIno::Error_t
- */
-ADCIno::Error_t ADCIno::disable()
-{
- return OK;
-}
-
-/**
- * @brief Set resolution of the ADC
- *
- * This function sets the resolution of the ADC.
- * The available resolutions are depending on the ADC of the device
- * and have be looked up in the datasheet.
- * The default resolution is set to 12 Bit, see constructor.
- *
- * @param[in] resolution Value of the read resolution, default = 10 Bit
- * @return ADCIno::Error_t
- */
-ADCIno::Error_t ADCIno::setReadResolution(uint8_t resolution)
-{
- // analogReadResolution(resolution);
-
- return OK;
-}
-
-/**
- * @brief Set the write resolution of the ADC
- *
- * This function sets the write resolution of the ADC.
- *
- * @param[in] resolution Value of the write resolution of the ADC
- * @return ADCIno::Error_t
- */
-ADCIno::Error_t ADCIno::setWriteResolution(uint8_t resolution)
-{
- // analogWriteResolution(resolution);
-
- return OK;
-}
-
-/**
- * @brief Read the current ADC-Value
- *
- * @return uint16_t ADC value
- */
-uint16_t ADCIno::ADCRead()
-{
- uint16_t result = 0;
-
- result = analogRead(pin);
-
- return result;
-}
-
-/**
- * @brief Wirte on an analog pin
- *
- * This functions writes the given value to the analog pin
- *
- * @param[in] value Value to write
- * @return ADCIno::Error_t
- */
-ADCIno::Error_t ADCIno::ADCWrite(uint8_t value)
-{
- analogWrite(pin, value);
-
- return OK;
-}
-
diff --git a/src/framework/arduino/pal/adc-arduino.hpp b/src/framework/arduino/pal/adc-arduino.hpp
deleted file mode 100644
index cba2ccb..0000000
--- a/src/framework/arduino/pal/adc-arduino.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @file adc-arduino.hpp
- * @brief Arduino PAL for the ADC
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef ADC_ARDUINO_H_
-#define ADC_ARDUINO_H_
-
-#include "../../../corelib/hss.hpp"
-
-/**
- * @addtogroup arduinoPal
- * @{
- */
-
-
-/**
- * @brief Arduino ADC class
- *
- */
-class ADCIno : virtual public AnalogDigitalConverter
-{
- private:
- uint8_t pin;
-
- public:
- ADCIno();
- ADCIno(uint8_t pin);
- ~ADCIno();
- Error_t init();
- Error_t deinit();
- Error_t enable();
- Error_t disable();
- Error_t setReadResolution(uint8_t resolution);
- Error_t setWriteResolution(uint8_t resolution);
- uint16_t ADCRead();
- Error_t ADCWrite(uint8_t value);
-};
-/** @} */
-
-#endif /** ADC_ARDUINO_H_ **/
\ No newline at end of file
diff --git a/src/framework/arduino/pal/gpio-arduino.cpp b/src/framework/arduino/pal/gpio-arduino.cpp
deleted file mode 100644
index e435d04..0000000
--- a/src/framework/arduino/pal/gpio-arduino.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * @file gpio-arduino.hpp
- * @brief Arduino PAL for the GPIO
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include
-#include "gpio-arduino.hpp"
-
-/**
- * @brief Constructor of the Arduino GPIO class
- *
- * This function is setting the basics for a GPIO.
- *
- */
-GPIOIno::GPIOIno() : pin(0), mode(OUTPUT), logic(POSITIVE)
-{
-
-}
-
-/**
- * @brief Constructor of the Arduino GPIO class
- *
- * This function is setting the basics for a GPIO. It allows to set the pin number,
- * mode of the pin and the logic level.
- *
- * @param[in] pin Number of the desired pin
- * @param[in] mode Defines the mode of the pin (INPUT, OUTPUT, etc.)
- * @param[in] logic Defines the logic level of the pin
- */
-GPIOIno::GPIOIno(uint8_t pin, uint8_t mode, VLogic_t logic)
-: pin(pin), mode(mode), logic(logic)
-{
-
-}
-
-/**
- * @brief Initialize the GPIO
- *
- * This function is initializing the chosen pin.
- *
- * @return GPIOIno::Error_t
- */
-GPIOIno::Error_t GPIOIno::init()
-{
- pinMode(this->pin, this->mode);
- return OK;
-}
-
-/**
- * @brief Deinitialize the GPIO
- *
- * This function is deinitializing the chosen pin.
- *
- * @return GPIOIno::Error_t
- */
-GPIOIno::Error_t GPIOIno::deinit()
-{
- return OK;
-}
-
-/**
- * @brief Read GPIO logic level
- *
- * This function reads the logic level of the chosen pin and
- * returns the logic level value.
- *
- * @return GPIOIno::VLevel_t
- * @retval 0 = GPIO_LOW
- * @retval 1 = GPIO_HIGH
- */
-GPIOIno::VLevel_t GPIOIno::read()
-{
- return (VLevel_t) digitalRead(this->pin);
-}
-
-/**
- * @brief Set GPIO logic level
- *
- * This functions sets the logic level of the chosen pin.
- *
- * @param[in] level Desired logic level of the pin
- * @return GPIOIno::Error_t
- */
-GPIOIno::Error_t GPIOIno::write(VLevel_t level)
-{
- digitalWrite(this->pin, level);
- return OK;
-}
-
-/**
- * @brief Enable the GPIO
- *
- * This functions enable the chosen pin. Depending on the chosen logic of the pin
- * it sets the right logic level of the pin.
- *
- * @return GPIOIno::Error_t
- */
-GPIOIno::Error_t GPIOIno::enable()
-{
- if(this->logic == POSITIVE){
- digitalWrite(this->pin, GPIO_HIGH);
- }
- else if(this->logic == NEGATIVE){
- digitalWrite(this->pin, GPIO_LOW);;
- }
- return OK;
-}
-
-/**
- * @brief Disable the GPIO
- *
- * This functions disables the chosen pin. Depending on the chosen logic of the pin
- * it sets the right logic level of the pin.
- *
- * @return GPIOIno::Error_t
- */
-GPIOIno::Error_t GPIOIno::disable()
-{
- if(this->logic == POSITIVE){
- digitalWrite(this->pin, GPIO_LOW);
- }
- else if(this->logic == NEGATIVE){
- digitalWrite(this->pin, GPIO_HIGH);
- }
- return OK;
-}
-
-
-
-
-
diff --git a/src/framework/arduino/pal/gpio-arduino.hpp b/src/framework/arduino/pal/gpio-arduino.hpp
deleted file mode 100644
index bdb3ae4..0000000
--- a/src/framework/arduino/pal/gpio-arduino.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @file gpio-arduino.hpp
- * @brief Arduino PAL for the GPIO
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-
-#ifndef GPIO_ARDUINO_H_
-#define GPIO_ARDUINO_H_
-
-#include "../../../corelib/hss.hpp"
-
-/**
- * @addtogroup arduinoPal
- * @{
- */
-
-
-/**
- * @brief Arduino GPIO class
- *
- */
-class GPIOIno: virtual public GPIO
-{
-private:
- uint8_t pin;
- uint8_t mode;
- VLogic_t logic;
-
-public:
-
- static constexpr uint8_t unusedPin = 0xFFU;
-
- GPIOIno();
- GPIOIno(uint8_t pin, uint8_t mode, VLogic_t logic);
- ~GPIOIno();
- Error_t init();
- Error_t deinit();
- VLevel_t read();
- Error_t write(VLevel_t level);
- Error_t enable();
- Error_t disable();
-};
-/** @} */
-
-#endif /** GPIO_ARDUINO_H_ **/
diff --git a/src/framework/arduino/pal/hss-pal-adc-ino.cpp b/src/framework/arduino/pal/hss-pal-adc-ino.cpp
new file mode 100644
index 0000000..5a07be1
--- /dev/null
+++ b/src/framework/arduino/pal/hss-pal-adc-ino.cpp
@@ -0,0 +1,132 @@
+/**
+ * @file hss-pal-adc-ino.cpp
+ * @brief ADC platform abstraction layer Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include
+#include "hss-pal-adc-ino.hpp"
+
+using namespace hss;
+
+/**
+ * @brief Default constructor of the ADC class for arduino
+ */
+ADCIno::ADCIno() : pin(0)
+{
+
+}
+
+/**
+ * @brief Constructor of the ADC class for arduino
+ * @details This constructor takes the number of the pin.
+ * @param[in] pin Number of the desired ADC pin
+ */
+ADCIno::ADCIno(uint8_t pin) : pin(pin)
+{
+
+}
+
+/**
+ * @brief Default constructor of the Arduino ADC
+ *
+ */
+ADCIno::~ADCIno()
+{
+
+}
+
+/**
+ * @brief ADC initialization
+ * @return High-side switch error code
+ */
+Error_t ADCIno::init()
+{
+ return OK;
+}
+
+/**
+ * @brief ADC deinitialization
+ * @return High-side switch error code
+ */
+Error_t ADCIno::deinit()
+{
+ return OK;
+}
+
+/**
+ * @brief ADC enable
+ * @return High-side switch error code
+ */
+Error_t ADCIno::enable()
+{
+ return OK;
+}
+
+
+/**
+ * @brief ADC disable
+ * @return High-side switch error code
+ */
+Error_t ADCIno::disable()
+{
+ return OK;
+}
+
+/**
+ * @brief Set resolution of the ADC
+ * @details This function sets the resolution of the ADC.
+ * The available resolutions are depending on the ADC of the device
+ * and have be looked up in the datasheet.
+ * The default resolution is set to 12 Bit, see constructor.
+ * @param[in] resolution Value of the read resolution, default = 10 Bit
+ * @return High-side switch error code
+ */
+Error_t ADCIno::setReadResolution(uint8_t resolution)
+{
+ // analogReadResolution(resolution);
+
+ return OK;
+}
+
+/**
+ * @brief Set the write resolution of the ADC
+ * @details This function sets the write resolution of the ADC.
+ * @param[in] resolution Value of the write resolution of the ADC
+ * @return High-side switch error code
+ */
+Error_t ADCIno::setWriteResolution(uint8_t resolution)
+{
+ // analogWriteResolution(resolution);
+
+ return OK;
+}
+
+/**
+ * @brief Read the current ADC-Value
+ * @return uint16_t ADC value
+ */
+uint16_t ADCIno::ADCRead()
+{
+ uint16_t result = 0;
+
+ result = analogRead(pin);
+
+ return result;
+}
+
+/**
+ * @brief Wirte on an analog pin
+ * @details This functions writes the given value to the analog pin
+ * @param[in] value Value to write
+ * @return High-side switch error code
+ */
+Error_t ADCIno::ADCWrite(uint8_t value)
+{
+ analogWrite(pin, value);
+
+ return OK;
+}
+
diff --git a/src/framework/arduino/pal/hss-pal-adc-ino.hpp b/src/framework/arduino/pal/hss-pal-adc-ino.hpp
new file mode 100644
index 0000000..408b451
--- /dev/null
+++ b/src/framework/arduino/pal/hss-pal-adc-ino.hpp
@@ -0,0 +1,51 @@
+/**
+ * @file hss-pal-adc-ino.hpp
+ * @brief ADC platform abstraction layer Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_PAL_ADC_INO_HPP
+#define HSS_PAL_ADC_INO_HPP
+
+#include "hss-pal-adc.hpp"
+
+namespace hss
+{
+
+/**
+ * @addtogroup arduinoPal
+ * @{
+ */
+
+/**
+ * @class ADCIno
+ * @brief ADC platform abstraction layer Arduino API
+ */
+class ADCIno : virtual public ADCPAL
+{
+ private:
+
+ uint8_t pin; /**< ADC Pin number */
+
+ public:
+
+ ADCIno();
+ ADCIno(uint8_t pin);
+ ~ADCIno();
+ Error_t init();
+ Error_t deinit();
+ Error_t enable();
+ Error_t disable();
+ Error_t setReadResolution(uint8_t resolution);
+ Error_t setWriteResolution(uint8_t resolution);
+ uint16_t ADCRead();
+ Error_t ADCWrite(uint8_t value);
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_PAL_ADC_INO_HPP **/
\ No newline at end of file
diff --git a/src/framework/arduino/pal/hss-pal-gpio-ino.cpp b/src/framework/arduino/pal/hss-pal-gpio-ino.cpp
new file mode 100644
index 0000000..3dfdc62
--- /dev/null
+++ b/src/framework/arduino/pal/hss-pal-gpio-ino.cpp
@@ -0,0 +1,121 @@
+/**
+ * @file hss-pal-gpio-ino.cpp
+ * @brief GPIO platform abstraction layer Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+
+#include
+#include "hss-pal-gpio-ino.hpp"
+
+using namespace hss;
+
+/**
+ * @brief Constructor of the GPIO class for arduino
+ * @details This function is setting the basics for a GPIO.
+ */
+GPIOIno::GPIOIno() : pin(0), mode(OUTPUT), logic(POSITIVE)
+{
+
+}
+
+/**
+ * @brief Constructor of the GPIO class for arduino
+ * @details This function is setting the basics for a GPIO. It allows to set the pin number,
+ * mode of the pin and the logic level.
+ * @param[in] pin Number of the desired pin
+ * @param[in] mode Defines the mode of the pin (INPUT, OUTPUT, etc.)
+ * @param[in] logic Defines the logic level of the pin
+ */
+GPIOIno::GPIOIno(uint8_t pin, uint8_t mode, VLogic_t logic)
+: pin(pin), mode(mode), logic(logic)
+{
+
+}
+
+/**
+ * @brief Initialize the GPIO
+ * @details This function is initializing the chosen pin.
+ * @return High-side switch error code
+ */
+Error_t GPIOIno::init()
+{
+ pinMode(this->pin, this->mode);
+ return OK;
+}
+
+/**
+ * @brief Deinitialize the GPIO
+ * @details This function is deinitializing the chosen pin.
+ * @return High-side switch error code
+ */
+Error_t GPIOIno::deinit()
+{
+ return OK;
+}
+
+/**
+ * @brief Read GPIO logic level
+ * @details This function reads the logic level of the chosen pin and
+ * returns the logic level value.
+ * @return VLevel_t
+ * @retval 0 GPIO_LOW
+ * @retval 1 GPIO_HIGH
+ */
+GPIOIno::VLevel_t GPIOIno::read()
+{
+ return (VLevel_t) digitalRead(this->pin);
+}
+
+/**
+ * @brief Set GPIO logic level
+ * @details This functions sets the logic level of the chosen pin.
+ * @param[in] level Desired logic level of the pin
+ * @return High-side switch error code
+ */
+Error_t GPIOIno::write(VLevel_t level)
+{
+ digitalWrite(this->pin, level);
+ return OK;
+}
+
+/**
+ * @brief Enable the GPIO
+ * @details This functions enable the chosen pin. Depending on the chosen logic of the pin
+ * it sets the right logic level of the pin.
+ * @return High-side switch error code
+ */
+Error_t GPIOIno::enable()
+{
+ if(this->logic == POSITIVE){
+ digitalWrite(this->pin, GPIO_HIGH);
+ }
+ else if(this->logic == NEGATIVE){
+ digitalWrite(this->pin, GPIO_LOW);;
+ }
+ return OK;
+}
+
+/**
+ * @brief Disable the GPIO
+ * @details This functions disables the chosen pin. Depending on the chosen logic of the pin
+ * it sets the right logic level of the pin.
+ * @return High-side switch error code
+ */
+Error_t GPIOIno::disable()
+{
+ if(this->logic == POSITIVE){
+ digitalWrite(this->pin, GPIO_LOW);
+ }
+ else if(this->logic == NEGATIVE){
+ digitalWrite(this->pin, GPIO_HIGH);
+ }
+ return OK;
+}
+
+
+
+
+
diff --git a/src/framework/arduino/pal/hss-pal-gpio-ino.hpp b/src/framework/arduino/pal/hss-pal-gpio-ino.hpp
new file mode 100644
index 0000000..f14a929
--- /dev/null
+++ b/src/framework/arduino/pal/hss-pal-gpio-ino.hpp
@@ -0,0 +1,53 @@
+/**
+ * @file hss-pal-gpio-ino.hpp
+ * @brief GPIO platform abstraction layer Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_PAL_GPIO_INO_HPP_
+#define HSS_PAL_GPIO_INO_HPP_
+
+#include "hss-pal-gpio.hpp"
+
+namespace hss
+{
+
+/**
+ * @addtogroup arduinoPal
+ * @{
+ */
+
+/**
+ * @class GPIOIno
+ * @brief GPIO platform abstraction layer Arduino API
+ */
+class GPIOIno: virtual public GPIOPAL
+{
+private:
+
+ uint8_t pin;
+ uint8_t mode;
+ VLogic_t logic;
+
+public:
+
+ static constexpr uint8_t unusedPin = 0xFFU; /**< Unused pin */
+
+ GPIOIno();
+ GPIOIno(uint8_t pin, uint8_t mode, VLogic_t logic);
+ ~GPIOIno();
+ Error_t init();
+ Error_t deinit();
+ VLevel_t read();
+ Error_t write(VLevel_t level);
+ Error_t enable();
+ Error_t disable();
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_PAL_GPIO_INO_HPP_ **/
diff --git a/src/framework/arduino/pal/hss-pal-timer-ino.cpp b/src/framework/arduino/pal/hss-pal-timer-ino.cpp
new file mode 100644
index 0000000..f767d1b
--- /dev/null
+++ b/src/framework/arduino/pal/hss-pal-timer-ino.cpp
@@ -0,0 +1,117 @@
+/**
+ * @file hss-pal-timer-ino.cpp
+ * @brief Timer platform abstraction layer Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include
+#include "hss-pal-timer-ino.hpp"
+
+using namespace hss;
+
+/**
+ * @brief Constructor of the Timer class for arduino
+ */
+TimerIno::TimerIno()
+{
+
+}
+
+/**
+ * @brief Destructor of the Timer class for arduino
+ *
+ */
+TimerIno::~TimerIno()
+{
+
+}
+
+/**
+ * @brief Initialization of the Timer
+ * @details This function is initializing the Timer and sets
+ * the elapsed time to zero.
+ * @return High-side switch error code
+ */
+Error_t TimerIno::init()
+{
+ startTime = 0;
+ return OK;
+}
+
+/**
+ * @brief Deinitialize the Timer
+ * @details This function deinitialize the Timer and also
+ * resets the elapsed time variable.
+ * @return High-side switch error code
+ */
+Error_t TimerIno::deinit()
+{
+ startTime = 0;
+ return OK;
+}
+
+/**
+ * @brief Start the timer
+ * @details This function is starting the timer.
+ * @return High-side switch error code
+ */
+Error_t TimerIno::start()
+{
+ startTime = millis();
+ return OK;
+}
+
+/**
+ * @brief Calculate the elapsed time
+ * @details This function is calculating the elapsed time since the
+ * start of the timer. The value stored in the given variable
+ * is in milliseconds.
+ * @param[in] &elapsed Address of a value where the elapsed time should be stored
+ * @return High-side switch error code
+ */
+Error_t TimerIno::elapsed(uint32_t &elapsed)
+{
+ elapsed = millis() - startTime;
+ return OK;
+}
+
+/**
+ * @brief Stop the timer
+ * @details This function stops the timer and resets the
+ * start time variable.
+ * @return High-side switch error code
+ */
+Error_t TimerIno::stop()
+{
+ startTime = 0;
+ return OK;
+}
+
+/**
+ * @brief Time delay
+ * @details This function is causing a desired delay of the application.
+ * The input value is given in milliseconds.
+ * @param[in] timeout Desired timeout in ms
+ * @return High-side switch error code
+ */
+Error_t TimerIno::delayMilli(uint32_t timeout)
+{
+ delay(timeout);
+ return OK;
+}
+
+/**
+ * @brief Time delay
+ * @details This function is causing a desired delay of the application.
+ * The input value is given in microseconds.
+ * @param[in] timeout Desired timeout in us
+ * @return High-side switch error code
+ */
+Error_t TimerIno::delayMicro(uint32_t timeout)
+{
+ delayMicroseconds(timeout);
+ return OK;
+}
+
diff --git a/src/framework/arduino/pal/hss-pal-timer-ino.hpp b/src/framework/arduino/pal/hss-pal-timer-ino.hpp
new file mode 100644
index 0000000..41c4d99
--- /dev/null
+++ b/src/framework/arduino/pal/hss-pal-timer-ino.hpp
@@ -0,0 +1,49 @@
+/**
+ * @file hss-pal-timer-ino.hpp
+ * @brief Timer platform abstraction layer Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_PAL_TIMER_INO_HPP_
+#define HSS_PAL_TIMER_INO_HPP_
+
+#include "hss-pal-timer.hpp"
+
+namespace hss
+{
+
+/**
+ * @addtogroup arduinoPal
+ * @{
+ */
+
+/**
+ * @class TimerIno
+ * @brief Timer platform abstraction layer Arduino API
+ */
+class TimerIno: virtual public TimerPAL
+{
+ public:
+
+ TimerIno();
+ ~TimerIno();
+ Error_t init();
+ Error_t deinit();
+ Error_t start();
+ Error_t elapsed(uint32_t &elapsed);
+ Error_t stop();
+ Error_t delayMilli(uint32_t timeout);
+ Error_t delayMicro(uint32_t timeout);
+
+ private:
+
+ uint32_t startTime;
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_PAL_TIMER_INO_HPP_ **/
\ No newline at end of file
diff --git a/src/framework/arduino/pal/timer-arduino.cpp b/src/framework/arduino/pal/timer-arduino.cpp
deleted file mode 100644
index 7afc214..0000000
--- a/src/framework/arduino/pal/timer-arduino.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- * @file timer-arduino.cpp
- * @brief Arduino Timer Platform Abstraction Layer
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include
-#include "timer-arduino.hpp"
-
-/**
- * @brief Constructor of the Arduino Timer class
- *
- */
-TimerIno::TimerIno()
-{
-
-}
-
-/**
- * @brief Destructor of the Arduino Timer class
- *
- */
-TimerIno::~TimerIno()
-{
-
-}
-
-/**
- * @brief Initialization of the Timer
- *
- * This function is initializing the Timer and sets
- * the elapsed time to zero.
- *
- * @return TimerIno::Error_t
- */
-TimerIno::Error_t TimerIno::init()
-{
- startTime = 0;
- return OK;
-}
-
-/**
- * @brief Deinitialize the Timer
- *
- * This function deinitialize the Timer and also
- * resets the elapsed time variable.
- *
- * @return TimerIno::Error_t
- */
-TimerIno::Error_t TimerIno::deinit()
-{
- startTime = 0;
- return OK;
-}
-
-/**
- * @brief Start the timer
- *
- * This function is starting the timer.
- *
- * @return TimerIno::Error_t
- */
-TimerIno::Error_t TimerIno::start()
-{
- startTime = millis();
- return OK;
-}
-
-/**
- * @brief Calculate the elapsed time
- *
- * This function is calculating the elapsed time since the
- * start of the timer. The value stored in the given variable
- * is in milliseconds.
- *
- * @param[in] &elapsed Address of a value where the elapsed time should be stored
- * @return TimerIno::Error_t
- */
-TimerIno::Error_t TimerIno::elapsed(uint32_t &elapsed)
-{
- elapsed = millis() - startTime;
- return OK;
-}
-
-/**
- * @brief Stop the timer
- *
- * This function stops the timer and resets the
- * start time variable.
- *
- * @return TimerIno::Error_t
- */
-TimerIno::Error_t TimerIno::stop()
-{
- startTime = 0;
- return OK;
-}
-
-/**
- * @brief Time delay
- *
- * This function is causing a desired delay of the application.
- * The input value is given in milliseconds.
- *
- * @param[in] timeout Desired timeout in ms
- * @return TimerIno::Error_t
- */
-TimerIno::Error_t TimerIno::delayMilli(uint32_t timeout)
-{
- delay(timeout);
- return OK;
-}
-
-/**
- * @brief Time delay
- *
- * This function is causing a desired delay of the application.
- * The input value is given in microseconds.
- *
- * @param[in] timeout Desired timeout in us
- * @return TimerIno::Error_t
- */
-TimerIno::Error_t TimerIno::delayMicro(uint32_t timeout)
-{
- delayMicroseconds(timeout);
- return OK;
-}
-
diff --git a/src/framework/arduino/pal/timer-arduino.hpp b/src/framework/arduino/pal/timer-arduino.hpp
deleted file mode 100644
index 0b942e3..0000000
--- a/src/framework/arduino/pal/timer-arduino.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file timer-arduino.hpp
- * @brief Arduino Timer PAL
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef TIMER_ARDUINO_HPP_
-#define TIMER_ARDUINO_HPP_
-
-#include "../../../pal/timer.hpp"
-
-/**
- * @addtogroup arduinoPal
- * @{
- */
-
-
-class TimerIno: virtual public Timer
-{
- public:
- TimerIno();
- ~TimerIno();
- Error_t init();
- Error_t deinit();
- Error_t start();
- Error_t elapsed(uint32_t &elapsed);
- Error_t stop();
- Error_t delayMilli(uint32_t timeout);
- Error_t delayMicro(uint32_t timeout);
-
- private:
- uint32_t startTime;
-};
-/** @} */
-
-#endif /** TIMER_ARDUINO_HPP_ **/
\ No newline at end of file
diff --git a/platformio.ini b/src/framework/arduino/platformio.ini
similarity index 77%
rename from platformio.ini
rename to src/framework/arduino/platformio.ini
index afbcc8c..487f439 100644
--- a/platformio.ini
+++ b/src/framework/arduino/platformio.ini
@@ -1,5 +1,5 @@
[platformio]
-src_dir = examples/high-side-switch
+src_dir = examples/BTS700x-hss-single-ch
lib_dir = .
diff --git a/src/framework/arduino/wrapper/config.cpp b/src/framework/arduino/wrapper/config.cpp
deleted file mode 100644
index 7b14484..0000000
--- a/src/framework/arduino/wrapper/config.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * @file config.cpp
- * @brief Configurations for the different Platfroms
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "config.hpp"
-#include
-
-hardwareconfig_t ARDUINO_UNO
-{
- .led1 = 4, //LED 1
- .led2 = 5, //LED 2
- .led3 = 12, //LED 3
- .led4 = 13, //LED 4
-
- .in1 = 9, //IN 1
- .in2 = 10, //IN 2
- .in3 = 11, //IN 3
- .in4 = 3, //IN 4
-
- .oloff = 7, //OLOFF
-
- .den1_den3 = 6, //DEN 1_3
- .den2_den4 = 8, //DEN 2_4
-
- .pushButtonDigital = 2, //PUSHBUTTONDIGITAL
-
- .pushButtonAnalog = A0, //PUSHBUTTONANALOG
- .vBat = A1, //VBAT
- .is1_is2 = A2, //IS 1_2
- .is3_is4 = A3 //IS 3_4
-};
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/config.hpp b/src/framework/arduino/wrapper/config.hpp
deleted file mode 100644
index ea29dfd..0000000
--- a/src/framework/arduino/wrapper/config.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @file config.hpp
- * @brief Configurations for the different platfroms
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef CONFIG_HPP_
-#define CONFIG_HPP_
-
-#include
-
-/**
- * @addtogroup arduinoWrapper
- * @{
- */
-
-
-/**
- * @brief Struct with all necessary defines of the Profet-Shield
- *
- */
-struct hardwareconfig_t
-{
- uint8_t led1;
- uint8_t led2;
- uint8_t led3;
- uint8_t led4;
-
- uint8_t in1;
- uint8_t in2;
- uint8_t in3;
- uint8_t in4;
-
- uint8_t oloff;
-
- uint8_t den1_den3;
- uint8_t den2_den4;
-
- uint8_t pushButtonDigital;
-
- uint8_t pushButtonAnalog;
- uint8_t vBat;
- uint8_t is1_is2;
- uint8_t is3_is4;
-};
-
-extern hardwareconfig_t ARDUINO_UNO;
-/** @} */
-
-#endif /** CONFIG_HPP_ **/
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-arduino.cpp b/src/framework/arduino/wrapper/hss-arduino.cpp
new file mode 100644
index 0000000..1969819
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-arduino.cpp
@@ -0,0 +1,89 @@
+/**
+ * @file hss-arduino.cpp
+ * @brief High side switch Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "hss-arduino.hpp"
+#include
+
+using namespace hss;
+
+/**
+ * @brief Constructor of the Arduino High-Side-Switch class
+ * @details This functions is the default constructor of the Arduino High-Side-Switch class.
+ * There are different variants of the High-Side-Switch, therefore you have to chose one.
+ * @param[in] in Pin number of the input pin
+ * @param[in] is Pin number of the sense current output
+ * @param[in] btxVariant Shield Variant type
+ */
+HssIno::HssIno(uint8_t in, uint8_t is, BtxVariants_t * btxVariant)
+: Hss(nullptr,
+ new GPIOIno(in, OUTPUT, GPIOIno::POSITIVE),
+ nullptr,
+ nullptr,
+ new ADCIno(is),
+ new TimerIno(),
+ btxVariant)
+{
+
+}
+
+/**
+ * @brief Constructor of the Arduino High-Side-Switch class
+ * @details This functions is the default constructor of the Arduino High-Side-Switch class.
+ * There are different variants of the High-Side-Switch, therefore you have to chose one.
+ * @param[in] den Pin number of the diagnostic enable pin
+ * @param[in] in Pin number of the input pin
+ * @param[in] is Pin number of the sense current output
+ * @param[in] btxVariant Shield Variant type
+ */
+HssIno::HssIno(uint8_t den, uint8_t in, uint8_t is, BtxVariants_t * btxVariant)
+: Hss(new GPIOIno(den, OUTPUT, GPIOIno::POSITIVE),
+ new GPIOIno(in, OUTPUT, GPIOIno::POSITIVE),
+ nullptr,
+ nullptr,
+ new ADCIno(is),
+ new TimerIno(),
+ btxVariant)
+{
+
+}
+
+/**
+ * @brief Constructor of the Arduino High-Side-Switch class
+ * @details This functions is the default constructor of the Arduino High-Side-Switch class.
+ * There are different variants of the High-Side-Switch, therefore you have to chose one.
+ * @param[in] den Pin number of the diagnostic enable pin
+ * @param[in] in0 Pin number of the input pin 0
+ * @param[in] in1 Pin number of the input pin 1
+ * @param[in] dsel Pin number of diagnosis channel select
+ * @param[in] is Pin number of the sense current output
+ * @param[in] btxVariant Shield Variant type
+ */
+HssIno::HssIno(uint8_t den, uint8_t in0, uint8_t in1, uint8_t dsel, uint8_t is, BtxVariants_t * btxVariant)
+: Hss(new GPIOIno(den, OUTPUT, GPIOIno::POSITIVE),
+ new GPIOIno(in0, OUTPUT, GPIOIno::POSITIVE),
+ new GPIOIno(in1, OUTPUT, GPIOIno::POSITIVE),
+ new GPIOIno(dsel, OUTPUT, GPIOIno::POSITIVE),
+ new ADCIno(is),
+ new TimerIno(),
+ btxVariant)
+{
+
+}
+
+/**
+ * @brief Destructor of the Arduino High-Side-Switch
+ *
+ */
+HssIno::~HssIno()
+{
+ delete den;
+ delete in0;
+ delete in1;
+ delete dsel;
+ delete is;
+ delete timer;
+}
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-arduino.hpp b/src/framework/arduino/wrapper/hss-arduino.hpp
new file mode 100644
index 0000000..d5adf99
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-arduino.hpp
@@ -0,0 +1,35 @@
+/**
+ * @file hss-arduino.hpp
+ * @brief High side switch Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_ARDUINO_HPP_
+#define HSS_ARDUINO_HPP_
+
+#include "hss.hpp"
+#include "hss-pal-gpio-ino.hpp"
+#include "hss-pal-adc-ino.hpp"
+#include "hss-pal-timer-ino.hpp"
+
+namespace hss
+{
+
+/**
+ * @class HssIno
+ * @brief High side switch Arduino API
+ */
+class HssIno : public Hss
+{
+ public:
+ HssIno(uint8_t in, uint8_t is, BtxVariants_t * btxVariant);
+ HssIno(uint8_t den, uint8_t in, uint8_t is, BtxVariants_t * btxVariant);
+ HssIno(uint8_t den, uint8_t in0, uint8_t in1, uint8_t dsel, uint8_t is, BtxVariants_t * btxVariant);
+ ~HssIno();
+};
+
+}
+
+#endif /** HSS_ARDUINO_HPP_ **/
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-shield-bts5001x-ino.cpp b/src/framework/arduino/wrapper/hss-shield-bts5001x-ino.cpp
new file mode 100644
index 0000000..ca5c2e8
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-bts5001x-ino.cpp
@@ -0,0 +1,54 @@
+/**
+ * @file hss-shield-bts5001x-ino.cpp
+ * @brief Power Profet (12V) shield with BTS500xx Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-shield-bts5001x-ino.hpp"
+#include
+
+using namespace hss;
+
+/**
+ * @brief High-Side-Switch-Board constructor
+ * @details Initialize all protected class pointers with a null pointer
+ * @param[in] variantSel Shield variant types
+ */
+Bts5001xShieldIno::Bts5001xShieldIno(BtxVariants_t *variantSel):
+Bts5001xShield(hss1 = new HssIno(BTS5001X_HWCONFIG.in, BTS5001X_HWCONFIG.is, variantSel),
+ led2 = ((BTS5001X_HWCONFIG.led2 == GPIOIno::unusedPin) ? NULL : new GPIOIno(BTS5001X_HWCONFIG.led2, OUTPUT, GPIOIno::POSITIVE)),
+ led3 = ((BTS5001X_HWCONFIG.led3 == GPIOIno::unusedPin) ? NULL : new GPIOIno(BTS5001X_HWCONFIG.led3, OUTPUT, GPIOIno::POSITIVE)),
+ pushButton = new ADCIno(BTS5001X_HWCONFIG.pushButtonAnalog),
+ vBat = new ADCIno(BTS5001X_HWCONFIG.vBat))
+{
+
+}
+
+/**
+ * @brief High-Side-Switch-Board constructor
+ * @details Initialize all protected class pointers with a null pointer
+ * @param[in] variantSel Shield variant types
+ * @param[in] config Pinout hardware configuration
+ */
+Bts5001xShieldIno::Bts5001xShieldIno(BtxVariants_t *variantSel, BTS5001xHwConfig_t config):
+Bts5001xShield(hss1 = new HssIno(config.in, config.is, variantSel),
+ led2 = ((config.led2 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led2, OUTPUT, GPIOIno::POSITIVE)),
+ led3 = ((config.led3 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led3, OUTPUT, GPIOIno::POSITIVE)),
+ pushButton = new ADCIno(config.pushButtonAnalog),
+ vBat = new ADCIno(config.vBat))
+{
+
+}
+
+
+/**
+ * @brief Destructor of the High-Side-Switch-Board
+ *
+ */
+Bts5001xShieldIno::~Bts5001xShieldIno()
+{
+
+}
+
diff --git a/src/framework/arduino/wrapper/hss-shield-bts5001x-ino.hpp b/src/framework/arduino/wrapper/hss-shield-bts5001x-ino.hpp
new file mode 100644
index 0000000..02a00f0
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-bts5001x-ino.hpp
@@ -0,0 +1,35 @@
+/**
+ * @file hss-shield-bts5001x-ino.hpp
+ * @brief Power Profet (12V) shield with BTS500xx Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_BTS5001X_INO_HPP_
+#define HSS_SHIELD_BTS5001X_INO_HPP_
+
+#include "hss-arduino.hpp"
+#include "hss-shield-bts5001x.hpp"
+#include "hss-variants.hpp"
+#include "hss-shield-platf.hpp"
+
+namespace hss
+{
+
+/**
+ * @brief Power Profet (12V) shield with BTS500xx Arduino API
+ */
+
+class Bts5001xShieldIno : public Bts5001xShield
+{
+ public:
+ Bts5001xShieldIno(BtxVariants_t *variantSel);
+ Bts5001xShieldIno(BtxVariants_t *variantSel, BTS5001xHwConfig_t config);
+ ~Bts5001xShieldIno();
+
+};
+
+}
+
+#endif /** HSS_SHIELD_BTS5001X_INO_HPP_ **/
diff --git a/src/framework/arduino/wrapper/hss-shield-bts700x-ino.cpp b/src/framework/arduino/wrapper/hss-shield-bts700x-ino.cpp
new file mode 100644
index 0000000..45430ad
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-bts700x-ino.cpp
@@ -0,0 +1,72 @@
+/**
+ * @file hss-shield-bts700x-ino.cpp
+ * @brief Profet +2 (12V) shield with BTS700x-1EPP Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-shield-bts700x-ino.hpp"
+#include
+
+using namespace hss;
+
+/**
+ * @brief BTS700xShield High-Side-Switch constructor
+ * @details Initializes all class pointers
+ * @param[in] variantSel Shield variant type
+ */
+Bts700xShieldIno::Bts700xShieldIno(BtxVariants_t *variantSel):
+Bts700xShield ( led1 = ((BTS700X_HWCONFIG.led1 == GPIOIno::unusedPin) ? NULL : new GPIOIno(BTS700X_HWCONFIG.led1, OUTPUT, GPIOIno::POSITIVE)),
+ led2 = ((BTS700X_HWCONFIG.led2 == GPIOIno::unusedPin) ? NULL : new GPIOIno(BTS700X_HWCONFIG.led2, OUTPUT, GPIOIno::POSITIVE)),
+ led3 = ((BTS700X_HWCONFIG.led3 == GPIOIno::unusedPin) ? NULL : new GPIOIno(BTS700X_HWCONFIG.led3, OUTPUT, GPIOIno::POSITIVE)),
+ led4 = ((BTS700X_HWCONFIG.led4 == GPIOIno::unusedPin) ? NULL : new GPIOIno(BTS700X_HWCONFIG.led4, OUTPUT, GPIOIno::POSITIVE)),
+ hss1 = new HssIno(BTS700X_HWCONFIG.den1_den3, BTS700X_HWCONFIG.in1, BTS700X_HWCONFIG.is1_is2, variantSel),
+ hss2 = new HssIno(BTS700X_HWCONFIG.den2_den4, BTS700X_HWCONFIG.in2, BTS700X_HWCONFIG.is1_is2, variantSel),
+ hss3 = new HssIno(BTS700X_HWCONFIG.den1_den3, BTS700X_HWCONFIG.in3, BTS700X_HWCONFIG.is3_is4, variantSel),
+ hss4 = new HssIno(BTS700X_HWCONFIG.den2_den4, BTS700X_HWCONFIG.in4, BTS700X_HWCONFIG.is3_is4, variantSel),
+ timer = new TimerIno(),
+ oloff = new GPIOIno(BTS700X_HWCONFIG.oloff, OUTPUT, GPIOIno::POSITIVE),
+ pushButtonDigital = new GPIOIno(BTS700X_HWCONFIG.pushButtonDigital, INPUT_PULLUP, GPIOIno::POSITIVE),
+ pushButtonAnalog = new ADCIno(BTS700X_HWCONFIG.pushButtonAnalog),
+ vBat = new ADCIno(BTS700X_HWCONFIG.vBat),
+ btxVariant = variantSel
+ )
+{
+
+}
+
+/**
+ * @brief BTS700xShield High-Side-Switch constructor for custom configuration
+ * @details Initialize all class pointers. This constructor allows to pass custom shield configuration
+ * @param[in] variantSel Shield variant types
+ * @param[in] config Pinout hardware configuration
+ */
+Bts700xShieldIno::Bts700xShieldIno(BtxVariants_t *variantSel, Bts700xHwConfig_t config):
+Bts700xShield ( led1 = ((config.led1 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led1, OUTPUT, GPIOIno::POSITIVE)),
+ led2 = ((config.led2 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led2, OUTPUT, GPIOIno::POSITIVE)),
+ led3 = ((config.led3 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led3, OUTPUT, GPIOIno::POSITIVE)),
+ led4 = ((config.led4 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led4, OUTPUT, GPIOIno::POSITIVE)),
+ hss1 = new HssIno(config.den1_den3, config.in1, config.is1_is2, variantSel),
+ hss2 = new HssIno(config.den2_den4, config.in2, config.is1_is2, variantSel),
+ hss3 = new HssIno(config.den1_den3, config.in3, config.is3_is4, variantSel),
+ hss4 = new HssIno(config.den2_den4, config.in4, config.is3_is4, variantSel),
+ timer = new TimerIno(),
+ oloff = new GPIOIno(config.oloff, OUTPUT, GPIOIno::POSITIVE),
+ pushButtonDigital = new GPIOIno(config.pushButtonDigital, INPUT_PULLUP, GPIOIno::POSITIVE),
+ pushButtonAnalog = new ADCIno(config.pushButtonAnalog),
+ vBat = new ADCIno(config.vBat),
+ btxVariant = variantSel
+ )
+{
+
+}
+
+/**
+ * @brief Destructor of the BTS700x Shield
+ *
+ */
+Bts700xShieldIno::~Bts700xShieldIno()
+{
+
+}
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-shield-bts700x-ino.hpp b/src/framework/arduino/wrapper/hss-shield-bts700x-ino.hpp
new file mode 100644
index 0000000..36a0350
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-bts700x-ino.hpp
@@ -0,0 +1,34 @@
+/**
+ * @file hss-shield-bts700x-ino.hpp
+ * @brief Profet +2 (12V) shield with BTS700x-1EPP Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_BTS700X_INO_HPP_
+#define HSS_SHIELD_BTS700X_INO_HPP_
+
+#include "hss-arduino.hpp"
+#include "hss-shield-bts700x.hpp"
+#include "hss-variants.hpp"
+#include "hss-shield-platf.hpp"
+
+namespace hss
+{
+
+/**
+ * @brief Profet +2 (12V) shield with BTS700x-1EPP Arduino API
+ */
+
+class Bts700xShieldIno : public Bts700xShield
+{
+ public:
+ Bts700xShieldIno(BtxVariants_t *variantSel);
+ Bts700xShieldIno(BtxVariants_t *variantSel, Bts700xHwConfig_t config);
+ ~Bts700xShieldIno();
+};
+
+}
+
+#endif /** HSS_SHIELD_BTS700X_INO_HPP_ **/
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-shield-btt60xx-ino.cpp b/src/framework/arduino/wrapper/hss-shield-btt60xx-ino.cpp
new file mode 100644
index 0000000..5f5338a
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-btt60xx-ino.cpp
@@ -0,0 +1,50 @@
+/**
+ * @file hss-shield-btt60xx-ino.cpp
+ * @brief Profet (24V) shield with BTT6030-2EKA and BTT6020-1EKA Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-shield-btt60xx-ino.hpp"
+#include
+
+using namespace hss;
+
+/**
+ * @brief Profet (24V) BTT6030 Shield constructor
+ * @details Initialize all protected class pointers.
+ */
+Btt60xxShieldIno::Btt60xxShieldIno():
+Btt60xxShield (
+ switches[0] = new HssIno(BTT60XX_HWCONFIG.den_0, BTT60XX_HWCONFIG.in0_0, BTT60XX_HWCONFIG.in1_0, BTT60XX_HWCONFIG.dsel_0, BTT60XX_HWCONFIG.is_0, &BTT6030),
+ switches[1] = new HssIno(BTT60XX_HWCONFIG.den_1, BTT60XX_HWCONFIG.in0_1, BTT60XX_HWCONFIG.in1_1, BTT60XX_HWCONFIG.dsel_1, BTT60XX_HWCONFIG.is_1, &BTT6030),
+ switches[2] = new HssIno(BTT60XX_HWCONFIG.den_2, BTT60XX_HWCONFIG.in0_2, BTT60XX_HWCONFIG.is_2, &BTT6020)
+ )
+{
+
+}
+
+/**
+ * @brief Profet (24V) BTT6030 Shield constructor for custom configuration
+ * @details Initialize all class pointers. This constructor allows to pass custom shield configuration.
+ * @param[in] config Pinout hardware configuration
+ */
+Btt60xxShieldIno::Btt60xxShieldIno(Btt60xxHwConfig_t config):
+Btt60xxShield (
+ switches[0] = new HssIno(config.den_0, config.in0_0, config.in1_0, config.dsel_0, config.is_0, &BTT6030),
+ switches[1] = new HssIno(config.den_1, config.in0_1, config.in1_1, config.dsel_1, config.is_1, &BTT6030),
+ switches[2] = new HssIno(config.den_2, config.in0_2, config.is_2, &BTT6020)
+ )
+{
+
+}
+
+/**
+ * @brief Destructor of the Profet (24V) BTT6030 Shield
+ *
+ */
+Btt60xxShieldIno::~Btt60xxShieldIno()
+{
+
+}
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-shield-btt60xx-ino.hpp b/src/framework/arduino/wrapper/hss-shield-btt60xx-ino.hpp
new file mode 100644
index 0000000..9966980
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-btt60xx-ino.hpp
@@ -0,0 +1,34 @@
+/**
+ * @file hss-shield-btt60xx-ino.hpp
+ * @brief Profet (24V) shield with BTT6030-2EKA and BTT6020-1EKA Arduino class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_BTT60XX_INO_HPP_
+#define HSS_SHIELD_BTT60XX_INO_HPP_
+
+#include "hss-arduino.hpp"
+#include "hss-shield-btt60xx.hpp"
+#include "hss-variants.hpp"
+#include "hss-shield-platf.hpp"
+
+namespace hss
+{
+
+/**
+ * @brief Profet (24V) shield with BTT6030-2EKA and BTT6020-1EKA Arduino API
+ */
+
+class Btt60xxShieldIno : public Btt60xxShield
+{
+ public:
+ Btt60xxShieldIno();
+ Btt60xxShieldIno(Btt60xxHwConfig_t config);
+ ~Btt60xxShieldIno();
+};
+
+}
+
+#endif /** HSS_SHIELD_BTT60XX_INO_HPP_ **/
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-shield-platf.cpp b/src/framework/arduino/wrapper/hss-shield-platf.cpp
new file mode 100644
index 0000000..3bc6313
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-platf.cpp
@@ -0,0 +1,96 @@
+/**
+ * @file hss-shield-platf.cpp
+ * @brief Hardware platform predefined Arduino configurations
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "hss-shield-platf.hpp"
+
+namespace hss
+{
+
+#if (defined(XMC1100_Boot_Kit) || defined(ARDUINO_AVR_UNO))
+
+#include
+
+/**
+ * @brief BTS700x Shield Arduino Uno Pin Configuration
+ */
+Bts700xHwConfig_t BTS700X_HWCONFIG =
+{
+ .led1 = 4,
+ .led2 = 5,
+ .led3 = 12,
+ .led4 = 13,
+
+ .in1 = 9,
+ .in2 = 10,
+ .in3 = 11,
+ .in4 = 3,
+
+ .oloff = 7,
+
+ .den1_den3 = 6,
+ .den2_den4 = 8,
+
+ .pushButtonDigital = 2,
+
+ .pushButtonAnalog = A0,
+ .vBat = A1,
+ .is1_is2 = A2,
+ .is3_is4 = A3
+};
+
+/**
+ * @brief BTS5001x Shield Arduino Uno Pin Configuration
+ */
+BTS5001xHwConfig_t BTS5001X_HWCONFIG =
+{
+ .led2 = 9,
+ .led3 = 5,
+
+ .in = 6,
+
+ .pushButtonAnalog = A0,
+ .vBat = A5,
+ .is = A2,
+
+};
+
+/**
+ * @brief BTT60xx Shield Arduino Uno Pin Configuration
+ */
+Btt60xxHwConfig_t BTT60XX_HWCONFIG =
+{
+ ///Profet0 - BTT6030 (2 channel) pin config
+ .in0_0 = A3,
+ .den_0 = A4,
+ .dsel_0 = 2,
+ .in1_0 = 3,
+ .is_0 = A0,
+
+ ///Profet1 - BTT6030 (2 channel) pin config
+ .in0_1 = 4,
+ .den_1 = 5,
+ .dsel_1 = 6,
+ .in1_1 = 7,
+ .is_1 = A1,
+
+ ///Profet2 - BTT6020 (1 channel) pin config
+ .in0_2 = 8,
+ .den_2 = 9,
+ .is_2 = A2,
+};
+
+#else
+
+#error "You did not define a supported platform! \
+Please make sure you're defining a custom default platform \
+in hss-shield-platf.cpp, or use the non-default shield \
+constructor."
+
+#endif
+
+}
\ No newline at end of file
diff --git a/src/framework/arduino/wrapper/hss-shield-platf.hpp b/src/framework/arduino/wrapper/hss-shield-platf.hpp
new file mode 100644
index 0000000..f851772
--- /dev/null
+++ b/src/framework/arduino/wrapper/hss-shield-platf.hpp
@@ -0,0 +1,112 @@
+/**
+ * @file hss-shield-platf.hpp
+ * @brief Hardware platform predefined Arduino configurations
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_SHIELD_PLATF_HPP_
+#define HSS_SHIELD_PLATF_HPP_
+
+#include
+
+namespace hss
+{
+
+/**
+ * @addtogroup arduinoWrapper
+ * @{
+ */
+
+/**
+ * @brief BTS700x Shield Pin Configuration
+ */
+struct Bts700xHwConfig_t
+{
+ uint8_t led1; /**< Shield LED 1 pin */
+ uint8_t led2; /**< Shield LED 2 pin */
+ uint8_t led3; /**< Shield LED 3 pin */
+ uint8_t led4; /**< Shield LED 4 pin */
+
+ uint8_t in1; /**< Switch 1 input pin */
+ uint8_t in2; /**< Switch 2 input pin */
+ uint8_t in3; /**< Switch 3 input pin */
+ uint8_t in4; /**< Switch 4 input pin */
+
+ uint8_t oloff; /**< Output offset pin */
+
+ uint8_t den1_den3; /**< Shared diagnosis enable switches 1 and 3 pin*/
+ uint8_t den2_den4; /**< Shared diagnosis enable switches 2 and 4 pin */
+
+ uint8_t pushButtonDigital; /**< Digital push button pin */
+
+ uint8_t pushButtonAnalog; /**< Analog push button pin */
+ uint8_t vBat; /**< Battery voltage pin */
+ uint8_t is1_is2; /**< Shared diagnosis current pin switches 1 and 3 */
+ uint8_t is3_is4; /**< Shared diagnosis current pin switches 2 and 4 */
+};
+
+/**
+ * @brief BTS700x Shield Default Pin Configuration
+ */
+extern Bts700xHwConfig_t BTS700X_HWCONFIG;
+
+/**
+ * @brief BTS5001x Shield Pin Configuration
+ */
+struct BTS5001xHwConfig_t
+{
+ uint8_t led2; /**< Shield LED 2 pin */
+ uint8_t led3; /**< Shield LED 3 pin */
+
+ uint8_t in; /**< Switch input pin */
+
+ uint8_t pushButtonAnalog; /**< Analog push button pin */
+
+ uint8_t vBat; /**< Analog push button pin */
+
+ uint8_t is; /**< Diagnosis current pin */
+};
+
+/**
+ * @brief BTS5001x Shield Default Pin Configuration
+ */
+extern BTS5001xHwConfig_t BTS5001X_HWCONFIG;
+
+/**
+ * @brief BTT60xx Shield Pin Configuration
+ */
+struct Btt60xxHwConfig_t
+{
+ //Profet0 - BTT6030 (2 channel) pin config
+ uint8_t in0_0; /**< Switch 0 channel 0 input pin */
+ uint8_t den_0; /**< Switch 0 diagnosis enable pin */
+ uint8_t dsel_0; /**< Switch 0 diagnosis select pin */
+ uint8_t in1_0; /**< Switch 0 channel 1 input pin */
+ uint8_t is_0; /**< Switch 0 diagnosis current pin */
+
+ //Profet1 - BTT6030 (2 channel) pin config
+ uint8_t in0_1; /**< Switch 1 channel 0 input pin */
+ uint8_t den_1; /**< Switch 1 diagnosis enable pin */
+ uint8_t dsel_1; /**< Switch 1 diagnosis select pin */
+ uint8_t in1_1; /**< Switch 1 channel 1 input pin */
+ uint8_t is_1; /**< Switch 1 diagnosis current pin */
+
+ //Profet2 - BTT6020 (1 channel) pin config
+ uint8_t in0_2; /**< Switch 2 input pin */
+ uint8_t den_2; /**< Switch 2 diagnosis enable pin */
+ uint8_t is_2; /**< Switch 2 diagnosis current pin */
+
+};
+
+/**
+ * @brief BTT60xx Shield Default Pin Configuration
+ */
+extern Btt60xxHwConfig_t BTT60XX_HWCONFIG;
+
+/** @} */
+
+}
+
+#endif /** HSS_SHIELD_PLATF_HPP_ **/
\ No newline at end of file
diff --git a/src/hss-arduino.cpp b/src/hss-arduino.cpp
deleted file mode 100644
index cc01827..0000000
--- a/src/hss-arduino.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * @file hss-arduino.cpp
- * @brief Definition of the High-Side-Switch in Arduino
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "hss-arduino.hpp"
-#include
-
-/**
- * @brief Constructor of the Arduino High-Side-Switch class
- *
- * This functions is the default constructor of the Arduino High-Side-Switch class.
- * There are different variants of the High-Side-Switch, therefore you have to chose one.
- *
- * @param[in] den Pin number of the diagnostic enable pin
- * @param[in] in Pin number of the input pin
- * @param[in] is Pin number of the sense current output
- * @param[in] variant Variant identifier (see variants.cpp)
- */
-HssIno::HssIno(uint8_t den, uint8_t in, uint8_t is, BtsVariants_t *variant)
-{
- HssIno::den = new GPIOIno(den, OUTPUT, GPIOIno::POSITIVE);
- HssIno::in = new GPIOIno(in, OUTPUT, GPIOIno::POSITIVE);
- HssIno::is = new ADCIno(is);
- HssIno::btsVariant = variant;
- HssIno::timer = new TimerIno();
-}
-
-/**
- * @brief Destructor of the Arduino High-Side-Switch
- *
- */
-HssIno::~HssIno()
-{
-
-}
\ No newline at end of file
diff --git a/src/hss-arduino.hpp b/src/hss-arduino.hpp
deleted file mode 100644
index 24f0f7e..0000000
--- a/src/hss-arduino.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * @file hss-arduino.hpp
- * @brief Definition of the High-Side-Switch Class in Arduino
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef HSS_ARDUINO_H_
-#define HSS_ARDUINO_H_
-
-#include "corelib/hss.hpp"
-#include "framework/arduino/pal/gpio-arduino.hpp"
-#include "framework/arduino/pal/adc-arduino.hpp"
-#include "framework/arduino/pal/timer-arduino.hpp"
-
-/**
- * @brief Arduino class of the High-Side-Swich
- *
- */
-class HssIno : public Hss
-{
- public:
- HssIno(uint8_t den, uint8_t in, uint8_t is, BtsVariants_t *variant);
- ~HssIno();
-};
-
-#endif /** HSS_ARDUINO_H_ **/
\ No newline at end of file
diff --git a/src/hss-board-arduino.cpp b/src/hss-board-arduino.cpp
deleted file mode 100644
index 92c3854..0000000
--- a/src/hss-board-arduino.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * @file hss-board-arduino.cpp
- * @brief Definition of the High-Side-Switch-Board class functions in Arduino
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "Arduino.h"
-#include "hss-board-arduino.hpp"
-
-/**
- * @brief Default constructor of the Arduino High-Side-Switch-Board
- *
- * This default constructor defines all necessary things for the Profet-Shield.
- * He is meant for all controllers that support the Arduino-Uno form factor.
- * But it is still necessary to chose the variant of the High-Side-Switch.
- *
- * @param[in] variantSel Variant of the High-Side-Switch(see variants.cpp)
- */
-HssBoardIno::HssBoardIno(BtsVariants_t *variantSel)
-{
- led1 = ((ARDUINO_UNO.led1 == GPIOIno::unusedPin) ? NULL : new GPIOIno(ARDUINO_UNO.led1, OUTPUT, GPIOIno::POSITIVE));
- led2 = ((ARDUINO_UNO.led2 == GPIOIno::unusedPin) ? NULL : new GPIOIno(ARDUINO_UNO.led2, OUTPUT, GPIOIno::POSITIVE));
- led3 = ((ARDUINO_UNO.led3 == GPIOIno::unusedPin) ? NULL : new GPIOIno(ARDUINO_UNO.led3, OUTPUT, GPIOIno::POSITIVE));
- led4 = ((ARDUINO_UNO.led4 == GPIOIno::unusedPin) ? NULL : new GPIOIno(ARDUINO_UNO.led4, OUTPUT, GPIOIno::POSITIVE));
-
- hss1 = new HssIno(ARDUINO_UNO.den1_den3, ARDUINO_UNO.in1, ARDUINO_UNO.is1_is2, variantSel);
- hss2 = new HssIno(ARDUINO_UNO.den2_den4, ARDUINO_UNO.in2, ARDUINO_UNO.is1_is2, variantSel);
- hss3 = new HssIno(ARDUINO_UNO.den1_den3, ARDUINO_UNO.in3, ARDUINO_UNO.is3_is4, variantSel);
- hss4 = new HssIno(ARDUINO_UNO.den2_den4, ARDUINO_UNO.in4, ARDUINO_UNO.is3_is4, variantSel);
-
- timer = new TimerIno();
-
- oloff = new GPIOIno(ARDUINO_UNO.oloff, OUTPUT, GPIOIno::POSITIVE);
- pushButtonDigital = new GPIOIno(ARDUINO_UNO.pushButtonDigital, INPUT_PULLUP, GPIOIno::POSITIVE);
-
- pushButtonAnalog = new ADCIno(ARDUINO_UNO.pushButtonAnalog);
- vBat = new ADCIno(ARDUINO_UNO.vBat);
-}
-
-/**
- * @brief Constructor of the Arduino High-Side-Switch-Board
- *
- * This constructor can be used in case of an other board the boards that
- * support the Arduino form factor or if the board is modified.
- *
- * @param variantSel
- * @param config
- */
-HssBoardIno::HssBoardIno(BtsVariants_t *variantSel, hardwareconfig_t config)
-{
- led1 = ((config.led1 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led1, OUTPUT, GPIOIno::POSITIVE));
- led2 = ((config.led2 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led2, OUTPUT, GPIOIno::POSITIVE));
- led3 = ((config.led3 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led3, OUTPUT, GPIOIno::POSITIVE));
- led4 = ((config.led4 == GPIOIno::unusedPin) ? NULL : new GPIOIno(config.led4, OUTPUT, GPIOIno::POSITIVE));
-
- hss1 = new HssIno(config.den1_den3, config.in1, config.is1_is2, variantSel);
- hss2 = new HssIno(config.den2_den4, config.in2, config.is1_is2, variantSel);
- hss3 = new HssIno(config.den1_den3, config.in3, config.is3_is4, variantSel);
- hss4 = new HssIno(config.den2_den4, config.in4, config.is3_is4, variantSel);
-
- timer = new TimerIno();
-
- oloff = new GPIOIno(config.oloff, OUTPUT, GPIOIno::POSITIVE);
- pushButtonDigital = new GPIOIno(config.pushButtonDigital, INPUT_PULLUP, GPIOIno::POSITIVE);
-
- pushButtonAnalog = new ADCIno(config.pushButtonAnalog);
- vBat = new ADCIno(config.vBat);
-}
-
-/**
- * @brief Destructor of the Arduino High-Side-Switch-Board
- *
- */
-HssBoardIno::~HssBoardIno()
-{
-
-}
-
-
-
diff --git a/src/hss-board-arduino.hpp b/src/hss-board-arduino.hpp
deleted file mode 100644
index 4c7aae7..0000000
--- a/src/hss-board-arduino.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * @file hss-board-arduino.hpp
- * @brief Definition of the High-Side-Switch-Board class in Arduino
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef HSS_BOARD_ARDUINO_HPP_
-#define HSS_BOARD_ARDUINO_HPP_
-
-#include "corelib/hss-board.hpp"
-#include "hss-arduino.hpp"
-#include "framework/arduino/wrapper/config.hpp"
-
-/**
- * @brief Arduino Class of the High-Side-Switch-Board
- *
- */
-class HssBoardIno : public HssBoard
-{
- public:
-
- HssBoardIno(BtsVariants_t *variantSel);
- HssBoardIno(BtsVariants_t *variantSel, hardwareconfig_t config);
- ~HssBoardIno();
-};
-
-#endif /** HSS_BOARD_ARDUINO_HPP_ **/
\ No newline at end of file
diff --git a/src/pal/adc.cpp b/src/pal/adc.cpp
deleted file mode 100644
index 40c0020..0000000
--- a/src/pal/adc.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * @file adc.cpp
- * @brief PAL of the ADC
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "adc.hpp"
-
-AnalogDigitalConverter::Error_t AnalogDigitalConverter::checkErrorStatus()
-{
- return errorStatus;
-}
\ No newline at end of file
diff --git a/src/pal/adc.hpp b/src/pal/adc.hpp
deleted file mode 100644
index 4aba1b8..0000000
--- a/src/pal/adc.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @file adc.hpp
- * @brief PAL of the ADC
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef AnalogDigitalConverter_HPP_
-#define AnalogDigitalConverter_HPP_
-
-#include
-
-/**
- * @addtogroup hssPal
- * @{
- */
-
-class AnalogDigitalConverter
-{
- public:
-
- enum Error_t
- {
- OK = 0, /**< No error */
- INTF_ERROR = -1, /**< Interface error */
- CONF_ERROR = -2, /**< Configuration error */
- READ_ERROR = -3, /**< Read error */
- WRITE_ERROR = -4, /**< Write error */
- };
-
- virtual Error_t init() = 0;
- virtual Error_t deinit() = 0;
- virtual Error_t enable() = 0;
- virtual Error_t disable() = 0;
- virtual Error_t setReadResolution(uint8_t resolution) = 0;
- virtual Error_t setWriteResolution(uint8_t resolution) = 0;
- virtual uint16_t ADCRead() = 0;
- virtual Error_t ADCWrite(uint8_t value) = 0;
- Error_t checkErrorStatus();
-
- private:
-
- Error_t errorStatus;
-};
-/** @} */
-
-#endif /** AnalogDigitalConverter_HPP_ **/
-
-
diff --git a/src/pal/gpio.cpp b/src/pal/gpio.cpp
deleted file mode 100644
index ca8c7ac..0000000
--- a/src/pal/gpio.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @file gpio.cpp
- * @brief PAL of the GPIO
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "gpio.hpp"
-
-
-GPIO::Error_t GPIO::checkErrorStatus()
-{
- return errorStatus;
-}
\ No newline at end of file
diff --git a/src/pal/hss-pal-adc.hpp b/src/pal/hss-pal-adc.hpp
new file mode 100644
index 0000000..77b1802
--- /dev/null
+++ b/src/pal/hss-pal-adc.hpp
@@ -0,0 +1,90 @@
+/**
+ * @file hss-pal-adc.hpp
+ * @brief ADC platform abstraction layer class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef HSS_PAL_ADC_HPP_
+#define HSS_PAL_ADC_HPP_
+
+#include
+#include "hss-types.hpp"
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssPal
+ * @{
+ */
+
+/**
+ * @class ADCPAL
+ * @brief ADC abstract API
+ */
+class ADCPAL
+{
+ public:
+
+ /**
+ * @brief Initializes the ADC
+ * @return High-side switch error code
+ */
+ virtual Error_t init() = 0;
+
+ /**
+ * @brief Deinitializes the ADC
+ * @return High-side switch error code
+ */
+ virtual Error_t deinit() = 0;
+
+ /**
+ * @brief Enable the ADC
+ * @return High-side switch error code
+ */
+ virtual Error_t enable() = 0;
+
+ /**
+ * @brief Disable the ADC
+ * @return High-side switch error code
+ */
+ virtual Error_t disable() = 0;
+
+ /**
+ * @brief Set the read resolution of the ADC
+ * @param[in] resolution Desired read resolution of the ADC
+ * @return High-side switch error code
+ */
+ virtual Error_t setReadResolution(uint8_t resolution) = 0;
+
+ /**
+ * @brief Set the write resolution of the ADC
+ * @param[in] resolution Desired write resolution of the ADC
+ * @return High-side switch error code
+ */
+ virtual Error_t setWriteResolution(uint8_t resolution) = 0;
+
+ /**
+ * @brief Reads the analog value on the ADC
+ * @return Analog value of the ADC (uint16_t)
+ */
+ virtual uint16_t ADCRead() = 0;
+
+ /**
+ * @brief Write a desired analog value
+ * @param[in] value Desired analog value
+ * @return High-side switch error code
+ */
+ virtual Error_t ADCWrite(uint8_t value) = 0;
+
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_PAL_ADC_HPP_ **/
+
+
diff --git a/src/pal/gpio.hpp b/src/pal/hss-pal-gpio.hpp
similarity index 50%
rename from src/pal/gpio.hpp
rename to src/pal/hss-pal-gpio.hpp
index c0572c6..6d66f20 100644
--- a/src/pal/gpio.hpp
+++ b/src/pal/hss-pal-gpio.hpp
@@ -1,98 +1,90 @@
-/**
- * @file gpio.hpp
- * @brief PAL of the GPIO
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
+/**
+ * @file hss-pal-gpio.hpp
+ * @brief GPIO platform abstraction layer class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
* SPDX-License-Identifier: MIT
*/
+#ifndef HSS_PAL_GPIO_HPP_
+#define HSS_PAL_GPIO_HPP_
+
#include
+#include "hss-types.hpp"
-#ifndef GPIO_HPP_
-#define GPIO_HPP_
+namespace hss
+{
/**
- * @addtogroup hssPal
+ * @addtogroup hssPal
* @{
*/
-class GPIO
+/**
+ * @class GPIOPAL
+ * @brief GPIO abstract API
+ */
+class GPIOPAL
{
public:
-
- enum Error_t
- {
- OK = 0, /**< No error */
- INTF_ERROR = -1, /**< Interface error */
- CONF_ERROR = -2, /**< Configuration error */
- READ_ERROR = -3, /**< Read error */
- WRITE_ERROR = -4, /**< Write error */
- };
/**
- * @name Interrupt event
- * @{
+ * @brief Interrupt event
*/
enum IntEvent_t
{
INT_FALLING_EDGE = 0, /**< Interrupt on falling edge */
INT_RISING_EDGE = 1, /**< Interrupt on rising edge */
};
- /** @} */
-
+
/**
- * @name Voltage level
- * @{
+ * @brief Voltage level
*/
enum VLevel_t
{
GPIO_LOW = 0, /**< Level low */
GPIO_HIGH = 1 /**< Level high */
- };
- /** @} */
-
+ };
+
/**
- * @name Voltage logic
- * @{
+ * @brief Voltage logic
*/
enum VLogic_t
{
NEGATIVE = 1, /**< Negative logic. 0 on voltage level high, 1 on voltage low */
POSITIVE = 2, /**< Positive logic. 1 on voltage level high, 0 on voltage low */
};
- /** @} */
/**
* @brief Initializes the GPIO
- * @return GPIO error code
- * @retval OK if success
- * @retval INIT_ERROR if initialization error
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If initialization error
*/
virtual Error_t init () = 0;
-
+
/**
* @brief Deinitializes the GPIO
- * @return GPIO error code
- * @retval OK if success
- * @retval INIT_ERROR if deinitialization error
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If deinitialization error
*/
virtual Error_t deinit () = 0;
/**
* @brief Reads the GPIO voltage level
- * @return GPIO voltage level
- * @retval GPIO_LOW if voltage low
- * @retval GPIO_HIGH if voltage high
+ * @return VLevel_t
+ * @retval GPIO_LOW If voltage low
+ * @retval GPIO_HIGH If voltage high
*/
virtual VLevel_t read () = 0;
-
+
/**
* @brief Writes the GPIO output voltage level
* @param[in] level Voltage level
- * @return GPIO error code
- * @retval OK if success
- * @retval WRITE_ERROR if write error
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval WRITE_ERROR If write error
*/
virtual Error_t write (VLevel_t level) = 0;
@@ -100,9 +92,9 @@ class GPIO
* @brief Enables the GPIO output according to the GPIO logic
* - Low if negative
* - High if positive
- * @return GPIO interrupt event
- * @retval OK if success
- * @retval WRITE_ERROR if write error
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval WRITE_ERROR If write error
*/
virtual Error_t enable () = 0;
@@ -110,19 +102,16 @@ class GPIO
* @brief Disables the GPIO output according to the GPIO logic
* - Low if positive
* - High if negative
- * @return GPIO error code
- * @retval OK if success
- * @retval WRITE_ERROR if write error
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval WRITE_ERROR If write error
*/
virtual Error_t disable () = 0;
- Error_t checkErrorStatus();
-
- private:
- Error_t errorStatus;
-
};
-/** @} */
+/** @} */
+
+}
-#endif /** GPIO_HPP_ **/
\ No newline at end of file
+#endif /** HSS_PAL_GPIO_HPP_ **/
\ No newline at end of file
diff --git a/src/pal/hss-pal-timer.hpp b/src/pal/hss-pal-timer.hpp
new file mode 100644
index 0000000..b865fbc
--- /dev/null
+++ b/src/pal/hss-pal-timer.hpp
@@ -0,0 +1,96 @@
+/**
+ * @file hss-pal-timer.hpp
+ * @brief Timer platform abstraction layer class
+ * @copyright Copyright (c) 2021 Infineon Technologies AG
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include
+#include "hss-types.hpp"
+
+#ifndef HSS_PAL_TIMER_HPP_
+#define HSS_PAL_TIMER_HPP_
+
+namespace hss
+{
+
+/**
+ * @addtogroup hssPal
+ * @{
+ */
+
+/**
+ * @class TimerPAL
+ * @brief Timer abstract API
+ */
+class TimerPAL
+{
+ public:
+
+ /**
+ * @brief Initialize the timer
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If hardware interface error
+ */
+ virtual Error_t init () = 0;
+
+ /**
+ * @brief Deinitialize the timer
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If hardware interface error
+ */
+ virtual Error_t deinit () = 0;
+
+ /**
+ * @brief Starts the timer
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If hardware interface error
+ */
+ virtual Error_t start () = 0;
+
+ /**
+ * @brief Elapsed time since the timer was started
+ * @param[out] elapsed Time in milliseconds
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If hardware interface error
+ */
+ virtual Error_t elapsed (uint32_t &elapsed) = 0;
+
+ /**
+ * @brief Stops the timer
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If hardware interface error
+ */
+ virtual Error_t stop () = 0;
+
+ /**
+ * @brief Introduces a delay during the specified time
+ * @param[in] timeout Delay time in milliseconds
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If hardware interface error
+ */
+ virtual Error_t delayMilli (uint32_t timeout) = 0;
+
+ /**
+ * @brief Introduces a delay during the specified time
+ * @param[in] timeout Delay time in microseconds
+ * @return High-side switch error code
+ * @retval OK If success
+ * @retval INIT_ERROR If hardware interface error
+ */
+ virtual Error_t delayMicro (uint32_t timeout) = 0;
+
+};
+
+/** @} */
+
+}
+
+#endif /** HSS_PAL_TIMER_HPP_ **/
diff --git a/src/pal/timer.hpp b/src/pal/timer.hpp
deleted file mode 100644
index b9f1afb..0000000
--- a/src/pal/timer.hpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * @file timer.hpp
- * @brief Timer Platform Abstraction Layer
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include
-
-#ifndef TIMER_HPP_
-#define TIMER_HPP_
-
-/**
- * @addtogroup hssPal
- * @{
- */
-
-class Timer
-{
- public:
-
- enum Error_t
- {
- OK = 0, /**< No error */
- INTF_ERROR = -1, /**< Interface error */
- CONF_ERROR = -2, /**< Configuration error */
- };
-
- /**
- * @brief Initialize the timer
- * @return Timer error code
- * @retval OK if success
- * @retval INIT_ERROR if hardware interface error
- */
- virtual Error_t init () = 0;
-
- /**
- * @brief Deinitialize the timer
- * @return Timer error code
- * @retval OK if success
- * @retval INIT_ERROR if hardware interface error
- */
- virtual Error_t deinit () = 0;
-
- /**
- * @brief Starts the timer
- * @return Timer error code
- * @retval OK if success
- * @retval INIT_ERROR if hardware interface error
- */
- virtual Error_t start () = 0;
-
- /**
- * @brief Elapsed time since the timer was started
- * @param[out] elapsed Time in milliseconds
- * @return Timer error code
- * @retval OK if success
- * @retval INIT_ERROR if hardware interface error
- */
- virtual Error_t elapsed (uint32_t &elapsed) = 0;
-
- /**
- * @brief Stops the timer
- * @return Timer error code
- * @retval OK if success
- * @retval INIT_ERROR if hardware interface error
- */
- virtual Error_t stop () = 0;
-
- /**
- * @brief Introduces a delay during the specified time
- * @param[in] timeout Delay time in milliseconds
- * @return Timer error code
- * @retval OK if success
- * @retval INIT_ERROR if hardware interface error
- */
- virtual Error_t delayMilli (uint32_t timeout) = 0;
-
- /**
- * @brief Introduces a delay during the specified time
- * @param[in] timeout Delay time in microseconds
- * @return Timer error code
- * @retval OK if success
- * @retval INIT_ERROR if hardware interface error
- */
- virtual Error_t delayMicro (uint32_t timeout) = 0;
-};
-
-/** @} */
-
-#endif /** HALL_PAL_TIMER_HPP_ **/
diff --git a/src/utils/filter.cpp b/src/utils/filter.cpp
deleted file mode 100644
index 27ed3d1..0000000
--- a/src/utils/filter.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @file filter.cpp
- * @brief Definition of the filter class functions
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "filter.hpp"
-
-ExponentialFilter::ExponentialFilter()
-{
- this->y = 0.0;
- this->y_last = 0.0;
- this->x = 0.0;
- this->tau = 1;
-}
-
-ExponentialFilter::ExponentialFilter(float y)
-{
- this->y = y;
- this->y_last = y;
- this->x = y;
-}
-
-ExponentialFilter::ExponentialFilter(float y, uint16_t t)
-{
- this->y = y;
- this->y_last = y;
- this->x = y;
- this->tau = pow2(t);
-}
-
-void ExponentialFilter::setFilter(float y, uint16_t t)
-{
- this->y = y;
- this->y_last = y;
- this->x = y;
- this->tau = pow2(t);
-}
-
-void ExponentialFilter::setTau(uint16_t t)
-{
- this->tau = pow2(t);
-}
-
-void ExponentialFilter::setToNewValue(float y)
-{
- this->y = y_last = x = y;
-}
-
-float ExponentialFilter::input(float x)
-{
- y_last = y;
- this->x = x;
-
- y = y_last + ((x - y_last)/(float)tau);
-}
-
-float ExponentialFilter::output()
-{
- return y;
-}
-
-uint16_t ExponentialFilter::pow2(uint16_t p)
-{
- return 1<< p;
-}
-
diff --git a/src/utils/filter.hpp b/src/utils/filter.hpp
deleted file mode 100644
index b4d1a20..0000000
--- a/src/utils/filter.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @file filter.hpp
- * @brief Definition of the filter class
- * @date May 2020
- * @copyright Copyright (c) 2019-2020 Infineon Technologies AG
- *
- * SPDX-License-Identifier: MIT
- */
-
-#ifndef FILTER_H_
-#define FILTER_H_
-
-#include
-
-/**
- * @addtogroup hssUtils
- * @{
- */
-
-
-class ExponentialFilter
-{
- public:
-
- ExponentialFilter();
- ExponentialFilter(float y);
- ExponentialFilter(float y, uint16_t t);
-
- void setFilter(float y, uint16_t t);
- void setTau(uint16_t t);
- void setToNewValue(float y);
- float input(float x);
- float output();
- uint16_t pow2(uint16_t p);
-
- private:
- uint16_t tau;
-
- float y;
- float y_last;
- float x;
-};
-/** @} */
-
-#endif /** FILTER_H_ **/
\ No newline at end of file
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
deleted file mode 100644
index 7c5f518..0000000
--- a/test/CMakeLists.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-cmake_minimum_required(VERSION 3.12.4)
-
-set(prjtest high-side-switch-test)
-
-# Test Sources
-set(Sources
- test_high-side-switch.cpp
-)
-
-# GCOV Coverage Targets
-set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE ON)
-set(GCOV_FILES_DIR ${CMAKE_BINARY_DIR}/CMakeFiles/high-side-switch.dir/src)
-
-# Binary and Output Coverage Files
-file(GLOB_RECURSE GCOV_GNNO_GCDA_FILES ${CMAKE_BINARY_DIR}/*.gc??)
-
-# Coverage Target
-add_custom_target(gcov
- COMMAND ${CMAKE_COMMAND} -E make_directory coverage
- COMMAND ${CMAKE_MAKE_PROGRAM} test
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
- )
-
-# Coverage Command
-add_custom_command(TARGET gcov
- COMMAND ${CMAKE_COMMAND} -E echo "=================== GCOV ===================="
- COMMAND gcov -b -a ${CMAKE_SOURCE_DIR}/src/*.cpp -o ${GCOV_FILES_DIR}
- COMMAND gcov -b -a ${CMAKE_SOURCE_DIR}/src/corelib/*.c -o ${GCOV_FILES_DIR}/corelib
- COMMAND ${CMAKE_COMMAND} -E echo "-- Coverage files have been output to ${CMAKE_BINARY_DIR}/coverage"
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/coverage
- )
-
-# Coverage Clean
-add_custom_target(gcov_clean
- COMMAND ${CMAKE_COMMAND} -E remove -f ${GCOV_GNNO_GCDA_FILES}
- COMMAND ${CMAKE_COMMAND} -E remove_directory coverage
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-)
-
-add_dependencies(gcov ${prjtest})
-
-# Executable
-add_executable(${prjtest} ${Sources}) #${Headers})
-# Required Libraries
-target_link_libraries(${prjtest} PUBLIC
- gtest_main
- gmock_main
- high-side-switch
-)
-
-# Add Ctest
-add_test(
- NAME ${prjtest}
- COMMAND ${prjtest}
-)
\ No newline at end of file
diff --git a/test/fakes/fff.h b/test/fakes/fff.h
deleted file mode 100644
index d869cbd..0000000
--- a/test/fakes/fff.h
+++ /dev/null
@@ -1,6503 +0,0 @@
-/*
-LICENSE
-
-The MIT License (MIT)
-
-Copyright (c) 2010 Michael Long
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-/**
- * @version 1.0
- @tag https://github.com/meekrosoft/fff/releases/tag/v1.0
- @commit 995f26b
- */
-
-#ifndef FAKE_FUNCTIONS
-#define FAKE_FUNCTIONS
-
-#include
-#include /* For memset and memcpy */
-
-#define FFF_MAX_ARGS (20u)
-#ifndef FFF_ARG_HISTORY_LEN
- #define FFF_ARG_HISTORY_LEN (50u)
-#endif
-#ifndef FFF_CALL_HISTORY_LEN
- #define FFF_CALL_HISTORY_LEN (50u)
-#endif
-#ifndef FFF_GCC_FUNCTION_ATTRIBUTES
- #define FFF_GCC_FUNCTION_ATTRIBUTES
-#endif
-/* -- INTERNAL HELPER MACROS -- */
-#define SET_RETURN_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \
- FUNCNAME##_fake.return_val_seq = ARRAY_POINTER; \
- FUNCNAME##_fake.return_val_seq_len = ARRAY_LEN;
-#define SET_CUSTOM_FAKE_SEQ(FUNCNAME, ARRAY_POINTER, ARRAY_LEN) \
- FUNCNAME##_fake.custom_fake_seq = ARRAY_POINTER; \
- FUNCNAME##_fake.custom_fake_seq_len = ARRAY_LEN;
-
-/* Defining a function to reset a fake function */
-#define RESET_FAKE(FUNCNAME) { \
- FUNCNAME##_reset(); \
-} \
-
-
-#define DECLARE_ARG(type, n, FUNCNAME) \
- type arg##n##_val; \
- type arg##n##_history[FFF_ARG_HISTORY_LEN];
-
-#define DECLARE_ALL_FUNC_COMMON \
- unsigned int call_count; \
- unsigned int arg_history_len; \
- unsigned int arg_histories_dropped; \
-
-#define DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- RETURN_TYPE return_val_history[FFF_ARG_HISTORY_LEN];
-
-#define SAVE_ARG(FUNCNAME, n) \
- memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));
-
-#define ROOM_FOR_MORE_HISTORY(FUNCNAME) \
- FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN
-
-#define SAVE_RET_HISTORY(FUNCNAME, RETVAL) \
- if ((FUNCNAME##_fake.call_count - 1) < FFF_ARG_HISTORY_LEN) \
- memcpy((void *)&FUNCNAME##_fake.return_val_history[FUNCNAME##_fake.call_count - 1], (const void *) &RETVAL, sizeof(RETVAL)); \
-
-#define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \
- memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));
-
-#define HISTORY_DROPPED(FUNCNAME) \
- FUNCNAME##_fake.arg_histories_dropped++
-
-#define DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- RETURN_TYPE return_val; \
- int return_val_seq_len; \
- int return_val_seq_idx; \
- RETURN_TYPE * return_val_seq; \
-
-#define DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- int custom_fake_seq_len; \
- int custom_fake_seq_idx; \
-
-#define INCREMENT_CALL_COUNT(FUNCNAME) \
- FUNCNAME##_fake.call_count++
-
-#define RETURN_FAKE_RESULT(FUNCNAME) \
- if (FUNCNAME##_fake.return_val_seq_len){ /* then its a sequence */ \
- if(FUNCNAME##_fake.return_val_seq_idx < FUNCNAME##_fake.return_val_seq_len) { \
- SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx]) \
- return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_idx++]; \
- } \
- SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]) \
- return FUNCNAME##_fake.return_val_seq[FUNCNAME##_fake.return_val_seq_len-1]; /* return last element */ \
- } \
- SAVE_RET_HISTORY(FUNCNAME, FUNCNAME##_fake.return_val) \
- return FUNCNAME##_fake.return_val; \
-
-#ifdef __cplusplus
- #define FFF_EXTERN_C extern "C"{
- #define FFF_END_EXTERN_C }
-#else /* ansi c */
- #define FFF_EXTERN_C
- #define FFF_END_EXTERN_C
-#endif /* cpp/ansi c */
-
-#define DEFINE_RESET_FUNCTION(FUNCNAME) \
- void FUNCNAME##_reset(void){ \
- memset(&FUNCNAME##_fake, 0, sizeof(FUNCNAME##_fake)); \
- FUNCNAME##_fake.arg_history_len = FFF_ARG_HISTORY_LEN; \
- }
-/* -- END INTERNAL HELPER MACROS -- */
-
-typedef void (*fff_function_t)(void);
-typedef struct {
- fff_function_t call_history[FFF_CALL_HISTORY_LEN];
- unsigned int call_history_idx;
-} fff_globals_t;
-
-FFF_EXTERN_C
-extern fff_globals_t fff;
-FFF_END_EXTERN_C
-
-#define DEFINE_FFF_GLOBALS \
- FFF_EXTERN_C \
- fff_globals_t fff; \
- FFF_END_EXTERN_C
-
-#define FFF_RESET_HISTORY() \
- fff.call_history_idx = 0; \
- memset(fff.call_history, 0, sizeof(fff.call_history));
-
-#define REGISTER_CALL(function) \
- if(fff.call_history_idx < FFF_CALL_HISTORY_LEN) \
- fff.call_history[fff.call_history_idx++] = (fff_function_t)function;
-
-#define DECLARE_FAKE_VOID_FUNC0(FUNCNAME) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(void); \
- void(**custom_fake_seq)(void); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void); \
-
-#define DEFINE_FAKE_VOID_FUNC0(FUNCNAME) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void){ \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC0(FUNCNAME) \
- DECLARE_FAKE_VOID_FUNC0(FUNCNAME) \
- DEFINE_FAKE_VOID_FUNC0(FUNCNAME) \
-
-
-#define DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0); \
- void(**custom_fake_seq)(ARG0_TYPE arg0); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0); \
-
-#define DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0){ \
- SAVE_ARG(FUNCNAME, 0); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
- DECLARE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
- DEFINE_FAKE_VOID_FUNC1(FUNCNAME, ARG0_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1); \
-
-#define DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- DECLARE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- DEFINE_FAKE_VOID_FUNC2(FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
-
-#define DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- DECLARE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- DEFINE_FAKE_VOID_FUNC3(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
-
-#define DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- DECLARE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- DEFINE_FAKE_VOID_FUNC4(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
-
-#define DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- DECLARE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- DEFINE_FAKE_VOID_FUNC5(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
-
-#define DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- DECLARE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- DEFINE_FAKE_VOID_FUNC6(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
-
-#define DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- DECLARE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- DEFINE_FAKE_VOID_FUNC7(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
-
-#define DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- DECLARE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- DEFINE_FAKE_VOID_FUNC8(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
-
-#define DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- DECLARE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- DEFINE_FAKE_VOID_FUNC9(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
-
-#define DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- DECLARE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- DEFINE_FAKE_VOID_FUNC10(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
-
-#define DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- DECLARE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- DEFINE_FAKE_VOID_FUNC11(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
-
-#define DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- DECLARE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- DEFINE_FAKE_VOID_FUNC12(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
-
-#define DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- DECLARE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- DEFINE_FAKE_VOID_FUNC13(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
-
-#define DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- DECLARE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- DEFINE_FAKE_VOID_FUNC14(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
-
-#define DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- DECLARE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- DEFINE_FAKE_VOID_FUNC15(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
-
-#define DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- DECLARE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- DEFINE_FAKE_VOID_FUNC16(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
-
-#define DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- DECLARE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- DEFINE_FAKE_VOID_FUNC17(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
-
-#define DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- DECLARE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- DEFINE_FAKE_VOID_FUNC18(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
-
-#define DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- SAVE_ARG(FUNCNAME, 18); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- SAVE_ARG_HISTORY(FUNCNAME, 18); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- DECLARE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- DEFINE_FAKE_VOID_FUNC19(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
- DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
-
-#define DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- SAVE_ARG(FUNCNAME, 18); \
- SAVE_ARG(FUNCNAME, 19); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- SAVE_ARG_HISTORY(FUNCNAME, 18); \
- SAVE_ARG_HISTORY(FUNCNAME, 19); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
- } \
- else{ \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- DECLARE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- DEFINE_FAKE_VOID_FUNC20(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(void); \
- RETURN_TYPE(**custom_fake_seq)(void); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void); \
-
-#define DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void){ \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
- DECLARE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
- DEFINE_FAKE_VALUE_FUNC0(RETURN_TYPE, FUNCNAME) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0); \
-
-#define DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0){ \
- SAVE_ARG(FUNCNAME, 0); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
- DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
- DEFINE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1); \
-
-#define DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- DECLARE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
- DEFINE_FAKE_VALUE_FUNC2(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2); \
-
-#define DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- DECLARE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
- DEFINE_FAKE_VALUE_FUNC3(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3); \
-
-#define DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- DECLARE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
- DEFINE_FAKE_VALUE_FUNC4(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4); \
-
-#define DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- DECLARE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
- DEFINE_FAKE_VALUE_FUNC5(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5); \
-
-#define DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- DECLARE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
- DEFINE_FAKE_VALUE_FUNC6(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6); \
-
-#define DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- DECLARE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
- DEFINE_FAKE_VALUE_FUNC7(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7); \
-
-#define DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- DECLARE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
- DEFINE_FAKE_VALUE_FUNC8(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8); \
-
-#define DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- DECLARE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
- DEFINE_FAKE_VALUE_FUNC9(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9); \
-
-#define DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- DECLARE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
- DEFINE_FAKE_VALUE_FUNC10(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10); \
-
-#define DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- DECLARE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
- DEFINE_FAKE_VALUE_FUNC11(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11); \
-
-#define DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- DECLARE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
- DEFINE_FAKE_VALUE_FUNC12(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12); \
-
-#define DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- DECLARE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
- DEFINE_FAKE_VALUE_FUNC13(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13); \
-
-#define DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- DECLARE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
- DEFINE_FAKE_VALUE_FUNC14(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14); \
-
-#define DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- DECLARE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
- DEFINE_FAKE_VALUE_FUNC15(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15); \
-
-#define DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- DECLARE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
- DEFINE_FAKE_VALUE_FUNC16(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16); \
-
-#define DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- DECLARE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
- DEFINE_FAKE_VALUE_FUNC17(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17); \
-
-#define DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- DECLARE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
- DEFINE_FAKE_VALUE_FUNC18(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18); \
-
-#define DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- SAVE_ARG(FUNCNAME, 18); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- SAVE_ARG_HISTORY(FUNCNAME, 18); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- DECLARE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
- DEFINE_FAKE_VALUE_FUNC19(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
- DECLARE_ARG(ARG19_TYPE, 19, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19); \
-
-#define DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ARG19_TYPE arg19){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- SAVE_ARG(FUNCNAME, 18); \
- SAVE_ARG(FUNCNAME, 19); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- SAVE_ARG_HISTORY(FUNCNAME, 18); \
- SAVE_ARG_HISTORY(FUNCNAME, 19); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- else{ \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
- } \
- } \
- if (FUNCNAME##_fake.custom_fake) return FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- DECLARE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
- DEFINE_FAKE_VALUE_FUNC20(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ARG19_TYPE) \
-
-
-#define DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg0); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg0); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg0); \
- FUNCNAME##_fake.custom_fake(arg0, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC2_VARARG(FUNCNAME, ARG0_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg1); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg1); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg1); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC3_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg2); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg2); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg2); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC4_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg3); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg3); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg3); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC5_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg4); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg4); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg4); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC6_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg5); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg5); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg5); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC7_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg6); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg6); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg6); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC8_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg7); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg7); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg7); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC9_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg8); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg8); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg8); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC10_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg9); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg9); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg9); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC11_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg10); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg10); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg10); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC12_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg11); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg11); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg11); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC13_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg12); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg12); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg12); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC14_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg13); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg13); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg13); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC15_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg14); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg14); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg14); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC16_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg15); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg15); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg15); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC17_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg16); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg16); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg16); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC18_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg17); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg17); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg17); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC19_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- void(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
- void(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...); \
-
-#define DEFINE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- void FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- SAVE_ARG(FUNCNAME, 18); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- SAVE_ARG_HISTORY(FUNCNAME, 18); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg18); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
- va_end(ap); \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg18); \
- FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
- va_end(ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- va_list ap; \
- va_start(ap, arg18); \
- FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
- va_end(ap); \
- } \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- DECLARE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- DEFINE_FAKE_VOID_FUNC20_VARARG(FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg0); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg0); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg0); \
- ret = FUNCNAME##_fake.custom_fake(arg0, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC2_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg1); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg1); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg1); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC3_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg2); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg2); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg2); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC4_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg3); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg3); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg3); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC5_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg4); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg4); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg4); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC6_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg5); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg5); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg5); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC7_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg6); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg6); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg6); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC8_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg7); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg7); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg7); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC9_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg8); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg8); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg8); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC10_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg9); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg9); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg9); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC11_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg10); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg10); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg10); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC12_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg11); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg11); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg11); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC13_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg12); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg12); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg12); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC14_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg13); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg13); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg13); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC15_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg14); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg14); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg14); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC16_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg15); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg15); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg15); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC17_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg16); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg16); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg16); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC18_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg17); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg17); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg17); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC19_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ...) \
-
-
-#define DECLARE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- typedef struct FUNCNAME##_Fake { \
- DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
- DECLARE_ARG(ARG1_TYPE, 1, FUNCNAME) \
- DECLARE_ARG(ARG2_TYPE, 2, FUNCNAME) \
- DECLARE_ARG(ARG3_TYPE, 3, FUNCNAME) \
- DECLARE_ARG(ARG4_TYPE, 4, FUNCNAME) \
- DECLARE_ARG(ARG5_TYPE, 5, FUNCNAME) \
- DECLARE_ARG(ARG6_TYPE, 6, FUNCNAME) \
- DECLARE_ARG(ARG7_TYPE, 7, FUNCNAME) \
- DECLARE_ARG(ARG8_TYPE, 8, FUNCNAME) \
- DECLARE_ARG(ARG9_TYPE, 9, FUNCNAME) \
- DECLARE_ARG(ARG10_TYPE, 10, FUNCNAME) \
- DECLARE_ARG(ARG11_TYPE, 11, FUNCNAME) \
- DECLARE_ARG(ARG12_TYPE, 12, FUNCNAME) \
- DECLARE_ARG(ARG13_TYPE, 13, FUNCNAME) \
- DECLARE_ARG(ARG14_TYPE, 14, FUNCNAME) \
- DECLARE_ARG(ARG15_TYPE, 15, FUNCNAME) \
- DECLARE_ARG(ARG16_TYPE, 16, FUNCNAME) \
- DECLARE_ARG(ARG17_TYPE, 17, FUNCNAME) \
- DECLARE_ARG(ARG18_TYPE, 18, FUNCNAME) \
- DECLARE_ALL_FUNC_COMMON \
- DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
- DECLARE_RETURN_VALUE_HISTORY(RETURN_TYPE) \
- DECLARE_CUSTOM_FAKE_SEQ_VARIABLES \
- RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
- RETURN_TYPE(**custom_fake_seq)(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, va_list ap); \
- } FUNCNAME##_Fake; \
- extern FUNCNAME##_Fake FUNCNAME##_fake; \
- void FUNCNAME##_reset(void); \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...); \
-
-#define DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- FUNCNAME##_Fake FUNCNAME##_fake; \
- RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(ARG0_TYPE arg0, ARG1_TYPE arg1, ARG2_TYPE arg2, ARG3_TYPE arg3, ARG4_TYPE arg4, ARG5_TYPE arg5, ARG6_TYPE arg6, ARG7_TYPE arg7, ARG8_TYPE arg8, ARG9_TYPE arg9, ARG10_TYPE arg10, ARG11_TYPE arg11, ARG12_TYPE arg12, ARG13_TYPE arg13, ARG14_TYPE arg14, ARG15_TYPE arg15, ARG16_TYPE arg16, ARG17_TYPE arg17, ARG18_TYPE arg18, ...){ \
- SAVE_ARG(FUNCNAME, 0); \
- SAVE_ARG(FUNCNAME, 1); \
- SAVE_ARG(FUNCNAME, 2); \
- SAVE_ARG(FUNCNAME, 3); \
- SAVE_ARG(FUNCNAME, 4); \
- SAVE_ARG(FUNCNAME, 5); \
- SAVE_ARG(FUNCNAME, 6); \
- SAVE_ARG(FUNCNAME, 7); \
- SAVE_ARG(FUNCNAME, 8); \
- SAVE_ARG(FUNCNAME, 9); \
- SAVE_ARG(FUNCNAME, 10); \
- SAVE_ARG(FUNCNAME, 11); \
- SAVE_ARG(FUNCNAME, 12); \
- SAVE_ARG(FUNCNAME, 13); \
- SAVE_ARG(FUNCNAME, 14); \
- SAVE_ARG(FUNCNAME, 15); \
- SAVE_ARG(FUNCNAME, 16); \
- SAVE_ARG(FUNCNAME, 17); \
- SAVE_ARG(FUNCNAME, 18); \
- if(ROOM_FOR_MORE_HISTORY(FUNCNAME)){ \
- SAVE_ARG_HISTORY(FUNCNAME, 0); \
- SAVE_ARG_HISTORY(FUNCNAME, 1); \
- SAVE_ARG_HISTORY(FUNCNAME, 2); \
- SAVE_ARG_HISTORY(FUNCNAME, 3); \
- SAVE_ARG_HISTORY(FUNCNAME, 4); \
- SAVE_ARG_HISTORY(FUNCNAME, 5); \
- SAVE_ARG_HISTORY(FUNCNAME, 6); \
- SAVE_ARG_HISTORY(FUNCNAME, 7); \
- SAVE_ARG_HISTORY(FUNCNAME, 8); \
- SAVE_ARG_HISTORY(FUNCNAME, 9); \
- SAVE_ARG_HISTORY(FUNCNAME, 10); \
- SAVE_ARG_HISTORY(FUNCNAME, 11); \
- SAVE_ARG_HISTORY(FUNCNAME, 12); \
- SAVE_ARG_HISTORY(FUNCNAME, 13); \
- SAVE_ARG_HISTORY(FUNCNAME, 14); \
- SAVE_ARG_HISTORY(FUNCNAME, 15); \
- SAVE_ARG_HISTORY(FUNCNAME, 16); \
- SAVE_ARG_HISTORY(FUNCNAME, 17); \
- SAVE_ARG_HISTORY(FUNCNAME, 18); \
- } \
- else{ \
- HISTORY_DROPPED(FUNCNAME); \
- } \
- INCREMENT_CALL_COUNT(FUNCNAME); \
- REGISTER_CALL(FUNCNAME); \
- if (FUNCNAME##_fake.custom_fake_seq_len){ /* a sequence of custom fakes */ \
- if (FUNCNAME##_fake.custom_fake_seq_idx < FUNCNAME##_fake.custom_fake_seq_len){ \
- va_list ap; \
- va_start(ap, arg18); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_idx++](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- } \
- else{ \
- va_list ap; \
- va_start(ap, arg18); \
- RETURN_TYPE ret = FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- va_end(ap); \
- return ret; \
- return FUNCNAME##_fake.custom_fake_seq[FUNCNAME##_fake.custom_fake_seq_len-1](arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
- } \
- } \
- if(FUNCNAME##_fake.custom_fake){ \
- RETURN_TYPE ret; \
- va_list ap; \
- va_start(ap, arg18); \
- ret = FUNCNAME##_fake.custom_fake(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, ap); \
- va_end(ap); \
- SAVE_RET_HISTORY(FUNCNAME, ret); \
- return ret; \
- } \
- RETURN_FAKE_RESULT(FUNCNAME) \
- } \
- DEFINE_RESET_FUNCTION(FUNCNAME) \
-
-#define FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- DECLARE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
- DEFINE_FAKE_VALUE_FUNC20_VARARG(RETURN_TYPE, FUNCNAME, ARG0_TYPE, ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE, ARG6_TYPE, ARG7_TYPE, ARG8_TYPE, ARG9_TYPE, ARG10_TYPE, ARG11_TYPE, ARG12_TYPE, ARG13_TYPE, ARG14_TYPE, ARG15_TYPE, ARG16_TYPE, ARG17_TYPE, ARG18_TYPE, ...) \
-
-/* MSVC expand macro fix */
-#define EXPAND(x) x
-
-#define PP_NARG_MINUS2(...) EXPAND(PP_NARG_MINUS2_(__VA_ARGS__, PP_RSEQ_N_MINUS2()))
-
-#define PP_NARG_MINUS2_(...) EXPAND(PP_ARG_MINUS2_N(__VA_ARGS__))
-
-#define PP_ARG_MINUS2_N(returnVal, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N
-
-#define PP_RSEQ_N_MINUS2() 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
-
-#define PP_NARG_MINUS1(...) EXPAND(PP_NARG_MINUS1_(__VA_ARGS__, PP_RSEQ_N_MINUS1()))
-
-#define PP_NARG_MINUS1_(...) EXPAND(PP_ARG_MINUS1_N(__VA_ARGS__))
-
-#define PP_ARG_MINUS1_N( _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N
-
-#define PP_RSEQ_N_MINUS1() 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
-
-
-
-/* DECLARE AND DEFINE FAKE FUNCTIONS - PLACE IN TEST FILES */
-
-#define FAKE_VALUE_FUNC(...) EXPAND(FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
-
-#define FUNC_VALUE_(N,...) EXPAND(FUNC_VALUE_N(N,__VA_ARGS__))
-
-#define FUNC_VALUE_N(N,...) EXPAND(FAKE_VALUE_FUNC ## N(__VA_ARGS__))
-
-
-#define FAKE_VOID_FUNC(...) EXPAND(FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
-
-#define FUNC_VOID_(N,...) EXPAND(FUNC_VOID_N(N,__VA_ARGS__))
-
-#define FUNC_VOID_N(N,...) EXPAND(FAKE_VOID_FUNC ## N(__VA_ARGS__))
-
-
-#define FAKE_VALUE_FUNC_VARARG(...) EXPAND(FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
-
-#define FUNC_VALUE_VARARG_(N,...) EXPAND(FUNC_VALUE_VARARG_N(N,__VA_ARGS__))
-
-#define FUNC_VALUE_VARARG_N(N,...) EXPAND(FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__))
-
-
-#define FAKE_VOID_FUNC_VARARG(...) EXPAND(FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
-
-#define FUNC_VOID_VARARG_(N,...) EXPAND(FUNC_VOID_VARARG_N(N,__VA_ARGS__))
-
-#define FUNC_VOID_VARARG_N(N,...) EXPAND(FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__))
-
-
-
-/* DECLARE FAKE FUNCTIONS - PLACE IN HEADER FILES */
-
-#define DECLARE_FAKE_VALUE_FUNC(...) EXPAND(DECLARE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
-
-#define DECLARE_FUNC_VALUE_(N,...) EXPAND(DECLARE_FUNC_VALUE_N(N,__VA_ARGS__))
-
-#define DECLARE_FUNC_VALUE_N(N,...) EXPAND(DECLARE_FAKE_VALUE_FUNC ## N(__VA_ARGS__))
-
-
-#define DECLARE_FAKE_VOID_FUNC(...) EXPAND(DECLARE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
-
-#define DECLARE_FUNC_VOID_(N,...) EXPAND(DECLARE_FUNC_VOID_N(N,__VA_ARGS__))
-
-#define DECLARE_FUNC_VOID_N(N,...) EXPAND(DECLARE_FAKE_VOID_FUNC ## N(__VA_ARGS__))
-
-
-#define DECLARE_FAKE_VALUE_FUNC_VARARG(...) EXPAND(DECLARE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
-
-#define DECLARE_FUNC_VALUE_VARARG_(N,...) EXPAND(DECLARE_FUNC_VALUE_VARARG_N(N,__VA_ARGS__))
-
-#define DECLARE_FUNC_VALUE_VARARG_N(N,...) EXPAND(DECLARE_FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__))
-
-
-#define DECLARE_FAKE_VOID_FUNC_VARARG(...) EXPAND(DECLARE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
-
-#define DECLARE_FUNC_VOID_VARARG_(N,...) EXPAND(DECLARE_FUNC_VOID_VARARG_N(N,__VA_ARGS__))
-
-#define DECLARE_FUNC_VOID_VARARG_N(N,...) EXPAND(DECLARE_FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__))
-
-
-
-/* DEFINE FAKE FUNCTIONS - PLACE IN SOURCE FILES */
-
-#define DEFINE_FAKE_VALUE_FUNC(...) EXPAND(DEFINE_FUNC_VALUE_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
-
-#define DEFINE_FUNC_VALUE_(N,...) EXPAND(DEFINE_FUNC_VALUE_N(N,__VA_ARGS__))
-
-#define DEFINE_FUNC_VALUE_N(N,...) EXPAND(DEFINE_FAKE_VALUE_FUNC ## N(__VA_ARGS__))
-
-
-#define DEFINE_FAKE_VOID_FUNC(...) EXPAND(DEFINE_FUNC_VOID_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
-
-#define DEFINE_FUNC_VOID_(N,...) EXPAND(DEFINE_FUNC_VOID_N(N,__VA_ARGS__))
-
-#define DEFINE_FUNC_VOID_N(N,...) EXPAND(DEFINE_FAKE_VOID_FUNC ## N(__VA_ARGS__))
-
-
-#define DEFINE_FAKE_VALUE_FUNC_VARARG(...) EXPAND(DEFINE_FUNC_VALUE_VARARG_(PP_NARG_MINUS2(__VA_ARGS__), __VA_ARGS__))
-
-#define DEFINE_FUNC_VALUE_VARARG_(N,...) EXPAND(DEFINE_FUNC_VALUE_VARARG_N(N,__VA_ARGS__))
-
-#define DEFINE_FUNC_VALUE_VARARG_N(N,...) EXPAND(DEFINE_FAKE_VALUE_FUNC ## N ## _VARARG(__VA_ARGS__))
-
-
-#define DEFINE_FAKE_VOID_FUNC_VARARG(...) EXPAND(DEFINE_FUNC_VOID_VARARG_(PP_NARG_MINUS1(__VA_ARGS__), __VA_ARGS__))
-
-#define DEFINE_FUNC_VOID_VARARG_(N,...) EXPAND(DEFINE_FUNC_VOID_VARARG_N(N,__VA_ARGS__))
-
-#define DEFINE_FUNC_VOID_VARARG_N(N,...) EXPAND(DEFINE_FAKE_VOID_FUNC ## N ## _VARARG(__VA_ARGS__))
-
-
-
-
-#endif /* FAKE_FUNCTIONS */
diff --git a/test/test_high-side-switch.cpp b/test/test_high-side-switch.cpp
deleted file mode 100644
index a58c5ac..0000000
--- a/test/test_high-side-switch.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#include
-#include
-#include "../src/corelib/high-side-switch.h"
-
-using ::testing::Return;
-//using ::testing::Matcher;
-// using ::testing::NotNull;
-// using ::testing::Sequence;
-using ::testing::_;
-
-/**
- * Class High Side Switch Test Suite
- */
-class HSSwitchAPI: public ::testing::Test
-{
- public:
-
- HighSideSwitch hsswitch;
-
- void setUp()
- {
-
- }
-
- void TearDown()
- {
-
- }
-};
-
-TEST_F(HSSwitchAPI, checkBegin)
-{
- ASSERT_EQ(hsswitch.begin(),0);
-}
-
-
-
-/**
- * Mock Utility Class
- */
-// class MockUtility: public Utility
-// {
-// public:
-// MOCK_METHOD(char, someUtilFunction, (char a),(override));
-// };
-
-// TEST_F(ArduinoAPI, checkSomeFunctionError)
-// {
-// MockUtility mocku;
-
-// EXPECT_CALL(mocku, someUtilFunction(_))
-// .WillOnce(Return((char)'e'));
-
-// ASSERT_EQ(object.someFunction(mocku),1);
-// }
\ No newline at end of file
diff --git a/test/test_library.cpp b/test/test_library.cpp
deleted file mode 100644
index 18fc6c5..0000000
--- a/test/test_library.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#include
-extern "C"
-{
-#include "../src/library/library.h"
-#include "fakes/fff.h"
-}
-
-Library_Handle_t handle = {.pal = NULL};
-
-/**
- * Class C Library API Test Suite
- */
-class CLibraryAPI: public ::testing::Test
-{
- public:
-
- void SetUp()
- {
- Library_Config(&handle);
- }
-
- void TearDown()
- {
-
- }
-};
-
-/**
- * FFF fakes
- */
-DEFINE_FFF_GLOBALS;
-FAKE_VOID_FUNC(Library_PAL_XX_FunctionA);
-
-TEST_F(CLibraryAPI, checkInit)
-{
- ASSERT_EQ(Library_Init(&handle),LIBRARY_OK);
-}
-
-TEST_F(CLibraryAPI, checkDeinit)
-{
- ASSERT_EQ(Library_Deinit(&handle),LIBRARY_OK);
-}
-
-TEST_F(CLibraryAPI, checkSomeFunction)
-{
- ASSERT_EQ(Library_SomeFunction(&handle),LIBRARY_OK);
- ASSERT_EQ(Library_PAL_XX_FunctionA_fake.call_count, 1);
-}
\ No newline at end of file
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
new file mode 100644
index 0000000..88dca84
--- /dev/null
+++ b/test/unit/CMakeLists.txt
@@ -0,0 +1,59 @@
+cmake_minimum_required(VERSION 3.12.4)
+
+set(prjtest hss-test)
+
+file(GLOB Sources CONFIGURE_DEPENDS "*.cpp")
+
+# Test Sources
+# set(Sources
+ # test_hss-shield-bts700x.cpp
+ # test_hss-shield-btt60xx.cpp
+ # test_hss-shield-bts5001x.cpp
+ # test_hss.cpp
+# )
+
+# GCOV Coverage Targets
+set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE ON)
+set(GCOV_FILES_DIR ${CMAKE_BINARY_DIR}/CMakeFiles/${corelib}.dir/src)
+
+# Binary and Output Coverage Files
+file(GLOB_RECURSE GCOV_GNNO_GCDA_FILES ${CMAKE_BINARY_DIR}/*.gc??)
+
+# Coverage Target
+add_custom_target(gcov
+ COMMAND ${CMAKE_COMMAND} -E make_directory coverage
+ COMMAND ${CMAKE_MAKE_PROGRAM} test
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+ )
+
+# Coverage Command
+add_custom_command(TARGET gcov
+COMMAND ${CMAKE_COMMAND} -E echo "=================== GCOVR ===================="
+COMMAND gcovr -r ${CMAKE_SOURCE_DIR}/src/corelib/ ${GCOV_FILES_DIR}/corelib -b -k --gcov-ignore-parse-errors --html --html-details -o ${CMAKE_BINARY_DIR}/coverage/coverage.html
+COMMAND ${CMAKE_COMMAND} -E echo "-- Coverage files have been output to ${CMAKE_BINARY_DIR}/coverage"
+WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/coverage
+)
+
+# Coverage Clean
+add_custom_target(gcov_clean
+COMMAND ${CMAKE_COMMAND} -E remove -f ${GCOV_GNNO_GCDA_FILES}
+COMMAND ${CMAKE_COMMAND} -E remove_directory coverage
+WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+)
+
+add_dependencies(gcov ${prjtest})
+
+# Executable
+add_executable(${prjtest} ${Sources}) #${Headers})
+# Required Libraries
+target_link_libraries(${prjtest} PUBLIC
+ gtest_main
+ gmock_main
+ high-side-switch
+)
+
+# Add Ctest
+add_test(
+ NAME ${prjtest}
+ COMMAND ${prjtest}
+)
\ No newline at end of file
diff --git a/test/unit/test_hss-mock.hpp b/test/unit/test_hss-mock.hpp
new file mode 100644
index 0000000..724f39a
--- /dev/null
+++ b/test/unit/test_hss-mock.hpp
@@ -0,0 +1,60 @@
+#include
+#include
+#include "hss.hpp"
+#include "hss-pal-adc.hpp"
+#include "hss-pal-gpio.hpp"
+#include "hss-pal-timer.hpp"
+
+
+using ::testing::Return;
+using ::testing::_;
+using ::testing::InSequence;
+using ::testing::DoAll;
+using ::testing::SetArgReferee;
+using ::testing::SetArgPointee;
+using ::testing::SetArrayArgument;
+using ::testing::NiceMock;
+using ::testing::AtLeast;
+using ::testing::AnyNumber;
+using ::testing::Assign;
+using ::testing::SaveArg;
+using ::testing::SafeMatcherCast;
+using ::testing::NotNull;
+
+using namespace hss;
+
+class MockADC : public ADCPAL
+{
+ public:
+ MOCK_METHOD(Error_t, init, (), (override));
+ MOCK_METHOD(Error_t, deinit, (), (override));
+ MOCK_METHOD(Error_t, enable, (), (override));
+ MOCK_METHOD(Error_t, disable, (), (override));
+ MOCK_METHOD(Error_t, setReadResolution, (uint8_t resolution), (override));
+ MOCK_METHOD(Error_t, setWriteResolution, (uint8_t resolution), (override));
+ MOCK_METHOD(uint16_t, ADCRead, (), (override));
+ MOCK_METHOD(Error_t, ADCWrite, (uint8_t value), (override));
+};
+
+class MockTimer: public TimerPAL
+{
+ public:
+ MOCK_METHOD(Error_t, init, (), (override));
+ MOCK_METHOD(Error_t, deinit, (), (override));
+ MOCK_METHOD(Error_t, start, (), (override));
+ MOCK_METHOD(Error_t, elapsed, (uint32_t &elapsed), (override));
+ MOCK_METHOD(Error_t, stop, (), (override));
+ MOCK_METHOD(Error_t, delayMilli, (uint32_t timeout), (override));
+ MOCK_METHOD(Error_t, delayMicro, (uint32_t timeout), (override));
+};
+
+class MockGPIO: public GPIOPAL
+{
+ public:
+ MOCK_METHOD(Error_t, init, (), (override));
+ MOCK_METHOD(Error_t, deinit, (), (override));
+ MOCK_METHOD(VLevel_t, read, (), (override));
+ MOCK_METHOD(Error_t, write, (VLevel_t level), (override));
+ MOCK_METHOD(Error_t, enable, (), (override));
+ MOCK_METHOD(Error_t, disable, (), (override));
+};
diff --git a/test/unit/test_hss-shield-bts5001x.cpp b/test/unit/test_hss-shield-bts5001x.cpp
new file mode 100644
index 0000000..73206d0
--- /dev/null
+++ b/test/unit/test_hss-shield-bts5001x.cpp
@@ -0,0 +1,206 @@
+#include "test_hss-mock.hpp"
+#include "hss-shield-bts5001x.hpp"
+
+/**
+ * Class C++ High-Side-Switch Profet 24V Class Test Suite
+ */
+class Bts5001xShield_Test : public ::testing::Test
+{
+
+ public:
+
+ NiceMock den, in, led1, led2;
+ NiceMock is, pushButton, vBat;
+ NiceMock timer;
+
+ Hss * hsw;
+ Bts5001xShield * shield;
+
+ /**
+ * Is called before every individual test is executed
+ */
+ void SetUp()
+ {
+ hsw = new Hss(&den, &in, &is, &timer, &BTS50015);
+ shield = new Bts5001xShield(hsw, &led1, &led2, &pushButton, &vBat);
+
+ ON_CALL(den,init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(in,init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(is,init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(timer,init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den,deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(in,deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(is,deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(timer,deinit())
+ .WillByDefault(Return(OK));
+
+ }
+
+ /**
+ * Is called after every individual test was executed
+ */
+ void TearDown()
+ {
+ delete hsw;
+ delete shield;
+ }
+};
+
+/**
+ * init()
+ */
+
+TEST_F(Bts5001xShield_Test, init_Error)
+{
+ EXPECT_CALL(den, init())
+ .WillOnce(Return(INTF_ERROR));
+
+ ASSERT_EQ(INTF_ERROR, shield->init());
+}
+
+TEST_F(Bts5001xShield_Test, init_Nullptr_Error)
+{
+ Bts5001xShield shield2(nullptr, &led1, &led2, &pushButton, &vBat);
+
+ ASSERT_EQ(NULLPTR_ERROR, shield2.init());
+}
+
+TEST_F(Bts5001xShield_Test, init_Success)
+{
+ ASSERT_EQ(OK, shield->init());
+}
+
+/**
+ * deinit()
+ */
+
+TEST_F(Bts5001xShield_Test, deinit_Error)
+{
+ EXPECT_CALL(den, deinit())
+ .WillOnce(Return(INTF_ERROR));
+
+ ASSERT_EQ(INTF_ERROR, shield->deinit());
+}
+
+TEST_F(Bts5001xShield_Test, deinit_Nullptr_Error)
+{
+ Bts5001xShield shield2(nullptr, &led1, &led2, &pushButton, &vBat);
+
+ ASSERT_EQ(NULLPTR_ERROR, shield2.deinit());
+}
+
+TEST_F(Bts5001xShield_Test, deinit_Success)
+{
+ ASSERT_EQ(OK, shield->deinit());
+}
+
+/**
+ * switchHxOn()
+ */
+
+TEST_F(Bts5001xShield_Test, switchHxOn_Error)
+{
+ EXPECT_CALL(in, enable())
+ .WillOnce(Return(INTF_ERROR));
+
+ shield->init();
+
+ ASSERT_EQ(INTF_ERROR, shield->switchHxOn());
+}
+
+TEST_F(Bts5001xShield_Test, switchHxOn_Success)
+{
+ shield->init();
+
+ ASSERT_EQ(OK, shield->switchHxOn());
+}
+
+/**
+ * switchHxOn()
+ */
+
+TEST_F(Bts5001xShield_Test, switchHxOff_Error)
+{
+ EXPECT_CALL(in, disable())
+ .WillOnce(Return(INTF_ERROR));
+
+ shield->init();
+
+ ASSERT_EQ(INTF_ERROR, shield->switchHxOff());
+}
+
+TEST_F(Bts5001xShield_Test, switchHxOff_Success)
+{
+ shield->init();
+
+ ASSERT_EQ(OK, shield->switchHxOff());
+}
+
+/**
+ * readDiagx()
+ */
+
+TEST_F(Bts5001xShield_Test, readDiagx_Error)
+{
+ shield->init();
+
+ ASSERT_EQ(NORMAL, shield->readDiagx());
+}
+
+/**
+ * readIsx()
+ */
+
+TEST_F(Bts5001xShield_Test, readIsx_Success)
+{
+ shield->init();
+
+ ASSERT_EQ(0, shield->readIsx());
+}
+
+/**
+ * readDiagx()
+ */
+
+TEST_F(Bts5001xShield_Test, readDiagx_Openload_InverseCurrent)
+{
+ shield->init();
+ shield->switchHxOn();
+
+ ASSERT_EQ(FAULT_OL_IC, shield->readDiagx());
+}
+
+/**
+ * analogReadButton()
+ */
+
+TEST_F(Bts5001xShield_Test, analogReadButton_true_Success)
+{
+ shield->init();
+
+ ASSERT_EQ(true, shield->analogReadButton());
+}
+
+TEST_F(Bts5001xShield_Test, analogReadButton_false_Success)
+{
+ EXPECT_CALL(pushButton, ADCRead())
+ .WillOnce(Return(30));
+
+ shield->init();
+
+ ASSERT_EQ(false, shield->analogReadButton());
+}
\ No newline at end of file
diff --git a/test/unit/test_hss-shield-bts700x.cpp b/test/unit/test_hss-shield-bts700x.cpp
new file mode 100644
index 0000000..9e4b7e4
--- /dev/null
+++ b/test/unit/test_hss-shield-bts700x.cpp
@@ -0,0 +1,2388 @@
+#include "test_hss-mock.hpp"
+#include "hss-shield-bts700x.hpp"
+
+using namespace hss;
+
+/**
+ * Class C++ High-Side-Switch BTS700x Class Test Suite
+ */
+class Hss_BTS700xShield_Test : public ::testing::Test
+{
+ public:
+
+ NiceMock is1;
+ NiceMock den1;
+ NiceMock in1;
+ NiceMock dsel1;
+ NiceMock timer1;
+
+ NiceMock is2;
+ NiceMock den2;
+ NiceMock in2;
+ NiceMock dsel2;
+ NiceMock timer2;
+
+ NiceMock is3;
+ NiceMock den3;
+ NiceMock in3;
+ NiceMock dsel3;
+ NiceMock timer3;
+
+ NiceMock is4;
+ NiceMock den4;
+ NiceMock in4;
+ NiceMock dsel4;
+ NiceMock timer4;
+
+ NiceMock led1;
+ NiceMock led2;
+ NiceMock led3;
+ NiceMock led4;
+
+ NiceMock timer;
+
+ NiceMock oloff;
+ NiceMock pushButtonDigital;
+
+ NiceMock pushButtonAnalog;
+ NiceMock vBat;
+
+ /**
+ * Is called before every individual test is executed
+ */
+ void SetUp()
+ {
+ ON_CALL(den1, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(in1, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel1, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(is1, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer1, init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den2, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(in2, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel2, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(is2, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer2, init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den3, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(in3, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel3, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(is3, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer3, init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den4, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(in4, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel4, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(is4, init())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer4, init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den1, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(in1, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel1, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(is1, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer1, deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den2, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(in2, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel2, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(is2, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer2, deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den3, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(in3, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel3, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(is3, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer3, deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den4, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(in4, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(dsel4, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(is4, deinit())
+ .WillByDefault(Return(OK));
+ ON_CALL(timer4, deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(in1, enable())
+ .WillByDefault(Return(OK));
+ ON_CALL(in2, enable())
+ .WillByDefault(Return(OK));
+ ON_CALL(in3, enable())
+ .WillByDefault(Return(OK));
+ ON_CALL(in4, enable())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(in1, disable())
+ .WillByDefault(Return(OK));
+ ON_CALL(in2, disable())
+ .WillByDefault(Return(OK));
+ ON_CALL(in3, disable())
+ .WillByDefault(Return(OK));
+ ON_CALL(in4, disable())
+ .WillByDefault(Return(OK));
+ }
+
+ /**
+ * Is called after every individual test was executed
+ */
+ void TearDown()
+ {
+
+ }
+};
+
+TEST_F(Hss_BTS700xShield_Test, init_successful)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(vBat, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(OK, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led1_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led2_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led3_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led4_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_timer_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_oloff_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_pushButtonDigital_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_pushButtonAnalog_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_vBat_failed)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(vBat, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led1_nullptr)
+{
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(nullptr, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led2_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, nullptr, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led3_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, nullptr, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_led4_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, nullptr, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_hss1_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, nullptr, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_hss2_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, nullptr, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_hss3_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, nullptr, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_hss4_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, nullptr, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_timer_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, nullptr, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_oloff_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, nullptr, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_pushButtonDigital_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, nullptr, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_pushButtonAnalog_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, nullptr, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, init_vBat_nullptr)
+{
+ EXPECT_CALL(led1, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, nullptr, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.init());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_successful)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(vBat, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(OK, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led1_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led2_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led3_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led4_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_timer_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_oloff_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_pushButtonDigital_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_pushButtonAnalog_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_vBat_failed)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(vBat, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led1_nullptr)
+{
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(nullptr, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led2_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, nullptr, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led3_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, nullptr, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_led4_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, nullptr, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_hss1_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, nullptr, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_hss2_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, nullptr, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_hss3_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, nullptr, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_hss4_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, nullptr, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_timer_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, nullptr, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_oloff_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, nullptr, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_pushButtonDigital_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, nullptr, &pushButtonAnalog, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_pushButtonAnalog_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, nullptr, &vBat, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, deinit_vBat_nullptr)
+{
+ EXPECT_CALL(led1, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(oloff, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(pushButtonDigital, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(pushButtonAnalog, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, nullptr, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hssShield.deinit());
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_1_successful)
+{
+ EXPECT_CALL(led1, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOn(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_2_successful)
+{
+ EXPECT_CALL(led2, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOn(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_3_successful)
+{
+ EXPECT_CALL(led3, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOn(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_4_successful)
+{
+ EXPECT_CALL(led4, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOn(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_1_failed)
+{
+ EXPECT_CALL(led1, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_2_failed)
+{
+ EXPECT_CALL(led2, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_3_failed)
+{
+ EXPECT_CALL(led3, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_4_failed)
+{
+ EXPECT_CALL(led4, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_1_hss_failed)
+{
+ EXPECT_CALL(in1, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_2_hss_failed)
+{
+ EXPECT_CALL(in2, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_3_hss_failed)
+{
+ EXPECT_CALL(in3, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOn_4_hss_failed)
+{
+ EXPECT_CALL(in4, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOn(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_1_successful)
+{
+ EXPECT_CALL(led1, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOff(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_2_successful)
+{
+ EXPECT_CALL(led2, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOff(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_3_successful)
+{
+ EXPECT_CALL(led3, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOff(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_4_successful)
+{
+ EXPECT_CALL(led4, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchHxOff(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_1_failed)
+{
+ EXPECT_CALL(led1, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_2_failed)
+{
+ EXPECT_CALL(led2, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_3_failed)
+{
+ EXPECT_CALL(led3, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_4_failed)
+{
+ EXPECT_CALL(led4, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_1_hss_failed)
+{
+ EXPECT_CALL(in1, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_2_hss_failed)
+{
+ EXPECT_CALL(in2, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_3_hss_failed)
+{
+ EXPECT_CALL(in3, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchHxOff_4_hss_failed)
+{
+ EXPECT_CALL(in4, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchHxOff(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOn_success_all)
+{
+ EXPECT_CALL(led1, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchesHxOn(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOn_success_only_third)
+{
+ EXPECT_CALL(led3, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchesHxOn(false, false, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOn_1_fail)
+{
+ EXPECT_CALL(in1, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOn(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOn_2_fail)
+{
+ EXPECT_CALL(in1, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in2, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOn(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOn_3_fail)
+{
+ EXPECT_CALL(in1, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in2, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in3, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOn(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOn_4_fail)
+{
+ EXPECT_CALL(in1, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in2, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in3, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in4, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOn(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOff_success_all)
+{
+ EXPECT_CALL(led1, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led2, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led3, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(led4, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchesHxOff(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOff_success_only_third)
+{
+ EXPECT_CALL(led3, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(OK, hssShield.switchesHxOff(false, false, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOff_1_fail)
+{
+ EXPECT_CALL(in1, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOff(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOff_2_fail)
+{
+ EXPECT_CALL(in1, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in2, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOff(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOff_3_fail)
+{
+ EXPECT_CALL(in1, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in2, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in3, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOff(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, switchesHxOff_4_fail)
+{
+ EXPECT_CALL(in1, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in2, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in3, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+ EXPECT_CALL(in4, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(INTF_ERROR, hssShield.switchesHxOff(true, true, true, true));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readIsx_1)
+{
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_NEAR(0, hssShield.readIsx(1), 9223372036854755807);
+}
+
+TEST_F(Hss_BTS700xShield_Test, readIsx_2)
+{
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_NEAR(0, hssShield.readIsx(2), 9223372036854755807);
+}
+
+TEST_F(Hss_BTS700xShield_Test, readIsx_3)
+{
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_NEAR(0, hssShield.readIsx(3), 9223372036854755807);
+}
+
+TEST_F(Hss_BTS700xShield_Test, readIsx_4)
+{
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_NEAR(0, hssShield.readIsx(4), 9223372036854755807);
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_1_on)
+{
+ EXPECT_CALL(den1, enable())
+ .Times(2)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+ hssShield.switchHxOn(1);
+
+ ASSERT_EQ(FAULT_OL_IC, hssShield.readDiagx(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_2_on)
+{
+ EXPECT_CALL(den2, enable())
+ .Times(2)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+ hssShield.switchHxOn(2);
+
+ ASSERT_EQ(FAULT_OL_IC, hssShield.readDiagx(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_3_on)
+{
+ EXPECT_CALL(den3, enable())
+ .Times(2)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+ hssShield.switchHxOn(3);
+
+ ASSERT_EQ(FAULT_OL_IC, hssShield.readDiagx(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_4_on)
+{
+ EXPECT_CALL(den4, enable())
+ .Times(2)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+ hssShield.switchHxOn(4);
+
+ ASSERT_EQ(FAULT_OL_IC, hssShield.readDiagx(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_1_off)
+{
+ EXPECT_CALL(den1, enable())
+ .Times(3)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(NORMAL, hssShield.readDiagx(1));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_2_off)
+{
+ EXPECT_CALL(den2, enable())
+ .Times(3)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(NORMAL, hssShield.readDiagx(2));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_3_off)
+{
+ EXPECT_CALL(den3, enable())
+ .Times(3)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(NORMAL, hssShield.readDiagx(3));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readDiagx_4_off)
+{
+ EXPECT_CALL(den4, enable())
+ .Times(3)
+ .WillRepeatedly(Return(OK));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(NORMAL, hssShield.readDiagx(4));
+}
+
+TEST_F(Hss_BTS700xShield_Test, readVss)
+{
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(0, hssShield.readVss());
+}
+
+TEST_F(Hss_BTS700xShield_Test, digitalReadButton_pressed)
+{
+ EXPECT_CALL(pushButtonDigital, read())
+ .Times(1)
+ .WillOnce(Return(GPIOPAL::GPIO_LOW));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(1, hssShield.digitalReadButton());
+}
+
+TEST_F(Hss_BTS700xShield_Test, digitalReadButton_not_pressed)
+{
+ EXPECT_CALL(pushButtonDigital, read())
+ .Times(1)
+ .WillOnce(Return(GPIOPAL::GPIO_HIGH));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(0, hssShield.digitalReadButton());
+}
+
+TEST_F(Hss_BTS700xShield_Test, analogReadButton_pressed)
+{
+ EXPECT_CALL(pushButtonAnalog, ADCRead())
+ .Times(1)
+ .WillOnce(Return(10));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(1, hssShield.analogReadButton());
+}
+
+TEST_F(Hss_BTS700xShield_Test, analogReadButton_not_pressed)
+{
+ EXPECT_CALL(pushButtonAnalog, ADCRead())
+ .Times(1)
+ .WillOnce(Return(500));
+
+ Hss hsw1(&den1, &in1, nullptr, &dsel1, &is1, &timer1, &BTS7002);
+ Hss hsw2(&den2, &in2, nullptr, &dsel2, &is2, &timer2, &BTS7002);
+ Hss hsw3(&den3, &in3, nullptr, &dsel3, &is3, &timer3, &BTS7002);
+ Hss hsw4(&den4, &in4, nullptr, &dsel4, &is4, &timer4, &BTS7002);
+
+ Bts700xShield hssShield(&led1, &led2, &led3, &led4, &hsw1, &hsw2, &hsw3, &hsw4, &timer, &oloff, &pushButtonDigital, &pushButtonAnalog, &vBat, &BTS7002);
+ hssShield.init();
+
+ ASSERT_EQ(0, hssShield.analogReadButton());
+}
diff --git a/test/unit/test_hss-shield-btt60xx.cpp b/test/unit/test_hss-shield-btt60xx.cpp
new file mode 100644
index 0000000..1a0645a
--- /dev/null
+++ b/test/unit/test_hss-shield-btt60xx.cpp
@@ -0,0 +1,271 @@
+#include "test_hss-mock.hpp"
+#include "hss-shield-btt60xx.hpp"
+
+/**
+ * Class C++ High-Side-Switch Profet 24V Class Test Suite
+ */
+class Btt60xxShield_Test : public ::testing::Test
+{
+
+ public:
+
+ NiceMock den[3];
+ NiceMock in[5];
+ NiceMock dsel[2];
+ NiceMock is[3];
+ NiceMock timer[3];
+
+ Hss * hsw[3];
+ Btt60xxShield * btt60xxShield;
+
+ /**
+ * Is called before every individual test is executed
+ */
+ void SetUp()
+ {
+ for(uint8_t i = 0; i < 3; i++)
+ {
+ if(2 == i)
+ {
+ hsw[i] = new Hss(&den[i], &in[2*i], &is[i], &timer[i], &BTT6020);
+ }
+ else
+ {
+ hsw[i] = new Hss(&den[i], &in[2*i], &in[2*i + 1], &dsel[i], &is[i], &timer[i], &BTT6030);
+ }
+
+ ON_CALL(den[i],init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(in[i],init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(dsel[i],init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(is[i],init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(timer[i],init())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(den[i],deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(in[i],deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(dsel[i],deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(is[i],deinit())
+ .WillByDefault(Return(OK));
+
+ ON_CALL(timer[i],deinit())
+ .WillByDefault(Return(OK));
+ }
+
+ btt60xxShield = new Btt60xxShield(hsw[0], hsw[1], hsw[2]);
+ }
+
+ /**
+ * Is called after every individual test was executed
+ */
+ void TearDown()
+ {
+ for(uint8_t i = 0; i < 3; i++)
+ {
+ delete hsw[i];
+ }
+
+ delete btt60xxShield;
+ }
+};
+
+/**
+ * init()
+ */
+
+TEST_F(Btt60xxShield_Test, init_Error)
+{
+ EXPECT_CALL(den[0],init())
+ .WillOnce(Return(INTF_ERROR));
+
+ ASSERT_EQ(INTF_ERROR, btt60xxShield->init());
+}
+
+TEST_F(Btt60xxShield_Test, init_Success)
+{
+ ASSERT_EQ(OK, btt60xxShield->init());
+}
+
+/**
+ * deinit()
+ */
+
+TEST_F(Btt60xxShield_Test, deinit_Error)
+{
+ EXPECT_CALL(den[0],deinit())
+ .WillOnce(Return(INTF_ERROR));
+
+ ASSERT_EQ(INTF_ERROR, btt60xxShield->deinit());
+}
+
+TEST_F(Btt60xxShield_Test, deinit_Success)
+{
+ ASSERT_EQ(OK, btt60xxShield->deinit());
+}
+
+/**
+ * switchHxOn()
+ */
+
+TEST_F(Btt60xxShield_Test, switchHxOn_Error)
+{
+ btt60xxShield->init();
+
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ EXPECT_CALL(in[i],enable())
+ .WillOnce(Return(INTF_ERROR));
+
+ ASSERT_EQ(INTF_ERROR, btt60xxShield->switchHxOn(i));
+ }
+}
+
+TEST_F(Btt60xxShield_Test, switchHxOn_Success)
+{
+ btt60xxShield->init();
+
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ EXPECT_CALL(in[i],enable())
+ .WillOnce(Return(OK));
+
+ ASSERT_EQ(OK, btt60xxShield->switchHxOn(i));
+ }
+}
+
+/**
+ * switchHxOff()
+ */
+
+TEST_F(Btt60xxShield_Test, switchHxOff_Error)
+{
+ btt60xxShield->init();
+
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ EXPECT_CALL(in[i],disable())
+ .WillOnce(Return(INTF_ERROR));
+
+ ASSERT_EQ(INTF_ERROR, btt60xxShield->switchHxOff(i));
+ }
+}
+
+TEST_F(Btt60xxShield_Test, switchHxOff_Success)
+{
+ btt60xxShield->init();
+
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ EXPECT_CALL(in[i],disable())
+ .WillOnce(Return(OK));
+
+ ASSERT_EQ(OK, btt60xxShield->switchHxOff(i));
+ }
+}
+
+/**
+ * switchesHxOn()
+ */
+
+TEST_F(Btt60xxShield_Test, switchesHxOn_Error)
+{
+ EXPECT_CALL(in[0],enable())
+ .WillOnce(Return(INTF_ERROR));
+
+ btt60xxShield->init();
+
+ ASSERT_EQ(INTF_ERROR, btt60xxShield->switchesHxOn(true, true, true, true, true));
+}
+
+TEST_F(Btt60xxShield_Test, switchesHxOn_Success)
+{
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ EXPECT_CALL(in[i],enable())
+ .WillOnce(Return(OK));
+ }
+
+ btt60xxShield->init();
+
+ ASSERT_EQ(OK, btt60xxShield->switchesHxOn(true, true, true, true, true));
+}
+
+/**
+ * switchesHxOff()
+ */
+
+TEST_F(Btt60xxShield_Test, switchesHxOff_Error)
+{
+ EXPECT_CALL(in[0],disable())
+ .WillOnce(Return(INTF_ERROR));
+
+ btt60xxShield->init();
+
+ ASSERT_EQ(INTF_ERROR, btt60xxShield->switchesHxOff(true, true, true, true, true));
+}
+
+TEST_F(Btt60xxShield_Test, switchesHxOff_Success)
+{
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ EXPECT_CALL(in[i],disable())
+ .WillOnce(Return(OK));
+ }
+
+ btt60xxShield->init();
+
+ ASSERT_EQ(OK, btt60xxShield->switchesHxOff(true, true, true, true, true));
+}
+
+/**
+ * readIsx()
+ */
+
+TEST_F(Btt60xxShield_Test, readIsx_Success)
+{
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ btt60xxShield->init();
+
+ ASSERT_EQ(0, btt60xxShield->readIsx(i));
+ }
+}
+
+/**
+ * readDiagx()
+ */
+
+
+TEST_F(Btt60xxShield_Test, readDiagx_NotPowerOn_Success)
+{
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ btt60xxShield->init();
+
+ ASSERT_EQ(0, btt60xxShield->readDiagx(i));
+ }
+}
+
+TEST_F(Btt60xxShield_Test, readDiagx_PowerOn_Success)
+{
+ for(uint8_t i = 0; i < 5; i++)
+ {
+ btt60xxShield->init();
+ btt60xxShield->switchesHxOn(true, true, true, true, true);
+
+ ASSERT_EQ(FAULT_OL_IC, btt60xxShield->readDiagx(i));
+ }
+}
diff --git a/test/unit/test_hss.cpp b/test/unit/test_hss.cpp
new file mode 100644
index 0000000..acb0d48
--- /dev/null
+++ b/test/unit/test_hss.cpp
@@ -0,0 +1,782 @@
+#include "test_hss-mock.hpp"
+#include "hss.hpp"
+
+/**
+ * Class C++ High-Side-Switch Class Test Suite
+ */
+class Hss_Test : public ::testing::Test
+{
+ public:
+
+ /**
+ * Is called before every individual test is executed
+ */
+ void SetUp()
+ {
+
+ }
+
+ /**
+ * Is called after every individual test was executed
+ */
+ void TearDown()
+ {
+
+ }
+};
+
+TEST_F(Hss_Test, init_success)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(is, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(OK, hss.init());
+}
+
+TEST_F(Hss_Test, init_nullptr_den)
+{
+ MockADC is;
+ MockGPIO in;
+ MockTimer timer;
+
+ Hss hss(nullptr, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(OK, hss.init());
+}
+
+TEST_F(Hss_Test, init_nullptr_error_2)
+{
+ MockADC is;
+ MockGPIO den;
+ MockTimer timer;
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, nullptr, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, init_nullptr_error_3)
+{
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, nullptr, &timer, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, init_nullptr_error_4)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(is, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, &is, nullptr, &BTS7002);
+
+ ASSERT_EQ(NULLPTR_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, den_init_conf_error)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hss(&den, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, in_init_error)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hss(&den, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, is_init_error)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(is, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hss(&den, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, timer_init_error)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(is, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hss(&den, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, init_success_with_dsel)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockGPIO dsel;
+ MockTimer timer;
+
+ EXPECT_CALL(is, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(dsel, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(OK, hss.init());
+}
+
+TEST_F(Hss_Test, init_error_with_dsel)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockGPIO dsel;
+ MockTimer timer;
+
+ EXPECT_CALL(is, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(den, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, init())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(dsel, init())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hss.init());
+}
+
+TEST_F(Hss_Test, deinit_success)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(is, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(den, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(OK, hss.deinit());
+}
+
+TEST_F(Hss_Test, deinit_error)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockTimer timer;
+
+ EXPECT_CALL(is, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(den, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hss(&den, &in, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hss.deinit());
+}
+
+TEST_F(Hss_Test, deinit_success_with_dsel)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockGPIO dsel;
+ MockTimer timer;
+
+ EXPECT_CALL(is, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(den, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(dsel, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(OK, hss.deinit());
+}
+
+TEST_F(Hss_Test, deinit_error_with_dsel)
+{
+ MockADC is;
+ MockGPIO den;
+ MockGPIO in;
+ MockGPIO dsel;
+ MockTimer timer;
+
+ EXPECT_CALL(is, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(den, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(in, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(dsel, deinit())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ EXPECT_CALL(timer, deinit())
+ .Times(1)
+ .WillOnce(Return(CONF_ERROR));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(CONF_ERROR, hss.deinit());
+}
+
+TEST_F(Hss_Test, enable_success)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(in, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(OK, hss.enable());
+}
+
+TEST_F(Hss_Test, enable_fail)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(in, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(INTF_ERROR, hss.enable());
+}
+
+TEST_F(Hss_Test, enable_not_initialized)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(INIT_ERROR, hss.enable());
+}
+
+TEST_F(Hss_Test, disable_success)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(in, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(OK, hss.disable());
+}
+
+
+TEST_F(Hss_Test, disable_fail)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(in, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(INTF_ERROR, hss.disable());
+}
+
+TEST_F(Hss_Test, disable_not_initialized)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(INIT_ERROR, hss.disable());
+}
+
+TEST_F(Hss_Test, enableDiagnosis_success)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(den, enable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(OK, hss.enableDiag());
+}
+
+
+TEST_F(Hss_Test, enableDiagnosis_fail)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(den, enable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(INTF_ERROR, hss.enableDiag());
+}
+
+TEST_F(Hss_Test, enableDiagnosis_not_initialized)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(INIT_ERROR, hss.enableDiag());
+}
+
+TEST_F(Hss_Test, disableDiagnosis_success)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(den, disable())
+ .Times(1)
+ .WillOnce(Return(OK));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(OK, hss.disableDiag());
+}
+
+
+TEST_F(Hss_Test, disableDiagnosis_fail)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(den, disable())
+ .Times(1)
+ .WillOnce(Return(INTF_ERROR));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(INTF_ERROR, hss.disableDiag());
+}
+
+TEST_F(Hss_Test, disableDiagnosis_not_initialized)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(INIT_ERROR, hss.disableDiag());
+}
+
+TEST_F(Hss_Test, getSwitchStatus_init)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ ASSERT_EQ(INITED, hss.getSwitchStatus());
+}
+
+TEST_F(Hss_Test, getSwitchStatus_uninit)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ ASSERT_EQ(UNINITED, hss.getSwitchStatus());
+}
+
+TEST_F(Hss_Test, getSwitchStatus_power_on)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+ hss.enable();
+
+ ASSERT_EQ(POWER_ON, hss.getSwitchStatus());
+}
+
+TEST_F(Hss_Test, getSwitchStatus_power_off)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+ hss.disable();
+
+ ASSERT_EQ(POWER_OFF, hss.getSwitchStatus());
+}
+
+TEST_F(Hss_Test, readIs_value)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(timer, delayMilli(1))
+ .Times(1);
+
+ EXPECT_CALL(is, ADCRead())
+ .Times(1)
+ .WillOnce(Return(50));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+ hss.enable();
+ hss.enableDiag();
+
+ ASSERT_NEAR(5.54199, hss.readIs(1000), 0.1);
+}
+
+TEST_F(Hss_Test, readIs_value_channel1)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ EXPECT_CALL(timer, delayMilli(1))
+ .Times(1);
+
+ EXPECT_CALL(is, ADCRead())
+ .Times(1)
+ .WillOnce(Return(50));
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+ hss.enable();
+ hss.enableDiag();
+
+ ASSERT_NEAR(5.54199, hss.readIs(1000, CHANNEL1), 0.1);
+}
+
+TEST_F(Hss_Test, readIs_not_init)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+
+ // ASSERT_EQ(0, hss.readIs());
+}
+
+TEST_F(Hss_Test, calibrateIs_success)
+{
+ NiceMock is;
+ NiceMock den;
+ NiceMock in;
+ NiceMock dsel;
+ NiceMock timer;
+
+ Hss hss(&den, &in, nullptr, &dsel, &is, &timer, &BTS7002);
+ hss.init();
+
+ // ASSERT_FLOAT_EQ(2.4, hss.calibrateIs(20, 100, 0, 1.2));
+}
+
+// TEST_F(Hss_Test, diagRead_not_enabled)
+// {
+// NiceMock is;
+// NiceMock den;
+// NiceMock in;
+// NiceMock dsel;
+// NiceMock timer;
+
+// Hss hss(&den, &in, &dsel, &is, &timer);
+// hss.init();
+
+// ASSERT_EQ(NOT_ENABLED, hss.diagRead(2.0, 5));
+// }
+
+// TEST_F(Hss_Test, diagRead_overload)
+// {
+// NiceMock is;
+// NiceMock den;
+// NiceMock in;
+// NiceMock dsel;
+// NiceMock timer;
+
+// Hss hss(&den, &in, &dsel, &is, &timer);
+// hss.init();
+// hss.enableDiag();
+
+// ASSERT_EQ(OVERLOAD, hss.diagRead(2.0, iisFault, iisOl, 5.0));
+// }
+
+// TEST_F(Hss_Test, diagRead_open_load)
+// {
+// NiceMock is;
+// NiceMock den;
+// NiceMock in;
+// NiceMock dsel;
+// NiceMock timer;
+
+// Hss hss(&den, &in, &dsel, &is, &timer);
+// hss.init();
+// hss.enableDiag();
+
+// ASSERT_EQ(OPEN_LOAD, hss.diagRead(0.5, 40000));
+// }
+
+// TEST_F(Hss_Test, diagRead_normal)
+// {
+// NiceMock is;
+// NiceMock den;
+// NiceMock in;
+// NiceMock dsel;
+// NiceMock timer;
+
+// Hss hss(&den, &in, &dsel, &is, &timer);
+// hss.init();
+// hss.enableDiag();
+
+// ASSERT_EQ(NORMAL, hss.diagRead(0.78, 200));
+// }
\ No newline at end of file