Compare commits
	
		
			60 Commits
		
	
	
		
			move_seman
			...
			action-upd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						60f6ef5f1f
	
				 | 
					
					
						|||
| 4ecd9eb62e | |||
| fb89d7a3b6 | |||
| 146c3471d0 | |||
| 1816c3f623 | |||
| d03d5aa74c | |||
| 26e97ddf89 | |||
| be3a57a795 | |||
| 13b97abf0d | |||
| f95c373076 | |||
| e03731bcf8 | |||
| 9fe8579377 | |||
| 2714e588d7 | |||
| e905288adc | |||
| 3805ea50a7 | |||
| 699bd694cd | |||
| 4518fec65c | |||
| dac1aacab2 | |||
| 0042f92fdf | |||
| 656faf8169 | |||
| f84431e965 | |||
| 0cec9ebb73 | |||
| a440b7c394 | |||
| bbfc1b2b34 | |||
| 
						
						
							
						
						025b379e8b
	
				 | 
					
					
						|||
| c35a0a8541 | |||
| 0f81d5e458 | |||
| e0a072859b | |||
| b50f092939 | |||
| 2f90e12179 | |||
| 8b77fac099 | |||
| 47503824d7 | |||
| 5e3f5c4121 | |||
| 1f36c082ef | |||
| aa84e93603 | |||
| 8f63a0e747 | |||
| 6fc8f756a7 | |||
| 067cb7d0f8 | |||
| d98ed40e3d | |||
| 2c17af4ef8 | |||
| 110fb43b9c | |||
| b057250bfb | |||
| 066dd0d397 | |||
| f735c2e9d4 | |||
| dc7afc5415 | |||
| 9bf3ff95b7 | |||
| 61562b18ab | |||
| d76d97a36b | |||
| 76b377c4c0 | |||
| 3562bf11b9 | |||
| fffb2b61e5 | |||
| 94e5f62331 | |||
| 0a9c563bbc | |||
| 5b92247fbd | |||
| d9da55fdab | |||
| 066f7a6f9b | |||
| c1f42618db | |||
| 61df451dd8 | |||
| 29ea89044e | |||
| e487f5be87 | 
							
								
								
									
										145
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										145
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -8,13 +8,50 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
 | 
			
		||||
# [unreleased]
 | 
			
		||||
 | 
			
		||||
# [v6.0.0]
 | 
			
		||||
## Fixes
 | 
			
		||||
 | 
			
		||||
- The `PusTmCreator` API only accepted 255 bytes of source data. It can now accept source
 | 
			
		||||
  data with a size limited only by the size of `size_t`.
 | 
			
		||||
- Important bugfix in CFDP PDU header format: The entity length field and the transaction sequence
 | 
			
		||||
  number fields stored the actual length of the field instead of the length minus 1 like specified
 | 
			
		||||
  in the CFDP standard.
 | 
			
		||||
- PUS Health Service: Size check for set health command.
 | 
			
		||||
  Perform operation completion for announce health command.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/746
 | 
			
		||||
- Linux OSAL `getUptime` fix: Check validity of `/proc/uptime` file before reading uptime.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/745
 | 
			
		||||
- Small tweak for version getter
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/744
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
- add CFDP subsystem ID
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/742
 | 
			
		||||
- `EventManager`: Add function to print all listeners.
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Bump ETL version to 20.35.14
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/748
 | 
			
		||||
- Renamed `PCDU_2` subsystem ID to `POWER_SWITCH_IF`.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/743
 | 
			
		||||
- Add new `PowerSwitchIF::SWITCH_UNKNOWN` returnvalue.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/743
 | 
			
		||||
- Assert that `FixedArrayList` is larger than 0 at compile time.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/740
 | 
			
		||||
- `EventManager`: Queue depth is configurable now
 | 
			
		||||
- `ActionHelper`: Allow execution of actions without additional data
 | 
			
		||||
 | 
			
		||||
# [v6.0.0] 2023-02-10
 | 
			
		||||
 | 
			
		||||
## Fixes
 | 
			
		||||
 | 
			
		||||
- Mode Service: Add allowed subservice
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/739
 | 
			
		||||
- `CService200ModeManagement`: Various bugfixes which lead to now execution complete being generated
 | 
			
		||||
  on mode announcements, duplicate mode reply generated on announce commands, and the mode read
 | 
			
		||||
  subservice not working properly.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/736
 | 
			
		||||
- Memory leak fixes for the TCP/IP TMTC bridge.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/737
 | 
			
		||||
- `Service9TimeManagement`: Fix the time dump at the `SET_TIME` subservice: Include clock timeval
 | 
			
		||||
@@ -23,16 +60,20 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
- HAL MGM3100 Handler: Use axis specific gain/scaling factors. Previously,
 | 
			
		||||
  only the X scaling factor was used.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/724
 | 
			
		||||
- Bugfix for RM3100 MGM sensors. Z value was previously calculated
 | 
			
		||||
  with bytes of the X value.
 | 
			
		||||
- HAL MGM3100 Handler: Z value was previously calculated with bytes of the X value.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/733
 | 
			
		||||
- DHB `setNormalDatapoolEntriesInvalid`: The default implementation did not set the validity
 | 
			
		||||
  to false correctly because the `read` and `write` calls were missing.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/728
 | 
			
		||||
- PUS TMTC creator module: Sequence flags were set to continuation segment (0b00) instead
 | 
			
		||||
  of the correct unsegmented flags (0b11) as specified in the standard.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/727
 | 
			
		||||
- TC Scheduler Service 11: Add size and CRC check for contained TC.
 | 
			
		||||
  Bug: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/issues/719
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/720
 | 
			
		||||
- Only delete health table entry in `HealthHelper` destructor if
 | 
			
		||||
  health table was set.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/710/files
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/710
 | 
			
		||||
- I2C Bugfixes: Do not keep iterator as member and fix some incorrect handling with the iterator.
 | 
			
		||||
  Also properly reset the reply size for successfull transfers and erroneous transfers.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/700
 | 
			
		||||
@@ -42,6 +83,36 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
- `TcpTmTcServer.cpp`: The server was actually not able to handle
 | 
			
		||||
  CCSDS packets which were clumped together. This has been fixed now.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/673
 | 
			
		||||
- `CServiceHealthCommanding`: Add announce all health info implementation
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/725
 | 
			
		||||
- various fixes related to linux Unittests and memory leaks
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/715
 | 
			
		||||
- small fix to allow teardown handling
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/713
 | 
			
		||||
- fix compiler warning for fixed array list copy ctor
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/704
 | 
			
		||||
- missing include
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/703
 | 
			
		||||
- defaultconfig did not build anymore
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/702
 | 
			
		||||
- hotfix
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/699
 | 
			
		||||
- small fix for helper
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/698
 | 
			
		||||
- missing retval conv
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/697
 | 
			
		||||
- DHB Countdown Bug
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/693
 | 
			
		||||
- doc corrections
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/687
 | 
			
		||||
- better error printout
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/686
 | 
			
		||||
- include correction
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/683
 | 
			
		||||
- better warning for missing include paths
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/676
 | 
			
		||||
- Service 11 regression
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/670
 | 
			
		||||
 | 
			
		||||
## Added
 | 
			
		||||
 | 
			
		||||
@@ -58,13 +129,36 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/709
 | 
			
		||||
- Add new `UnsignedByteField` class
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/660
 | 
			
		||||
- publish documentation for development and master branch
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/681
 | 
			
		||||
- Add Linux HAL options
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/663
 | 
			
		||||
- Expand SerializeIF
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/656
 | 
			
		||||
- PUS Service 11: Additional Safety Check
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/666
 | 
			
		||||
- improvements for auto-formatter script
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/665
 | 
			
		||||
- provide a weak print char impl
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/674
 | 
			
		||||
 | 
			
		||||
## Removed
 | 
			
		||||
 | 
			
		||||
- now that doc server is up, remove markdown files
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/688
 | 
			
		||||
- remove bsp specific code
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/679
 | 
			
		||||
 | 
			
		||||
## Changes
 | 
			
		||||
 | 
			
		||||
- `CService201HealthCommanding` renamed to `CServiceHealthCommanding`,
 | 
			
		||||
  service ID customizable now. `CServiceHealthCommanding` expects configuration struct
 | 
			
		||||
  `HealthServiceCfg` now
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/725
 | 
			
		||||
- `AcceptsTelemetryIF`: `getReportReceptionQueue` is const now
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/712
 | 
			
		||||
- Moved some container returnvalues to dedicated header and namespace
 | 
			
		||||
  to they can be used without template specification.
 | 
			
		||||
  so they can be used without template specification.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/707
 | 
			
		||||
- Remove default secondary header argument for
 | 
			
		||||
  `uint16_t getTcSpacePacketIdFromApid(uint16_t apid, bool secondaryHeaderFlag)` and
 | 
			
		||||
@@ -94,18 +188,41 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
- `DeviceHandlerBase`: New signature of `handleDeviceTm` which expects
 | 
			
		||||
  a `const SerializeIF&` and additional helper variant which expects `const uint8_t*`
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/671
 | 
			
		||||
- Move some generic `StorageManagerIF` implementations from `LocalPool` to
 | 
			
		||||
  interface itself so it can be re-used more easily. Also add new
 | 
			
		||||
  abstract function `bool hasDataAtId(store_address_t storeId) const`.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/685
 | 
			
		||||
- Improvements for `AcceptsTelemetryIF` and `AcceptsTelecommandsIF`:
 | 
			
		||||
  - Make functions `const` where it makes sense
 | 
			
		||||
  - Add `const char* getName const` abstract function
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/684
 | 
			
		||||
- Move some generic `StorageManagerIF` implementations from `LocalPool` to
 | 
			
		||||
  interface itself so it can be re-used more easily. Also add new
 | 
			
		||||
  abstract function `bool hasDataAtId(store_address_t storeId) const`.
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/685
 | 
			
		||||
- Generic TMTC Bridge Update
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/734
 | 
			
		||||
- comment tweak to event parser can read everything
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/732
 | 
			
		||||
- CMakeLists file updates
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/731
 | 
			
		||||
- improve srv20 error messages
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/723
 | 
			
		||||
- I2C Linux: remove duplicate printout
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/718
 | 
			
		||||
- printout handling improvements
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/717
 | 
			
		||||
- vec getter, reset for content
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/716
 | 
			
		||||
- updates for source sequence counter
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/714
 | 
			
		||||
- SP reader getPacketData is const now
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/708
 | 
			
		||||
- refactoring of serial drivers for linux
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/705
 | 
			
		||||
- Local Pool Update Remove Add Data Ignore Fault Argument
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/701
 | 
			
		||||
- Switch to new documentation server
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/694
 | 
			
		||||
- Windows Tweaks
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/691
 | 
			
		||||
- Refactor Local Pool API
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/667
 | 
			
		||||
- group MGM data in local pool vectors
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/664
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## CFDP
 | 
			
		||||
 | 
			
		||||
@@ -125,7 +242,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
     implementation without an extra component
 | 
			
		||||
  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/682
 | 
			
		||||
 | 
			
		||||
# [v5.0.0] 25.07.2022
 | 
			
		||||
# [v5.0.0] 2022-07-25
 | 
			
		||||
 | 
			
		||||
## Changes
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ list(APPEND CMAKE_MODULE_PATH
 | 
			
		||||
# Version file handling  #
 | 
			
		||||
# ##############################################################################
 | 
			
		||||
 | 
			
		||||
set(FSFW_VERSION_IF_GIT_FAILS 5)
 | 
			
		||||
set(FSFW_VERSION_IF_GIT_FAILS 6)
 | 
			
		||||
set(FSFW_SUBVERSION_IF_GIT_FAILS 0)
 | 
			
		||||
set(FSFW_REVISION_IF_GIT_FAILS 0)
 | 
			
		||||
 | 
			
		||||
@@ -72,7 +72,7 @@ set(FSFW_ETL_LIB_MAJOR_VERSION
 | 
			
		||||
    20
 | 
			
		||||
    CACHE STRING "ETL library major version requirement")
 | 
			
		||||
set(FSFW_ETL_LIB_VERSION
 | 
			
		||||
    ${FSFW_ETL_LIB_MAJOR_VERSION}.28.0
 | 
			
		||||
    ${FSFW_ETL_LIB_MAJOR_VERSION}.36.0
 | 
			
		||||
    CACHE STRING "ETL library exact version requirement")
 | 
			
		||||
set(FSFW_ETL_LINK_TARGET etl::etl)
 | 
			
		||||
 | 
			
		||||
@@ -80,7 +80,7 @@ set(FSFW_CATCH2_LIB_MAJOR_VERSION
 | 
			
		||||
    3
 | 
			
		||||
    CACHE STRING "Catch2 library major version requirement")
 | 
			
		||||
set(FSFW_CATCH2_LIB_VERSION
 | 
			
		||||
    v${FSFW_CATCH2_LIB_MAJOR_VERSION}.1.0
 | 
			
		||||
    v${FSFW_CATCH2_LIB_MAJOR_VERSION}.3.2
 | 
			
		||||
    CACHE STRING "Catch2 library exact version requirement")
 | 
			
		||||
 | 
			
		||||
# Keep this off by default for now. See PR:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								automation/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								automation/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							@@ -97,7 +97,7 @@ pipeline {
 | 
			
		||||
                        sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/development'
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                dir(BUILDDIR) {
 | 
			
		||||
                dir(BUILDDIR_LINUX) {
 | 
			
		||||
                    sshagent(credentials: ['documentation-buildfix']) {
 | 
			
		||||
                        sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/development'
 | 
			
		||||
                    }
 | 
			
		||||
@@ -116,7 +116,7 @@ pipeline {
 | 
			
		||||
                        sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/master'
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                dir(BUILDDIR) {
 | 
			
		||||
                dir(BUILDDIR_LINUX) {
 | 
			
		||||
                    sshagent(credentials: ['documentation-buildfix']) {
 | 
			
		||||
                        sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/master'
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										110
									
								
								scripts/check_release.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										110
									
								
								scripts/check_release.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,110 @@
 | 
			
		||||
#! /bin/python
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import argparse
 | 
			
		||||
import json
 | 
			
		||||
import urllib.request
 | 
			
		||||
import re
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
def main() -> None:
 | 
			
		||||
    parser = argparse.ArgumentParser(
 | 
			
		||||
        description="List undocumented PRs"
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument("-v", "--version", type=str, required=True)
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
    
 | 
			
		||||
    match = re.search("([0-9]+\.[0-9]+\.[0-9]+)", args.version)
 | 
			
		||||
    
 | 
			
		||||
    if not match:
 | 
			
		||||
        print("invalid version")
 | 
			
		||||
        exit(1)
 | 
			
		||||
    
 | 
			
		||||
    version = "v" + match.group(1)
 | 
			
		||||
    
 | 
			
		||||
    print("looking for milestone for " + version + " ...")
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    with urllib.request.urlopen("https://egit.irs.uni-stuttgart.de/api/v1/repos/fsfw/fsfw/milestones?name=" + version) as milestone_json:
 | 
			
		||||
        milestones = json.load(milestone_json)
 | 
			
		||||
        if (len(milestones) == 0):
 | 
			
		||||
            print("did not find any milestone")
 | 
			
		||||
            exit(1)
 | 
			
		||||
        if (len(milestones) > 1):
 | 
			
		||||
            print("found multiple milestons")
 | 
			
		||||
        milestone_title = milestones[0]['title']
 | 
			
		||||
        milestone = str(milestones[0]['id'])
 | 
			
		||||
        print("Using Milestone \""+ milestone_title + "\" with id " + milestone)
 | 
			
		||||
    
 | 
			
		||||
    milestone_prs = []
 | 
			
		||||
    
 | 
			
		||||
    page = 1
 | 
			
		||||
    last_count = 1;
 | 
			
		||||
    while last_count != 0:
 | 
			
		||||
        with urllib.request.urlopen("https://egit.irs.uni-stuttgart.de/api/v1/repos/fsfw/fsfw/pulls?state=closed&milestone=" + str(milestone) + "&limit=100&page=" + str(page)) as pull_requests_json:
 | 
			
		||||
            pull_requests = json.load(pull_requests_json)
 | 
			
		||||
            for pr in pull_requests:
 | 
			
		||||
                milestone_prs.append({'number': str(pr['number']), 'title' : pr['title']})
 | 
			
		||||
            page += 1
 | 
			
		||||
            last_count = len(pull_requests)
 | 
			
		||||
    
 | 
			
		||||
    print("Found " + str(len(milestone_prs)) + " closed PRs in Milestone")
 | 
			
		||||
    
 | 
			
		||||
    print("looking for CHANGELOG.md ...")
 | 
			
		||||
    
 | 
			
		||||
    path = Path(".")
 | 
			
		||||
    
 | 
			
		||||
    files = list(path.glob("CHANGELOG.md"))
 | 
			
		||||
    
 | 
			
		||||
    if (len(files) != 1):
 | 
			
		||||
        files = list(path.glob("../CHANGELOG.md"))
 | 
			
		||||
        
 | 
			
		||||
    if (len(files) != 1):
 | 
			
		||||
        print("did not find CHANGELOG.md. Run script in either root directory or scripts subfolder.")
 | 
			
		||||
        exit(1)
 | 
			
		||||
        
 | 
			
		||||
    print("Scanning CHANGELOG.md ...")
 | 
			
		||||
    
 | 
			
		||||
    changelog_prs = []
 | 
			
		||||
    
 | 
			
		||||
    with open(files[0]) as changelog:
 | 
			
		||||
        line = changelog.readline()
 | 
			
		||||
        while (line):
 | 
			
		||||
            #print("line: " + line)
 | 
			
		||||
            match = re.search("\#.+(v[0-9]+\.[0-9]+\.[0-9]+)", line)
 | 
			
		||||
            if (match):
 | 
			
		||||
                if match.group(1) == version:
 | 
			
		||||
                    #print("found version")
 | 
			
		||||
                    line = changelog.readline()
 | 
			
		||||
                    continue
 | 
			
		||||
                else:
 | 
			
		||||
                    #print("done with " + match.group(1))
 | 
			
		||||
                    break
 | 
			
		||||
            
 | 
			
		||||
            match = re.search("PR: https://egit\.irs\.uni-stuttgart\.de/fsfw/fsfw/pulls/([0-9]+)", line)
 | 
			
		||||
            if match:
 | 
			
		||||
                changelog_prs.append(match.group(1))
 | 
			
		||||
                
 | 
			
		||||
            line = changelog.readline()
 | 
			
		||||
    
 | 
			
		||||
    print("Found " + str(len(changelog_prs)) + " PRs in CHANGELOG.md")
 | 
			
		||||
    
 | 
			
		||||
    print("")
 | 
			
		||||
    
 | 
			
		||||
    copy_array = changelog_prs.copy()
 | 
			
		||||
    print("PRs in CHANGELOG.md that are not in Milestone:")
 | 
			
		||||
    for pr in milestone_prs:
 | 
			
		||||
        if pr['number'] in copy_array:
 | 
			
		||||
            copy_array.remove(pr['number'])
 | 
			
		||||
    for pr in copy_array:
 | 
			
		||||
        print("https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/" + pr)
 | 
			
		||||
 | 
			
		||||
    print("")
 | 
			
		||||
 | 
			
		||||
    print("PRs in milestone that are not in CHANGELOG.md:")
 | 
			
		||||
    
 | 
			
		||||
    for pr in milestone_prs:
 | 
			
		||||
        if pr['number'] not in changelog_prs:
 | 
			
		||||
            print("- " + pr['title'] + "\n  PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/" + pr['number'])
 | 
			
		||||
 | 
			
		||||
main()
 | 
			
		||||
@@ -59,17 +59,24 @@ void ActionHelper::setQueueToUse(MessageQueueIF* queue) { queueToUse = queue; }
 | 
			
		||||
 | 
			
		||||
void ActionHelper::prepareExecution(MessageQueueId_t commandedBy, ActionId_t actionId,
 | 
			
		||||
                                    store_address_t dataAddress) {
 | 
			
		||||
  bool hasAdditionalData = false;
 | 
			
		||||
  const uint8_t* dataPtr = nullptr;
 | 
			
		||||
  size_t size = 0;
 | 
			
		||||
  ReturnValue_t result = ipcStore->getData(dataAddress, &dataPtr, &size);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    CommandMessage reply;
 | 
			
		||||
    ActionMessage::setStepReply(&reply, actionId, 0, result);
 | 
			
		||||
    queueToUse->sendMessage(commandedBy, &reply);
 | 
			
		||||
    return;
 | 
			
		||||
  ReturnValue_t result;
 | 
			
		||||
  if (dataAddress != store_address_t::invalid()) {
 | 
			
		||||
    hasAdditionalData = true;
 | 
			
		||||
    ReturnValue_t result = ipcStore->getData(dataAddress, &dataPtr, &size);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      CommandMessage reply;
 | 
			
		||||
      ActionMessage::setStepReply(&reply, actionId, 0, result);
 | 
			
		||||
      queueToUse->sendMessage(commandedBy, &reply);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  result = owner->executeAction(actionId, commandedBy, dataPtr, size);
 | 
			
		||||
  ipcStore->deleteData(dataAddress);
 | 
			
		||||
  if (hasAdditionalData) {
 | 
			
		||||
    ipcStore->deleteData(dataAddress);
 | 
			
		||||
  }
 | 
			
		||||
  if (result == HasActionsIF::EXECUTION_FINISHED) {
 | 
			
		||||
    CommandMessage reply;
 | 
			
		||||
    ActionMessage::setCompletionReply(&reply, actionId, true, result);
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,8 @@ class CommandActionHelper {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit CommandActionHelper(CommandsActionsIF* owner);
 | 
			
		||||
  virtual ~CommandActionHelper();
 | 
			
		||||
  ReturnValue_t commandAction(object_id_t commandTo, ActionId_t actionId, const uint8_t* data,
 | 
			
		||||
                              uint32_t size);
 | 
			
		||||
  ReturnValue_t commandAction(object_id_t commandTo, ActionId_t actionId,
 | 
			
		||||
                              const uint8_t* data = nullptr, uint32_t size = 0);
 | 
			
		||||
  ReturnValue_t commandAction(object_id_t commandTo, ActionId_t actionId, SerializeIF* data);
 | 
			
		||||
  ReturnValue_t initialize();
 | 
			
		||||
  ReturnValue_t handleReply(CommandMessage* reply);
 | 
			
		||||
 
 | 
			
		||||
@@ -51,8 +51,9 @@ class VarLenField : public SerializeIF {
 | 
			
		||||
    return os;
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded above, so this is needed to uncofuse the
 | 
			
		||||
                                   // compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ ReturnValue_t HeaderCreator::serialize(uint8_t **buffer, size_t *size, size_t ma
 | 
			
		||||
  *buffer += 1;
 | 
			
		||||
  **buffer = pduDataFieldLen & 0x00ff;
 | 
			
		||||
  *buffer += 1;
 | 
			
		||||
  **buffer = segmentationCtrl << 7 | pduConf.sourceId.getWidth() << 4 | segmentMetadataFlag << 3 |
 | 
			
		||||
             pduConf.seqNum.getWidth();
 | 
			
		||||
  **buffer = segmentationCtrl << 7 | ((pduConf.sourceId.getWidth() - 1) << 4) |
 | 
			
		||||
             segmentMetadataFlag << 3 | (pduConf.seqNum.getWidth() - 1);
 | 
			
		||||
  *buffer += 1;
 | 
			
		||||
  *size += 4;
 | 
			
		||||
  ReturnValue_t result = pduConf.sourceId.serialize(buffer, size, maxSize, streamEndianness);
 | 
			
		||||
 
 | 
			
		||||
@@ -78,11 +78,11 @@ cfdp::SegmentationControl PduHeaderReader::getSegmentationControl() const {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cfdp::WidthInBytes PduHeaderReader::getLenEntityIds() const {
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>((pointers.fixedHeader->fourthByte >> 4) & 0x07);
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>(((pointers.fixedHeader->fourthByte >> 4) & 0b111) + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cfdp::WidthInBytes PduHeaderReader::getLenSeqNum() const {
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>(pointers.fixedHeader->fourthByte & 0x07);
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>((pointers.fixedHeader->fourthByte & 0b111) + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cfdp::SegmentMetadataFlag PduHeaderReader::getSegmentMetadataFlag() const {
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,8 @@ class EntityIdTlv : public TlvIF {
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t deSerialize(cfdp::Tlv& tlv, Endianness endianness);
 | 
			
		||||
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,8 @@ class FilestoreResponseTlv : public cfdp::FilestoreTlvBase {
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t deSerialize(const cfdp::Tlv& tlv, Endianness endianness);
 | 
			
		||||
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ template <typename T, size_t MAX_SIZE, typename count_t = uint8_t>
 | 
			
		||||
class FixedArrayList : public ArrayList<T, count_t> {
 | 
			
		||||
  static_assert(MAX_SIZE <= std::numeric_limits<count_t>::max(),
 | 
			
		||||
                "count_t is not large enough to hold MAX_SIZE");
 | 
			
		||||
  static_assert(MAX_SIZE > 0, "MAX_SIZE is 0");
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  T data[MAX_SIZE];
 | 
			
		||||
 
 | 
			
		||||
@@ -155,8 +155,8 @@ class FixedMap : public SerializeIF {
 | 
			
		||||
 | 
			
		||||
  uint32_t maxSize() const { return theMap.maxSize(); }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    ReturnValue_t result =
 | 
			
		||||
        SerializeAdapter::serialize(&this->_size, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
    uint32_t i = 0;
 | 
			
		||||
@@ -170,7 +170,7 @@ class FixedMap : public SerializeIF {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    uint32_t printSize = sizeof(_size);
 | 
			
		||||
    uint32_t i = 0;
 | 
			
		||||
 | 
			
		||||
@@ -182,8 +182,8 @@ class FixedMap : public SerializeIF {
 | 
			
		||||
    return printSize;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    ReturnValue_t result =
 | 
			
		||||
        SerializeAdapter::deSerialize(&this->_size, buffer, size, streamEndianness);
 | 
			
		||||
    if (this->_size > theMap.maxSize()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,8 @@ class PoolDataSetBase : public PoolDataSetIF, public SerializeIF {
 | 
			
		||||
   * - @c SET_WAS_ALREADY_READ if read() is called twice without calling
 | 
			
		||||
   *      commit() in between
 | 
			
		||||
   */
 | 
			
		||||
  virtual ReturnValue_t read(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
 | 
			
		||||
                             uint32_t lockTimeout = 20) override;
 | 
			
		||||
  ReturnValue_t read(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
 | 
			
		||||
                     uint32_t lockTimeout = 20) override;
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	The commit call initializes writing back the registered variables.
 | 
			
		||||
   * @details
 | 
			
		||||
@@ -84,15 +84,15 @@ class PoolDataSetBase : public PoolDataSetIF, public SerializeIF {
 | 
			
		||||
   * 			- @c COMMITING_WITHOUT_READING if set was not read yet and
 | 
			
		||||
   * 			  contains non write-only variables
 | 
			
		||||
   */
 | 
			
		||||
  virtual ReturnValue_t commit(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
 | 
			
		||||
                               uint32_t lockTimeout = 20) override;
 | 
			
		||||
  ReturnValue_t commit(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
 | 
			
		||||
                       uint32_t lockTimeout = 20) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Register the passed pool variable instance into the data set.
 | 
			
		||||
   * @param variable
 | 
			
		||||
   * @return
 | 
			
		||||
   */
 | 
			
		||||
  virtual ReturnValue_t registerVariable(PoolVariableIF* variable) override;
 | 
			
		||||
  ReturnValue_t registerVariable(PoolVariableIF* variable) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Provides the means to lock the underlying data structure to ensure
 | 
			
		||||
 
 | 
			
		||||
@@ -87,9 +87,9 @@ class LocalPoolVariable : public LocalPoolObjectBase {
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          SerializeIF::Endianness streamEndianness) const override;
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	This is a call to read the array's values
 | 
			
		||||
 
 | 
			
		||||
@@ -98,11 +98,11 @@ class LocalPoolVector : public LocalPoolObjectBase {
 | 
			
		||||
  T& operator[](size_t i);
 | 
			
		||||
  const T& operator[](size_t i) const;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, const size_t maxSize,
 | 
			
		||||
                                  SerializeIF::Endianness streamEndiannes) const override;
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, const size_t maxSize,
 | 
			
		||||
                          SerializeIF::Endianness streamEndiannes) const override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	This is a call to read the array's values
 | 
			
		||||
 
 | 
			
		||||
@@ -15,11 +15,12 @@ const LocalPool::LocalPoolConfig EventManager::poolConfig = {
 | 
			
		||||
    {fsfwconfig::FSFW_EVENTMGMT_EVENTIDMATCHERS, sizeof(EventIdRangeMatcher)},
 | 
			
		||||
    {fsfwconfig::FSFW_EVENTMGMR_RANGEMATCHERS, sizeof(ReporterRangeMatcher)}};
 | 
			
		||||
 | 
			
		||||
EventManager::EventManager(object_id_t setObjectId)
 | 
			
		||||
EventManager::EventManager(object_id_t setObjectId, uint32_t eventQueueDepth)
 | 
			
		||||
    : SystemObject(setObjectId), factoryBackend(0, poolConfig, false, true) {
 | 
			
		||||
  mutex = MutexFactory::instance()->createMutex();
 | 
			
		||||
  eventReportQueue = QueueFactory::instance()->createMessageQueue(MAX_EVENTS_PER_CYCLE,
 | 
			
		||||
                                                                  EventMessage::EVENT_MESSAGE_SIZE);
 | 
			
		||||
  auto mqArgs = MqArgs(setObjectId, static_cast<void*>(this));
 | 
			
		||||
  eventReportQueue = QueueFactory::instance()->createMessageQueue(
 | 
			
		||||
      eventQueueDepth, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EventManager::~EventManager() {
 | 
			
		||||
@@ -47,9 +48,20 @@ ReturnValue_t EventManager::performOperation(uint8_t opCode) {
 | 
			
		||||
 | 
			
		||||
void EventManager::notifyListeners(EventMessage* message) {
 | 
			
		||||
  lockMutex();
 | 
			
		||||
  for (auto iter = listenerList.begin(); iter != listenerList.end(); ++iter) {
 | 
			
		||||
    if (iter->second.match(message)) {
 | 
			
		||||
      MessageQueueSenderIF::sendMessage(iter->first, message, message->getSender());
 | 
			
		||||
  for (auto& listener : listenerList) {
 | 
			
		||||
    if (listener.second.match(message)) {
 | 
			
		||||
      ReturnValue_t result =
 | 
			
		||||
          MessageQueueSenderIF::sendMessage(listener.first, message, message->getSender());
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
        sif::error << std::hex << "EventManager::notifyListeners: MSG to 0x" << std::setfill('0')
 | 
			
		||||
                   << std::setw(8) << listener.first << " failed with result 0x" << std::setw(4)
 | 
			
		||||
                   << result << std::setfill(' ') << std::endl;
 | 
			
		||||
#else
 | 
			
		||||
        sif::printError("Sending message to listener 0x%08x failed with result %04x\n",
 | 
			
		||||
                        listener.first, result);
 | 
			
		||||
#endif
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  unlockMutex();
 | 
			
		||||
@@ -200,4 +212,19 @@ void EventManager::printUtility(sif::OutputTypes printType, EventMessage* messag
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EventManager::printListeners() {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
  sif::info << "Event manager listener MQ IDs:" << std::setfill('0') << std::hex << std::endl;
 | 
			
		||||
  for (auto& listener : listenerList) {
 | 
			
		||||
    sif::info << "0x" << std::setw(8) << listener.first << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  sif::info << std::dec << std::setfill(' ');
 | 
			
		||||
#else
 | 
			
		||||
  sif::printInfo("Event manager listener MQ IDs:\n");
 | 
			
		||||
  for (auto& listener : listenerList) {
 | 
			
		||||
    sif::printInfo("0x%08x\n", listener.first);
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* FSFW_OBJ_EVENT_TRANSLATION == 1 */
 | 
			
		||||
 
 | 
			
		||||
@@ -21,9 +21,7 @@ extern const char* translateEvents(Event event);
 | 
			
		||||
 | 
			
		||||
class EventManager : public EventManagerIF, public ExecutableObjectIF, public SystemObject {
 | 
			
		||||
 public:
 | 
			
		||||
  static const uint16_t MAX_EVENTS_PER_CYCLE = 80;
 | 
			
		||||
 | 
			
		||||
  EventManager(object_id_t setObjectId);
 | 
			
		||||
  EventManager(object_id_t setObjectId, uint32_t eventQueueDepth);
 | 
			
		||||
  virtual ~EventManager();
 | 
			
		||||
 | 
			
		||||
  void setMutexTimeout(MutexIF::TimeoutType timeoutType, uint32_t timeoutMs);
 | 
			
		||||
@@ -44,6 +42,7 @@ class EventManager : public EventManagerIF, public ExecutableObjectIF, public Sy
 | 
			
		||||
                                          object_id_t reporterFrom = 0, object_id_t reporterTo = 0,
 | 
			
		||||
                                          bool reporterInverted = false);
 | 
			
		||||
  ReturnValue_t performOperation(uint8_t opCode);
 | 
			
		||||
  void printListeners();
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  MessageQueueIF* eventReportQueue = nullptr;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ enum : uint8_t {
 | 
			
		||||
  CDH = 28,
 | 
			
		||||
  TCS_1 = 59,
 | 
			
		||||
  PCDU_1 = 42,
 | 
			
		||||
  PCDU_2 = 43,
 | 
			
		||||
  POWER_SWITCH_IF = 43,
 | 
			
		||||
  HEATER = 50,
 | 
			
		||||
  T_SENSORS = 52,
 | 
			
		||||
  FDIR = 70,
 | 
			
		||||
@@ -33,6 +33,7 @@ enum : uint8_t {
 | 
			
		||||
  PUS_SERVICE_23 = 103,
 | 
			
		||||
  MGM_LIS3MDL = 106,
 | 
			
		||||
  MGM_RM3100 = 107,
 | 
			
		||||
  CFDP = 108,
 | 
			
		||||
 | 
			
		||||
  FW_SUBSYSTEM_ID_RANGE
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -44,13 +44,13 @@ class Type : public SerializeIF {
 | 
			
		||||
 | 
			
		||||
  static ActualType_t getActualType(uint8_t ptc, uint8_t pfc);
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const override;
 | 
			
		||||
  ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override;
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness) override;
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  ActualType_t actualType;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,8 @@
 | 
			
		||||
#include "HealthTableIF.h"
 | 
			
		||||
 | 
			
		||||
class HealthTable : public HealthTableIF, public SystemObject {
 | 
			
		||||
  friend class CServiceHealthCommanding;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  explicit HealthTable(object_id_t objectid);
 | 
			
		||||
  ~HealthTable() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -54,8 +54,8 @@ class HousekeepingSnapshot : public SerializeIF {
 | 
			
		||||
  HousekeepingSnapshot(uint8_t* timeStamp, size_t timeStampSize, LocalPoolObjectBase* dataSetPtr)
 | 
			
		||||
      : timeStamp(timeStamp), timeStampSize(timeStampSize), updateData(dataSetPtr){};
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const {
 | 
			
		||||
    if (timeStamp != nullptr) {
 | 
			
		||||
      /* Endianness will always be MACHINE, so we can simply use memcpy
 | 
			
		||||
      here. */
 | 
			
		||||
@@ -70,15 +70,15 @@ class HousekeepingSnapshot : public SerializeIF {
 | 
			
		||||
    return updateData->serialize(buffer, size, maxSize, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const {
 | 
			
		||||
  size_t getSerializedSize() const {
 | 
			
		||||
    if (updateData == nullptr) {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return timeStampSize + updateData->getSerializedSize();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
    if (*size < timeStampSize) {
 | 
			
		||||
      return SerializeIF::STREAM_TOO_SHORT;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -32,9 +32,9 @@ class AbsLimitMonitor : public MonitorBase<T> {
 | 
			
		||||
    return returnvalue::OK;  // We're not out of range.
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t getParameter(uint8_t domainId, uint16_t parameterId,
 | 
			
		||||
                                     ParameterWrapper *parameterWrapper,
 | 
			
		||||
                                     const ParameterWrapper *newValues, uint16_t startAtIndex) {
 | 
			
		||||
  ReturnValue_t getParameter(uint8_t domainId, uint8_t parameterId,
 | 
			
		||||
                             ParameterWrapper *parameterWrapper, const ParameterWrapper *newValues,
 | 
			
		||||
                             uint16_t startAtIndex) override {
 | 
			
		||||
    ReturnValue_t result = this->MonitorBase<T>::getParameter(
 | 
			
		||||
        domainId, parameterId, parameterWrapper, newValues, startAtIndex);
 | 
			
		||||
    // We'll reuse the DOMAIN_ID of MonitorReporter,
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ class MonitoringMessage : public CommandMessage {
 | 
			
		||||
  static const Command_t LIMIT_VIOLATION_REPORT = MAKE_COMMAND_ID(10);
 | 
			
		||||
  virtual ~MonitoringMessage();
 | 
			
		||||
  static void setLimitViolationReport(CommandMessage* message, store_address_t storeId);
 | 
			
		||||
  using CommandMessage::clear;
 | 
			
		||||
  static void clear(CommandMessage* message);
 | 
			
		||||
  static store_address_t getStoreId(const CommandMessage* message);
 | 
			
		||||
  static void setTypicalMessage(CommandMessage* message, Command_t type, store_address_t storeId);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,8 @@ int TcpIpBase::closeSocket(socket_t socket) {
 | 
			
		||||
  return closesocket(socket);
 | 
			
		||||
#elif defined(PLATFORM_UNIX)
 | 
			
		||||
  return close(socket);
 | 
			
		||||
#else
 | 
			
		||||
  return -1;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -48,5 +50,7 @@ int TcpIpBase::getLastSocketError() {
 | 
			
		||||
  return WSAGetLastError();
 | 
			
		||||
#elif defined(PLATFORM_UNIX)
 | 
			
		||||
  return errno;
 | 
			
		||||
#else
 | 
			
		||||
  return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,9 +16,9 @@
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
TcpTmTcBridge::TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination, object_id_t tmStoreId,
 | 
			
		||||
                             object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("TCP TMTC Bridge", objectId, tcDestination, tmStoreId, tcStoreId) {
 | 
			
		||||
TcpTmTcBridge::TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
                             uint32_t msgQueueDepth, object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("TCP TMTC Bridge", objectId, tcDestination, msgQueueDepth, tmStoreId, tcStoreId) {
 | 
			
		||||
  mutex = MutexFactory::instance()->createMutex();
 | 
			
		||||
  // Connection is always up, TM is requested by connecting to server and receiving packets
 | 
			
		||||
  registerCommConnect();
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ class TcpTmTcBridge : public TmTcBridge {
 | 
			
		||||
   * @param tmStoreId TM store object ID. It is recommended to the default object ID
 | 
			
		||||
   * @param tcStoreId TC store object ID. It is recommended to the default object ID
 | 
			
		||||
   */
 | 
			
		||||
  TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
  TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination, uint32_t msgQueueDepth,
 | 
			
		||||
                object_id_t tmStoreId = objects::TM_STORE,
 | 
			
		||||
                object_id_t tcStoreId = objects::TC_STORE);
 | 
			
		||||
  virtual ~TcpTmTcBridge();
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,6 @@ class TcpTmTcServer : public SystemObject, public TcpIpBase, public ExecutableOb
 | 
			
		||||
     * https://man7.org/linux/man-pages/man7/socket.7.html for more details.
 | 
			
		||||
     */
 | 
			
		||||
    bool reusePort = false;
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
  enum class ReceptionModes { SPACE_PACKETS };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,9 @@
 | 
			
		||||
const std::string UdpTmTcBridge::DEFAULT_SERVER_PORT = tcpip::DEFAULT_SERVER_PORT;
 | 
			
		||||
 | 
			
		||||
UdpTmTcBridge::UdpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
                             const std::string &udpServerPort_, object_id_t tmStoreId,
 | 
			
		||||
                             object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("UDP TMTC Bridge", objectId, tcDestination, tmStoreId, tcStoreId) {
 | 
			
		||||
                             uint32_t msgQueueDepth, const std::string &udpServerPort_,
 | 
			
		||||
                             object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("UDP TMTC Bridge", objectId, tcDestination, msgQueueDepth, tmStoreId, tcStoreId) {
 | 
			
		||||
  if (udpServerPort_.empty()) {
 | 
			
		||||
    udpServerPort = DEFAULT_SERVER_PORT;
 | 
			
		||||
  } else {
 | 
			
		||||
@@ -126,10 +126,7 @@ ReturnValue_t UdpTmTcBridge::sendTm(const uint8_t *data, size_t dataLen) {
 | 
			
		||||
    tcpip::handleError(tcpip::Protocol::UDP, tcpip::ErrorSources::SENDTO_CALL);
 | 
			
		||||
  }
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1 && FSFW_UDP_SEND_WIRETAPPING_ENABLED == 1
 | 
			
		||||
  sif::debug << "TmTcUdpBridge::sendTm: " << bytesSent
 | 
			
		||||
             << " bytes were"
 | 
			
		||||
                " sent."
 | 
			
		||||
             << std::endl;
 | 
			
		||||
  sif::debug << "TmTcUdpBridge::sendTm: " << bytesSent << " bytes were sent" << std::endl;
 | 
			
		||||
#endif
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ class UdpTmTcBridge : public TmTcBridge, public TcpIpBase {
 | 
			
		||||
  /* The ports chosen here should not be used by any other process. */
 | 
			
		||||
  static const std::string DEFAULT_SERVER_PORT;
 | 
			
		||||
 | 
			
		||||
  UdpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
  UdpTmTcBridge(object_id_t objectId, object_id_t tcDestination, uint32_t msgQueueDepth,
 | 
			
		||||
                const std::string& udpServerPort = "", object_id_t tmStoreId = objects::TM_STORE,
 | 
			
		||||
                object_id_t tcStoreId = objects::TC_STORE);
 | 
			
		||||
  ~UdpTmTcBridge() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
#include <condition_variable>
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/objectmanager/ObjectManagerIF.h"
 | 
			
		||||
#include "fsfw/tasks/FixedSlotSequence.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
#include <condition_variable>
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/objectmanager/ObjectManagerIF.h"
 | 
			
		||||
#include "fsfw/tasks/PeriodicTaskBase.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
#include <fsfw/returnvalues/returnvalue.h>
 | 
			
		||||
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace tasks {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -76,14 +76,17 @@ timeval Clock::getUptime() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t Clock::getUptime(timeval* uptime) {
 | 
			
		||||
  // TODO This is not posix compatible and delivers only seconds precision
 | 
			
		||||
  //  Linux specific file read but more precise.
 | 
			
		||||
  double uptimeSeconds;
 | 
			
		||||
  if (std::ifstream("/proc/uptime", std::ios::in) >> uptimeSeconds) {
 | 
			
		||||
  std::ifstream ifile("/proc/uptime");
 | 
			
		||||
  if (ifile.bad()) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
  if (ifile >> uptimeSeconds) {
 | 
			
		||||
    uptime->tv_sec = uptimeSeconds;
 | 
			
		||||
    uptime->tv_usec = uptimeSeconds * (double)1e6 - (uptime->tv_sec * 1e6);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
  return returnvalue::FAILED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Wait for new FSFW Clock function delivering seconds uptime.
 | 
			
		||||
 
 | 
			
		||||
@@ -19,13 +19,13 @@ class CpuUsage : public SerializeIF {
 | 
			
		||||
    float timeRunning;
 | 
			
		||||
    float percentUsage;
 | 
			
		||||
 | 
			
		||||
    virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                    Endianness streamEndianness) const override;
 | 
			
		||||
    ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                            Endianness streamEndianness) const override;
 | 
			
		||||
 | 
			
		||||
    virtual size_t getSerializedSize() const override;
 | 
			
		||||
    size_t getSerializedSize() const override;
 | 
			
		||||
 | 
			
		||||
    virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                      Endianness streamEndianness) override;
 | 
			
		||||
    ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                              Endianness streamEndianness) override;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  CpuUsage();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
#include "fsfw/osal/rtems/BinarySemaphore.h"
 | 
			
		||||
//#include "fsfw/osal/rtems/CountingSemaphore.h"
 | 
			
		||||
// #include "fsfw/osal/rtems/CountingSemaphore.h"
 | 
			
		||||
 | 
			
		||||
#include "fsfw/serviceinterface/ServiceInterface.h"
 | 
			
		||||
#include "fsfw/tasks/SemaphoreFactory.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -40,13 +40,15 @@ class ParameterWrapper : public SerializeIF {
 | 
			
		||||
  ParameterWrapper(Type type, uint8_t rows, uint8_t columns, const void *data);
 | 
			
		||||
  virtual ~ParameterWrapper();
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const override;
 | 
			
		||||
  ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override;
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness) override;
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness, uint16_t startWritingAtIndex = 0);
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ class Fuse : public SystemObject,
 | 
			
		||||
    gp_id_t poolIdPower;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PCDU_1;
 | 
			
		||||
  static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::POWER_SWITCH_IF;
 | 
			
		||||
  //! PSS detected that current on a fuse is totally out of bounds.
 | 
			
		||||
  static const Event FUSE_CURRENT_HIGH = MAKE_EVENT(1, severity::LOW);
 | 
			
		||||
  //! PSS detected a fuse that went off.
 | 
			
		||||
 
 | 
			
		||||
@@ -28,10 +28,12 @@ class PowerSwitchIF {
 | 
			
		||||
  static const ReturnValue_t SWITCH_TIMEOUT = MAKE_RETURN_CODE(2);
 | 
			
		||||
  static const ReturnValue_t FUSE_ON = MAKE_RETURN_CODE(3);
 | 
			
		||||
  static const ReturnValue_t FUSE_OFF = MAKE_RETURN_CODE(4);
 | 
			
		||||
  static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PCDU_2;
 | 
			
		||||
  static const Event SWITCH_WENT_OFF = MAKE_EVENT(
 | 
			
		||||
      0, severity::LOW);  //!< Someone detected that a switch went off which shouldn't. Severity:
 | 
			
		||||
                          //!< Low, Parameter1: switchId1, Parameter2: switchId2
 | 
			
		||||
  static const ReturnValue_t SWITCH_UNKNOWN = MAKE_RETURN_CODE(5);
 | 
			
		||||
 | 
			
		||||
  static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::POWER_SWITCH_IF;
 | 
			
		||||
  //!< Someone detected that a switch went off which shouldn't. Severity:
 | 
			
		||||
  //!< Low, Parameter1: switchId1, Parameter2: switchId2
 | 
			
		||||
  static const Event SWITCH_WENT_OFF = MAKE_EVENT(0, severity::LOW);
 | 
			
		||||
  /**
 | 
			
		||||
   * send a direct command to the Power Unit to enable/disable the specified switch.
 | 
			
		||||
   *
 | 
			
		||||
@@ -50,6 +52,7 @@ class PowerSwitchIF {
 | 
			
		||||
   * @return
 | 
			
		||||
   *     - @c SWITCH_ON if the specified switch is on.
 | 
			
		||||
   *     - @c SWITCH_OFF if the specified switch is off.
 | 
			
		||||
   *     - @c SWITCH_UNKNOWN if the state of the specified switch is unknown.
 | 
			
		||||
   *     - @c returnvalue::FAILED if an error occured
 | 
			
		||||
   */
 | 
			
		||||
  virtual ReturnValue_t getSwitchState(power::Switch_t switchNr) const = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,4 +9,4 @@ target_sources(
 | 
			
		||||
          Service17Test.cpp
 | 
			
		||||
          Service20ParameterManagement.cpp
 | 
			
		||||
          CService200ModeCommanding.cpp
 | 
			
		||||
          CService201HealthCommanding.cpp)
 | 
			
		||||
          CServiceHealthCommanding.cpp)
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@ ReturnValue_t CService200ModeCommanding::isValidSubservice(uint8_t subservice) {
 | 
			
		||||
    case (Subservice::COMMAND_MODE_COMMAND):
 | 
			
		||||
    case (Subservice::COMMAND_MODE_READ):
 | 
			
		||||
    case (Subservice::COMMAND_MODE_ANNOUNCE):
 | 
			
		||||
    case (Subservice::COMMAND_MODE_ANNOUNCE_RECURSIVELY):
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    default:
 | 
			
		||||
      return AcceptsTelecommandsIF::INVALID_SUBSERVICE;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,106 +0,0 @@
 | 
			
		||||
#include "fsfw/pus/CService201HealthCommanding.h"
 | 
			
		||||
 | 
			
		||||
#include "fsfw/health/HasHealthIF.h"
 | 
			
		||||
#include "fsfw/health/HealthMessage.h"
 | 
			
		||||
#include "fsfw/objectmanager/ObjectManager.h"
 | 
			
		||||
#include "fsfw/pus/servicepackets/Service201Packets.h"
 | 
			
		||||
#include "fsfw/serviceinterface/ServiceInterface.h"
 | 
			
		||||
 | 
			
		||||
CService201HealthCommanding::CService201HealthCommanding(object_id_t objectId, uint16_t apid,
 | 
			
		||||
                                                         uint8_t serviceId,
 | 
			
		||||
                                                         uint8_t numParallelCommands,
 | 
			
		||||
                                                         uint16_t commandTimeoutSeconds)
 | 
			
		||||
    : CommandingServiceBase(objectId, apid, "PUS 201 Health MGMT", serviceId, numParallelCommands,
 | 
			
		||||
                            commandTimeoutSeconds) {}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CService201HealthCommanding::isValidSubservice(uint8_t subservice) {
 | 
			
		||||
  switch (subservice) {
 | 
			
		||||
    case (Subservice::COMMAND_SET_HEALTH):
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH):
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH_ALL):
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    default:
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
      sif::error << "Invalid Subservice" << std::endl;
 | 
			
		||||
#endif
 | 
			
		||||
      return AcceptsTelecommandsIF::INVALID_SUBSERVICE;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CService201HealthCommanding::getMessageQueueAndObject(uint8_t subservice,
 | 
			
		||||
                                                                    const uint8_t *tcData,
 | 
			
		||||
                                                                    size_t tcDataLen,
 | 
			
		||||
                                                                    MessageQueueId_t *id,
 | 
			
		||||
                                                                    object_id_t *objectId) {
 | 
			
		||||
  if (tcDataLen < sizeof(object_id_t)) {
 | 
			
		||||
    return CommandingServiceBase::INVALID_TC;
 | 
			
		||||
  }
 | 
			
		||||
  SerializeAdapter::deSerialize(objectId, &tcData, &tcDataLen, SerializeIF::Endianness::BIG);
 | 
			
		||||
 | 
			
		||||
  return checkInterfaceAndAcquireMessageQueue(id, objectId);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CService201HealthCommanding::checkInterfaceAndAcquireMessageQueue(
 | 
			
		||||
    MessageQueueId_t *messageQueueToSet, const object_id_t *objectId) {
 | 
			
		||||
  auto *destination = ObjectManager::instance()->get<HasHealthIF>(*objectId);
 | 
			
		||||
  if (destination == nullptr) {
 | 
			
		||||
    return CommandingServiceBase::INVALID_OBJECT;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  *messageQueueToSet = destination->getCommandQueue();
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CService201HealthCommanding::prepareCommand(CommandMessage *message,
 | 
			
		||||
                                                          uint8_t subservice, const uint8_t *tcData,
 | 
			
		||||
                                                          size_t tcDataLen, uint32_t *state,
 | 
			
		||||
                                                          object_id_t objectId) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  switch (subservice) {
 | 
			
		||||
    case (Subservice::COMMAND_SET_HEALTH): {
 | 
			
		||||
      HealthSetCommand healthCommand;
 | 
			
		||||
      result = healthCommand.deSerialize(&tcData, &tcDataLen, SerializeIF::Endianness::BIG);
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      HealthMessage::setHealthMessage(message, HealthMessage::HEALTH_SET,
 | 
			
		||||
                                      healthCommand.getHealth());
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH): {
 | 
			
		||||
      HealthMessage::setHealthMessage(message, HealthMessage::HEALTH_ANNOUNCE);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH_ALL): {
 | 
			
		||||
      HealthMessage::setHealthMessage(message, HealthMessage::HEALTH_ANNOUNCE_ALL);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    default: {
 | 
			
		||||
      // Should never happen, subservice was already checked
 | 
			
		||||
      result = returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CService201HealthCommanding::handleReply(const CommandMessage *reply,
 | 
			
		||||
                                                       Command_t previousCommand, uint32_t *state,
 | 
			
		||||
                                                       CommandMessage *optionalNextCommand,
 | 
			
		||||
                                                       object_id_t objectId, bool *isStep) {
 | 
			
		||||
  Command_t replyId = reply->getCommand();
 | 
			
		||||
  if (replyId == HealthMessage::REPLY_HEALTH_SET) {
 | 
			
		||||
    return EXECUTION_COMPLETE;
 | 
			
		||||
  } else if (replyId == CommandMessageIF::REPLY_REJECTED) {
 | 
			
		||||
    return reply->getReplyRejectedReason();
 | 
			
		||||
  }
 | 
			
		||||
  return CommandingServiceBase::INVALID_REPLY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Not used for now, health state already reported by event
 | 
			
		||||
[[maybe_unused]] ReturnValue_t CService201HealthCommanding::prepareHealthSetReply(
 | 
			
		||||
    const CommandMessage *reply) {
 | 
			
		||||
  auto health = static_cast<uint8_t>(HealthMessage::getHealth(reply));
 | 
			
		||||
  auto oldHealth = static_cast<uint8_t>(HealthMessage::getOldHealth(reply));
 | 
			
		||||
  HealthSetReply healthSetReply(health, oldHealth);
 | 
			
		||||
  return sendTmPacket(Subservice::REPLY_HEALTH_SET, healthSetReply);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										161
									
								
								src/fsfw/pus/CServiceHealthCommanding.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								src/fsfw/pus/CServiceHealthCommanding.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,161 @@
 | 
			
		||||
#include <fsfw/events/EventManagerIF.h>
 | 
			
		||||
#include <fsfw/pus/CServiceHealthCommanding.h>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/health/HasHealthIF.h"
 | 
			
		||||
#include "fsfw/health/HealthMessage.h"
 | 
			
		||||
#include "fsfw/objectmanager/ObjectManager.h"
 | 
			
		||||
#include "fsfw/pus/servicepackets/Service201Packets.h"
 | 
			
		||||
#include "fsfw/serviceinterface/ServiceInterface.h"
 | 
			
		||||
 | 
			
		||||
CServiceHealthCommanding::CServiceHealthCommanding(HealthServiceCfg args)
 | 
			
		||||
    : CommandingServiceBase(args.objectId, args.apid, "PUS 201 Health MGMT", args.service,
 | 
			
		||||
                            args.numParallelCommands, args.commandTimeoutSeconds),
 | 
			
		||||
      healthTableId(args.table),
 | 
			
		||||
      maxNumHealthInfoPerCycle(args.maxNumHealthInfoPerCycle) {}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CServiceHealthCommanding::initialize() {
 | 
			
		||||
  ReturnValue_t result = CommandingServiceBase::initialize();
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  healthTable = ObjectManager::instance()->get<HealthTable>(healthTableId);
 | 
			
		||||
  if (healthTable == nullptr) {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CServiceHealthCommanding::isValidSubservice(uint8_t subservice) {
 | 
			
		||||
  switch (subservice) {
 | 
			
		||||
    case (Subservice::COMMAND_SET_HEALTH):
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH):
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH_ALL):
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    default:
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
      sif::error << "Invalid Subservice" << std::endl;
 | 
			
		||||
#endif
 | 
			
		||||
      return AcceptsTelecommandsIF::INVALID_SUBSERVICE;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CServiceHealthCommanding::getMessageQueueAndObject(uint8_t subservice,
 | 
			
		||||
                                                                 const uint8_t *tcData,
 | 
			
		||||
                                                                 size_t tcDataLen,
 | 
			
		||||
                                                                 MessageQueueId_t *id,
 | 
			
		||||
                                                                 object_id_t *objectId) {
 | 
			
		||||
  switch (subservice) {
 | 
			
		||||
    case (Subservice::COMMAND_SET_HEALTH):
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH): {
 | 
			
		||||
      if (tcDataLen < sizeof(object_id_t)) {
 | 
			
		||||
        return CommandingServiceBase::INVALID_TC;
 | 
			
		||||
      }
 | 
			
		||||
      SerializeAdapter::deSerialize(objectId, &tcData, &tcDataLen, SerializeIF::Endianness::BIG);
 | 
			
		||||
 | 
			
		||||
      return checkInterfaceAndAcquireMessageQueue(id, objectId);
 | 
			
		||||
    }
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH_ALL): {
 | 
			
		||||
      return returnvalue::OK;
 | 
			
		||||
    }
 | 
			
		||||
    default: {
 | 
			
		||||
      return returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CServiceHealthCommanding::checkInterfaceAndAcquireMessageQueue(
 | 
			
		||||
    MessageQueueId_t *messageQueueToSet, const object_id_t *objectId) {
 | 
			
		||||
  auto *destination = ObjectManager::instance()->get<HasHealthIF>(*objectId);
 | 
			
		||||
  if (destination == nullptr) {
 | 
			
		||||
    return CommandingServiceBase::INVALID_OBJECT;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  *messageQueueToSet = destination->getCommandQueue();
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CServiceHealthCommanding::prepareCommand(CommandMessage *message, uint8_t subservice,
 | 
			
		||||
                                                       const uint8_t *tcData, size_t tcDataLen,
 | 
			
		||||
                                                       uint32_t *state, object_id_t objectId) {
 | 
			
		||||
  ReturnValue_t result = returnvalue::OK;
 | 
			
		||||
  switch (subservice) {
 | 
			
		||||
    case (Subservice::COMMAND_SET_HEALTH): {
 | 
			
		||||
      if (tcDataLen != sizeof(object_id_t) + sizeof(HasHealthIF::HealthState)) {
 | 
			
		||||
        return CommandingServiceBase::INVALID_TC;
 | 
			
		||||
      }
 | 
			
		||||
      HealthSetCommand healthCommand;
 | 
			
		||||
      result = healthCommand.deSerialize(&tcData, &tcDataLen, SerializeIF::Endianness::BIG);
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      HealthMessage::setHealthMessage(message, HealthMessage::HEALTH_SET,
 | 
			
		||||
                                      healthCommand.getHealth());
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH): {
 | 
			
		||||
      HealthMessage::setHealthMessage(message, HealthMessage::HEALTH_ANNOUNCE);
 | 
			
		||||
      return CommandingServiceBase::EXECUTION_COMPLETE;
 | 
			
		||||
    }
 | 
			
		||||
    case (Subservice::COMMAND_ANNOUNCE_HEALTH_ALL): {
 | 
			
		||||
      ReturnValue_t result = iterateHealthTable(true);
 | 
			
		||||
      if (result == returnvalue::OK) {
 | 
			
		||||
        reportAllHealth = true;
 | 
			
		||||
        return EXECUTION_COMPLETE;
 | 
			
		||||
      }
 | 
			
		||||
      return result;
 | 
			
		||||
    }
 | 
			
		||||
    default: {
 | 
			
		||||
      // Should never happen, subservice was already checked
 | 
			
		||||
      result = returnvalue::FAILED;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CServiceHealthCommanding::handleReply(const CommandMessage *reply,
 | 
			
		||||
                                                    Command_t previousCommand, uint32_t *state,
 | 
			
		||||
                                                    CommandMessage *optionalNextCommand,
 | 
			
		||||
                                                    object_id_t objectId, bool *isStep) {
 | 
			
		||||
  Command_t replyId = reply->getCommand();
 | 
			
		||||
  if (replyId == HealthMessage::REPLY_HEALTH_SET) {
 | 
			
		||||
    return EXECUTION_COMPLETE;
 | 
			
		||||
  } else if (replyId == CommandMessageIF::REPLY_REJECTED) {
 | 
			
		||||
    return reply->getReplyRejectedReason();
 | 
			
		||||
  }
 | 
			
		||||
  return CommandingServiceBase::INVALID_REPLY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CServiceHealthCommanding::doPeriodicOperation() {
 | 
			
		||||
  if (reportAllHealth) {
 | 
			
		||||
    for (uint8_t i = 0; i < maxNumHealthInfoPerCycle; i++) {
 | 
			
		||||
      ReturnValue_t result = iterateHealthTable(false);
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
        reportAllHealth = false;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Not used for now, health state already reported by event
 | 
			
		||||
[[maybe_unused]] ReturnValue_t CServiceHealthCommanding::prepareHealthSetReply(
 | 
			
		||||
    const CommandMessage *reply) {
 | 
			
		||||
  auto health = static_cast<uint8_t>(HealthMessage::getHealth(reply));
 | 
			
		||||
  auto oldHealth = static_cast<uint8_t>(HealthMessage::getOldHealth(reply));
 | 
			
		||||
  HealthSetReply healthSetReply(health, oldHealth);
 | 
			
		||||
  return sendTmPacket(Subservice::REPLY_HEALTH_SET, healthSetReply);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ReturnValue_t CServiceHealthCommanding::iterateHealthTable(bool reset) {
 | 
			
		||||
  std::pair<object_id_t, HasHealthIF::HealthState> pair;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t result = healthTable->iterate(&pair, reset);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    return result;
 | 
			
		||||
  } else {
 | 
			
		||||
    EventManagerIF::triggerEvent(pair.first, HasHealthIF::HEALTH_INFO, pair.second, pair.second);
 | 
			
		||||
    return returnvalue::OK;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,8 +1,26 @@
 | 
			
		||||
#ifndef FSFW_PUS_CSERVICE201HEALTHCOMMANDING_H_
 | 
			
		||||
#define FSFW_PUS_CSERVICE201HEALTHCOMMANDING_H_
 | 
			
		||||
 | 
			
		||||
#include <fsfw/health/HealthTable.h>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/tmtcservices/CommandingServiceBase.h"
 | 
			
		||||
 | 
			
		||||
struct HealthServiceCfg {
 | 
			
		||||
  HealthServiceCfg(object_id_t objectId, uint16_t apid, object_id_t healthTable,
 | 
			
		||||
                   uint16_t maxNumHealthInfoPerCycle)
 | 
			
		||||
      : objectId(objectId),
 | 
			
		||||
        apid(apid),
 | 
			
		||||
        table(healthTable),
 | 
			
		||||
        maxNumHealthInfoPerCycle(maxNumHealthInfoPerCycle) {}
 | 
			
		||||
  object_id_t objectId;
 | 
			
		||||
  uint16_t apid;
 | 
			
		||||
  object_id_t table;
 | 
			
		||||
  uint16_t maxNumHealthInfoPerCycle;
 | 
			
		||||
  uint8_t service = 201;
 | 
			
		||||
  uint8_t numParallelCommands = 4;
 | 
			
		||||
  uint16_t commandTimeoutSeconds = 60;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief   Custom PUS service to set health of all objects
 | 
			
		||||
 *          implementing hasHealthIF.
 | 
			
		||||
@@ -17,11 +35,12 @@
 | 
			
		||||
 * child class like this service
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
class CService201HealthCommanding : public CommandingServiceBase {
 | 
			
		||||
class CServiceHealthCommanding : public CommandingServiceBase {
 | 
			
		||||
 public:
 | 
			
		||||
  CService201HealthCommanding(object_id_t objectId, uint16_t apid, uint8_t serviceId,
 | 
			
		||||
                              uint8_t numParallelCommands = 4, uint16_t commandTimeoutSeconds = 60);
 | 
			
		||||
  ~CService201HealthCommanding() override = default;
 | 
			
		||||
  CServiceHealthCommanding(HealthServiceCfg args);
 | 
			
		||||
  ~CServiceHealthCommanding() override = default;
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t initialize() override;
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  /* CSB abstract function implementations */
 | 
			
		||||
@@ -37,7 +56,14 @@ class CService201HealthCommanding : public CommandingServiceBase {
 | 
			
		||||
                            CommandMessage *optionalNextCommand, object_id_t objectId,
 | 
			
		||||
                            bool *isStep) override;
 | 
			
		||||
 | 
			
		||||
  void doPeriodicOperation() override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  const object_id_t healthTableId;
 | 
			
		||||
  HealthTable *healthTable;
 | 
			
		||||
  uint16_t maxNumHealthInfoPerCycle = 0;
 | 
			
		||||
  bool reportAllHealth = false;
 | 
			
		||||
  ReturnValue_t iterateHealthTable(bool reset);
 | 
			
		||||
  static ReturnValue_t checkInterfaceAndAcquireMessageQueue(MessageQueueId_t *MessageQueueToSet,
 | 
			
		||||
                                                            const object_id_t *objectId);
 | 
			
		||||
 | 
			
		||||
@@ -2,12 +2,12 @@
 | 
			
		||||
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/globalfunctions/CRC.h"
 | 
			
		||||
#include "fsfw/objectmanager/ObjectManager.h"
 | 
			
		||||
#include "fsfw/serialize/SerializeAdapter.h"
 | 
			
		||||
#include "fsfw/serviceinterface.h"
 | 
			
		||||
#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h"
 | 
			
		||||
#include "fsfw/tmtcpacket/pus/tc/PusTcIF.h"
 | 
			
		||||
#include "fsfw/globalfunctions/CRC.h"
 | 
			
		||||
#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h"
 | 
			
		||||
 | 
			
		||||
static constexpr auto DEF_END = SerializeIF::Endianness::BIG;
 | 
			
		||||
 | 
			
		||||
@@ -180,7 +180,7 @@ inline ReturnValue_t Service11TelecommandScheduling<MAX_NUM_TCS>::doInsertActivi
 | 
			
		||||
  if (CRC::crc16ccitt(data, size) != 0) {
 | 
			
		||||
    return CONTAINED_TC_CRC_MISSMATCH;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // store currentPacket and receive the store address
 | 
			
		||||
  store_address_t addr{};
 | 
			
		||||
  if (tcStore->addData(&addr, data, size) != returnvalue::OK ||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ class EventReport : public SerializeIF {  //!< [EXPORT] : [SUBSERVICE] 1, 2, 3,
 | 
			
		||||
        parameter1(parameter1_),
 | 
			
		||||
        parameter2(parameter2_) {}
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  SerializeIF::Endianness streamEndianness) const override {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          SerializeIF::Endianness streamEndianness) const override {
 | 
			
		||||
    ReturnValue_t result =
 | 
			
		||||
        SerializeAdapter::serialize(&reportId, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
@@ -46,7 +46,7 @@ class EventReport : public SerializeIF {  //!< [EXPORT] : [SUBSERVICE] 1, 2, 3,
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    uint32_t size = 0;
 | 
			
		||||
    size += SerializeAdapter::getSerializedSize(&reportId);
 | 
			
		||||
    size += SerializeAdapter::getSerializedSize(&objectId);
 | 
			
		||||
@@ -55,8 +55,8 @@ class EventReport : public SerializeIF {  //!< [EXPORT] : [SUBSERVICE] 1, 2, 3,
 | 
			
		||||
    return size;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,11 +10,11 @@
 | 
			
		||||
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
// RMAP command bits
 | 
			
		||||
//#define RMAP_COMMAND_BIT_INCREMENT	2
 | 
			
		||||
//#define RMAP_COMMAND_BIT_REPLY		3
 | 
			
		||||
//#define RMAP_COMMAND_BIT_WRITE		5
 | 
			
		||||
//#define RMAP_COMMAND_BIT_VERIFY		4
 | 
			
		||||
//#define RMAP_COMMAND_BIT			6
 | 
			
		||||
// #define RMAP_COMMAND_BIT_INCREMENT	2
 | 
			
		||||
// #define RMAP_COMMAND_BIT_REPLY		3
 | 
			
		||||
// #define RMAP_COMMAND_BIT_WRITE		5
 | 
			
		||||
// #define RMAP_COMMAND_BIT_VERIFY		4
 | 
			
		||||
// #define RMAP_COMMAND_BIT			6
 | 
			
		||||
 | 
			
		||||
namespace RMAPIds {
 | 
			
		||||
 | 
			
		||||
@@ -32,14 +32,14 @@ static const uint8_t RMAP_COMMAND_READ = ((1 << RMAP_COMMAND_BIT) | (1 << RMAP_C
 | 
			
		||||
static const uint8_t RMAP_REPLY_WRITE =
 | 
			
		||||
    ((1 << RMAP_COMMAND_BIT_WRITE) | (1 << RMAP_COMMAND_BIT_REPLY));
 | 
			
		||||
static const uint8_t RMAP_REPLY_READ = ((1 << RMAP_COMMAND_BIT_REPLY));
 | 
			
		||||
//#define RMAP_COMMAND_WRITE			((1<<RMAP_COMMAND_BIT) | (1<<RMAP_COMMAND_BIT_WRITE)
 | 
			
		||||
// #define RMAP_COMMAND_WRITE			((1<<RMAP_COMMAND_BIT) | (1<<RMAP_COMMAND_BIT_WRITE)
 | 
			
		||||
//| (1<<RMAP_COMMAND_BIT_REPLY)) #define RMAP_COMMAND_WRITE_VERIFY	((1<<RMAP_COMMAND_BIT) |
 | 
			
		||||
//(1<<RMAP_COMMAND_BIT_WRITE) | (1<<RMAP_COMMAND_BIT_REPLY) | (1<<RMAP_COMMAND_BIT_VERIFY)) #define
 | 
			
		||||
// RMAP_COMMAND_READ			((1<<RMAP_COMMAND_BIT) | (1<<RMAP_COMMAND_BIT_REPLY))
 | 
			
		||||
//  RMAP_COMMAND_READ			((1<<RMAP_COMMAND_BIT) | (1<<RMAP_COMMAND_BIT_REPLY))
 | 
			
		||||
 | 
			
		||||
//#define RMAP_REPLY_WRITE			((1<<RMAP_COMMAND_BIT_WRITE) |
 | 
			
		||||
// #define RMAP_REPLY_WRITE			((1<<RMAP_COMMAND_BIT_WRITE) |
 | 
			
		||||
//(1<<RMAP_COMMAND_BIT_REPLY))
 | 
			
		||||
//#define RMAP_REPLY_WRITE_VERIFY		((1<<RMAP_COMMAND_BIT_WRITE) |
 | 
			
		||||
// #define RMAP_REPLY_WRITE_VERIFY		((1<<RMAP_COMMAND_BIT_WRITE) |
 | 
			
		||||
//(1<<RMAP_COMMAND_BIT_REPLY) | (1<<RMAP_COMMAND_BIT_VERIFY)) #define RMAP_REPLY_READ
 | 
			
		||||
//((1<<RMAP_COMMAND_BIT_REPLY))
 | 
			
		||||
 | 
			
		||||
@@ -49,9 +49,9 @@ static const uint8_t RMAP_COMMAND_HEADER_LEN = 16;
 | 
			
		||||
static const uint8_t RMAP_WRITE_REPLY_HEADER_LEN = 8;
 | 
			
		||||
static const uint8_t RMAP_READ_REPLY_HEADER_LEN = 12;
 | 
			
		||||
static const uint8_t RMAP_DATA_FOOTER_SIZE = 1;  // SIZE OF CRC
 | 
			
		||||
//#define RMAP_COMMAND_HEADER_LEN		16
 | 
			
		||||
//#define RMAP_WRITE_REPLY_HEADER_LEN	8
 | 
			
		||||
//#define RMAP_READ_REPLY_HEADER_LEN	12
 | 
			
		||||
// #define RMAP_COMMAND_HEADER_LEN		16
 | 
			
		||||
// #define RMAP_WRITE_REPLY_HEADER_LEN	8
 | 
			
		||||
// #define RMAP_READ_REPLY_HEADER_LEN	12
 | 
			
		||||
 | 
			
		||||
}  // namespace RMAPIds
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,10 @@ class SerialArrayListAdapter : public SerializeIF {
 | 
			
		||||
 public:
 | 
			
		||||
  SerialArrayListAdapter(ArrayList<T, count_t>* adaptee) : adaptee(adaptee) {}
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  using SerializeIF::serialize;  // we overload this function as well, so this is needed to uncofuse
 | 
			
		||||
                                 // the compiler
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    return serialize(adaptee, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -34,7 +36,7 @@ class SerialArrayListAdapter : public SerializeIF {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const { return getSerializedSize(adaptee); }
 | 
			
		||||
  size_t getSerializedSize() const override { return getSerializedSize(adaptee); }
 | 
			
		||||
 | 
			
		||||
  static uint32_t getSerializedSize(const ArrayList<T, count_t>* list) {
 | 
			
		||||
    uint32_t printSize = sizeof(count_t);
 | 
			
		||||
@@ -47,8 +49,10 @@ class SerialArrayListAdapter : public SerializeIF {
 | 
			
		||||
    return printSize;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) {
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overload this function as well, so this is needed to
 | 
			
		||||
                                   // uncofuse the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    return deSerialize(adaptee, buffer, size, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -45,8 +45,10 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
  SerialLinkedListAdapter(bool printCount = false)
 | 
			
		||||
      : SinglyLinkedList<T>(), printCount(printCount) {}
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const override {
 | 
			
		||||
  using SerializeIF::serialize;  // we overloaded this function, so this is needed to unconfuse the
 | 
			
		||||
                                 // compiler
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    if (printCount) {
 | 
			
		||||
      count_t mySize = SinglyLinkedList<T>::getSize();
 | 
			
		||||
      ReturnValue_t result =
 | 
			
		||||
@@ -68,7 +70,7 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    if (printCount) {
 | 
			
		||||
      return SerialLinkedListAdapter<T>::getSerializedSize() + sizeof(count_t);
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -76,6 +78,8 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  static size_t getSerializedSize(const LinkedElement<T>* element) {
 | 
			
		||||
    size_t size = 0;
 | 
			
		||||
    while (element != nullptr) {
 | 
			
		||||
@@ -85,8 +89,8 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
    return size;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    return deSerialize(SinglyLinkedList<T>::start, buffer, size, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,8 +32,8 @@ class SerializeElement : public SerializeIF, public LinkedElement<SerializeIF> {
 | 
			
		||||
 | 
			
		||||
  size_t getSerializedSize() const override { return SerializeAdapter::getSerializedSize(&entry); }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    return SerializeAdapter::deSerialize(&entry, buffer, size, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,8 +15,8 @@ class ModeListEntry : public SerializeIF, public LinkedElement<ModeListEntry> {
 | 
			
		||||
  uint8_t value3 = 0;
 | 
			
		||||
  uint8_t value4 = 0;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    ReturnValue_t result;
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::serialize(&value1, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
@@ -40,12 +40,12 @@ class ModeListEntry : public SerializeIF, public LinkedElement<ModeListEntry> {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    return sizeof(value1) + sizeof(value2) + sizeof(value3) + sizeof(value4);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    ReturnValue_t result;
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&value1, buffer, size, streamEndianness);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ struct PusTmParams {
 | 
			
		||||
              size_t dataLen)
 | 
			
		||||
      : secHeader(service, subservice, timeStamper), adapter(data, dataLen), sourceData(&adapter) {}
 | 
			
		||||
  PusTmSecHeader secHeader;
 | 
			
		||||
  SerialBufferAdapter<uint8_t> adapter;
 | 
			
		||||
  SerialBufferAdapter<size_t> adapter;
 | 
			
		||||
  const SerializeIF* sourceData = nullptr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
#define TMTCBRIDGE_WIRETAPPING 0
 | 
			
		||||
 | 
			
		||||
TmTcBridge::TmTcBridge(const char* name, object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
                       object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
                       uint32_t msgQueueDepth, object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
    : SystemObject(objectId),
 | 
			
		||||
      name(name),
 | 
			
		||||
      tmStoreId(tmStoreId),
 | 
			
		||||
@@ -18,7 +18,7 @@ TmTcBridge::TmTcBridge(const char* name, object_id_t objectId, object_id_t tcDes
 | 
			
		||||
{
 | 
			
		||||
  auto mqArgs = MqArgs(objectId, static_cast<void*>(this));
 | 
			
		||||
  tmTcReceptionQueue = QueueFactory::instance()->createMessageQueue(
 | 
			
		||||
      TMTC_RECEPTION_QUEUE_DEPTH, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs);
 | 
			
		||||
      msgQueueDepth, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TmTcBridge::~TmTcBridge() { QueueFactory::instance()->deleteMessageQueue(tmTcReceptionQueue); }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ class TmTcBridge : public AcceptsTelemetryIF,
 | 
			
		||||
                   public ExecutableObjectIF,
 | 
			
		||||
                   public SystemObject {
 | 
			
		||||
 public:
 | 
			
		||||
  static constexpr uint8_t TMTC_RECEPTION_QUEUE_DEPTH = 20;
 | 
			
		||||
  static constexpr uint8_t LIMIT_STORED_DATA_SENT_PER_CYCLE = 15;
 | 
			
		||||
  static constexpr unsigned int LIMIT_DOWNLINK_PACKETS_STORED = 500;
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +22,7 @@ class TmTcBridge : public AcceptsTelemetryIF,
 | 
			
		||||
  static constexpr uint8_t DEFAULT_DOWNLINK_PACKETS_STORED = 10;
 | 
			
		||||
 | 
			
		||||
  TmTcBridge(const char* name, object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
             object_id_t tmStoreId, object_id_t tcStoreId);
 | 
			
		||||
             uint32_t msgQueueDepth, object_id_t tmStoreId, object_id_t tcStoreId);
 | 
			
		||||
  ~TmTcBridge() override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
#include "version.h"
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/FSFWVersion.h"
 | 
			
		||||
 | 
			
		||||
@@ -20,7 +21,7 @@ fsfw::Version::Version(int major, int minor, int revision, const char* addInfo)
 | 
			
		||||
 | 
			
		||||
void fsfw::Version::getVersion(char* str, size_t maxLen) const {
 | 
			
		||||
  size_t len = snprintf(str, maxLen, "%d.%d.%d", major, minor, revision);
 | 
			
		||||
  if (addInfo != nullptr) {
 | 
			
		||||
  if (addInfo != nullptr and std::strcmp(addInfo, "") != 0) {
 | 
			
		||||
    snprintf(str + len, maxLen - len, "-%s", addInfo);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -30,7 +31,7 @@ namespace fsfw {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
std::ostream& operator<<(std::ostream& os, const Version& v) {
 | 
			
		||||
  os << v.major << "." << v.minor << "." << v.revision;
 | 
			
		||||
  if (v.addInfo != nullptr) {
 | 
			
		||||
  if (v.addInfo != nullptr and std::strcmp(v.addInfo, "") != 0) {
 | 
			
		||||
    os << "-" << v.addInfo;
 | 
			
		||||
  }
 | 
			
		||||
  return os;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@
 | 
			
		||||
 */
 | 
			
		||||
void Factory::produceFrameworkObjects(void* args) {
 | 
			
		||||
  setStaticFrameworkObjectIds();
 | 
			
		||||
  new EventManager(objects::EVENT_MANAGER);
 | 
			
		||||
  new EventManager(objects::EVENT_MANAGER, 80);
 | 
			
		||||
  new HealthTable(objects::HEALTH_TABLE);
 | 
			
		||||
  new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
      REQUIRE(creator.serialize(&serTarget, &serSize, serBuf.size(),
 | 
			
		||||
                                SerializeIF::Endianness::BIG) == returnvalue::OK);
 | 
			
		||||
      CHECK(serBuf[0] == 0x3f);
 | 
			
		||||
      CHECK(serBuf[3] == 0x99);
 | 
			
		||||
      CHECK(serBuf[3] == 0x88);
 | 
			
		||||
      REQUIRE(creator.getCrcFlag() == true);
 | 
			
		||||
      REQUIRE(creator.getDirection() == cfdp::Direction::TOWARDS_SENDER);
 | 
			
		||||
      REQUIRE(creator.getLargeFileFlag() == true);
 | 
			
		||||
@@ -127,7 +127,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
      REQUIRE(creator.getTransmissionMode() == cfdp::TransmissionMode::UNACKNOWLEDGED);
 | 
			
		||||
      REQUIRE(creator.getSegmentationControl() == true);
 | 
			
		||||
      // Last three bits are 2 now (length of seq number) and bit 1 to bit 3 is 4 (len entity IDs)
 | 
			
		||||
      REQUIRE(serBuf[3] == 0b11001010);
 | 
			
		||||
      REQUIRE(serBuf[3] == 0b10111001);
 | 
			
		||||
      uint32_t entityId = 0;
 | 
			
		||||
      size_t deSerSize = 0;
 | 
			
		||||
      SerializeAdapter::deSerialize(&entityId, serBuf.data() + 4, &deSerSize,
 | 
			
		||||
@@ -175,7 +175,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 0);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    // Source ID
 | 
			
		||||
    REQUIRE(serBuf[4] == 0);
 | 
			
		||||
    // Transaction Seq Number
 | 
			
		||||
@@ -220,7 +220,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 0);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    REQUIRE(serSize == 7);
 | 
			
		||||
    // Deser call not strictly necessary
 | 
			
		||||
    auto reader = PduHeaderReader(serBuf.data(), serBuf.size());
 | 
			
		||||
@@ -270,7 +270,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
    REQUIRE(reader.parseData() == returnvalue::OK);
 | 
			
		||||
    // Everything except version bit flipped to one now
 | 
			
		||||
    REQUIRE(serBuf[0] == 0x3f);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b11001010);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b10111001);
 | 
			
		||||
    REQUIRE(reader.getWholePduSize() == 14);
 | 
			
		||||
 | 
			
		||||
    REQUIRE(reader.getCrcFlag() == true);
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ TEST_CASE("File Data PDU", "[cfdp][pdu]") {
 | 
			
		||||
    // Bits 1 to 3 length of enitity IDs is 2
 | 
			
		||||
    // Bit 4: Segment metadata flag is set
 | 
			
		||||
    // Bit 5 to seven: length of transaction seq num is 2
 | 
			
		||||
    REQUIRE(fileDataBuffer[3] == 0b10101010);
 | 
			
		||||
    REQUIRE(fileDataBuffer[3] == 0b10011001);
 | 
			
		||||
    REQUIRE((fileDataBuffer[10] >> 6) &
 | 
			
		||||
            0b11 == cfdp::RecordContinuationState::CONTAINS_START_AND_END);
 | 
			
		||||
    // Segment metadata length
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ TEST_CASE("CFDP File Directive", "[cfdp][pdu]") {
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 5);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    // Source ID
 | 
			
		||||
    REQUIRE(serBuf[4] == 0);
 | 
			
		||||
    // Transaction Seq Number
 | 
			
		||||
@@ -82,4 +82,4 @@ TEST_CASE("CFDP File Directive", "[cfdp][pdu]") {
 | 
			
		||||
    // Invalid file directive
 | 
			
		||||
    REQUIRE(fdDeser.parseData() == cfdp::INVALID_DIRECTIVE_FIELD);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,8 +33,8 @@ TEST_CASE("CFDP Base", "[cfdp]") {
 | 
			
		||||
    // PDU data field length is 5 (4 + Directive code octet)
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 5);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large, value minus one is stored
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    // Source ID
 | 
			
		||||
    REQUIRE(serBuf[4] == 0);
 | 
			
		||||
    // Transaction Seq Number
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user